LookerのPython SDKによる各ユーザーのお気に入りコンテンツを取得する方法(アドミン権限必須)
“Show Content”ボタンをクリックすると該当の画像が見えます
背景:
ユーザーのお気に入りコンテンツを管理する必要があったりします。
例えば、既存のコンテンツを削減したい時に、どれを削除するかとか・・またはコンテンツを改善するときにどのユーザーが旧ダッシュボードを利用しているかを把握して知らせたい時とか。
しかし、Lookerのお気に入りコンテンツの詳細を取得することが困難で、非常に制限されております。通常のユーザーであれば自分のお気に入りコンテンツしか見れないことがわかるけど・・・アドミンでも結局自分のお気に入りコンテンツしか見れません。ただし、アドミン権限があれば、打開策があります。
方法:
まずは、アドミン権限を持った上で、APIのIDとシークレットを作ります。
その後、自分自身の開発環境を構築し、手始めます。 (リンクを開けない場合は下記に画像もございます。)
上記のリンクにて自分の完成の開発環境とイシューの打開策を共有しておりますが、続きましょう。
LookerのApi Explorerを使い、お気に入りコンテンツに関するSDKを検索・試しても、すぐに「自分自身のユーザー」のお気に入りコンテンツしか取得できないことに気づきます。そのためにアドミン権限が必要になります。打開策は、各ユーザーにログインし、ユーザー自身の個人のお気に入りコンテンツを取得し、結合することです。
SDKの内訳:
お気に入りコンテンツのリスト作成には下記の過程が必要です:
- インスタンスのユーザーのリストを作成
- ダッシュボード(またはボード・ルック等)のリストを作成
- 本ユーザーのお気に入りコンテンツを取得するファンクションを作成
- 各ユーザーにログインし、3のファンクションを実行するループを作成
開発環境の構築 (画像付き):
画像が大きいので、デフォルトで非表示化されております。見たい時は”Show content”をクリックしてください。
環境を操作する前に、ご自身のgDriveにコピーすることを推奨します。ただし、ノートブックに書くものは他のユーザーは閲覧することができません。
環境作りに二つのフェーズがあります。1つ目はSDKを立ち上げること、2つ目はコードを書くことです。
SDK立ち上げセクションを開きますと、コードがいくつかのパートに分割されています。それぞれのパートの右側に自分の環境に合うように値を編集できるようになってます。
上記のパラメタを自分の環境に編集したら (注意:base_url/client_id/client_secretのみが必須)SDKを叩き始めます。
したがって、私はPythonが得意訳ではないので、ベターな方法があると思います。ぜひわかればコメントの方で教えてください(いいねとシェアもお願いしますw)
上記の仮定リストから借りて
-
インスタンスのユーザーのリストを作成
user_list = dict() users = sdk.all_users() for user in users: if user['email'] and not user['is_disabled']: #@markdown emailがついていないユーザーと無効になっているユーザーを省きます user_list[user['email']] = user['id'] print(user_list)SDK立ち上げのコードはあくまでも設定だけで、正しくログインしてSDK叩けるかを保証していません。そのために一つ目のSDKコールではエラーが生じるかもしれません。その際はURL/ID/Secretに誤りないかを確認し、エラーが解消されてから続けます。
問題がなければuser_listが作成されます。また、下記画像のように閲覧して中身を確認することもできます。 -
ダッシュボード(またはボード・ルック等)のリストを作成
dashboard_list = dict() dashboards = sdk.all_dashboards() for dashboard in dashboards: if dashboard['content_metadata_id']: #@markdown content_metadata_idがないダッシュボードを省きます dashboard_list[dashboard['title']] = dashboard['content_metadata_id'] print(dashboard_list)1と同じ方法で正しくダッシュボードリストが作成されていることを確認できます。
-
本ユーザーのお気に入りコンテンツを取得するファンクションを作成
favorited_content = dict() def retrieve_favorite_content(): #@markdown まずはファクションを作り、のちに各ユーザでループします for k,v in dashboard_list.items(): response = sdk.search_content_favorites(content_metadata_id=v) if response: email = [k for k,v in user_list.items() if v == response[0]['user_id']][0] #読みやすいようにuser_idをemailに変更します。 dashboard = [k for k,v in dashboard_list.items() if v == response[0]['content_metadata_id']][0] #読みやすいようにcontent_metadata_idをダッシュボード名に変更します if email in favorited_content: #すでにお気にりコンテンツがある場合に既存重のに追加します favorited_content[email].append(dashboard) else: #すでにお気に入りコンテンツがない場合に新しく追加します favorited_content[email] = [] favorited_content[email].append(dashboard) -
各ユーザーにログインし、3のファンクションを実行するループを作成
for k,v in user_list.items(): sdk.auth.logout() #SDKを途中でやめた場合に初めにlogoutしなければ進めません sudo_auth = sdk.login_user(v) sdk.auth.login_user(v) retrieve_favorite_content() print(favorited_content) 実行時間が非常に長いです・・私の環境では30分間かかりました。ただし、ユーザー・ダッシュボード等のコンテンツ数により拡大にふえるでしょう。しかし、途中でも正しくユーザーとお気に入りコンテンツを下記の画像のように確認することができます。
終わりに:
上記のプロセスの立ち上げには数分以上かからないと思いますが・・SDK叩き自体は残念ながら非常に時間がかかります。各ユーザーにログインしてから各コンテンツにクエリーしているからです。より早い方法はあると思いますので、誰かが見つかったらコメントで教えてほしいですね ?
現状のプロセスでは最後にfavorited_contentsというdictが存在しますが、それをさまざまな方法でファイルに出力できます。