イントロダクション
Piano Insight ユーザアカウントと対応するAPIキーを利用すればバックエンドのCGIスクリプトからPiano InsightのAPIを介して殆どのデータを照会できます。しかし、同じアプローチはフロントエンドのWebページから行うことはできません。WebページにユーザアカウントとAPIキーがある状態で誰でもこれを見れるようになってしまうと、そのユーザの権限で利用できる全ての操作が出来てしまいますし、悪用されることも懸念されます。
これを防ぐためにPiano InsightのAPIを登録し、その登録したIDを利用してWebページからAPIを実行することができます。これをPersistedクエリIDと呼びます。このIDは予め登録されたAPI以外の機能を実行させることはできません。下記の図はAPIキーとPersistedクエリIDでできる事の違いを表しています。APIキーはPersistedクエリ含めた、全ての機能に対してアクセス可能です。それに対してPersistedクエリIDは特定のAPIのみ実行可能となります。
このページに利用されているコードはHTML/Javascript と Python 3.xでの動作を想定しています。なお、Pythonが利用できない場合でもGUIを使用して全ての例を実行可能です(最終セクションの「Piano Admin GUIからの作成と管理」を参照ください)。
PersistedクエリIDはユーザーIDに紐づくものです。異動や退職によってその作成を行なったユーザーが削除された場合、設定されたイベントが送れなくなってしまいます。Persistedクエリを使用する場合は運用上のリスクを考慮して、できる限りPiano Insightの個人ユーザーIDで作成し利用するのではなく、グループアドレスやメールエイリアスなどのシステム用ユーザーを作成いただき、そのユーザーにて設定作業を行なってください。
Persistedクエリをコードで作成する方法
以下のスクリプトを使用して、任意のAPIコマンドをPersistedクエリとして登録できます。
※persistedクエリ作成のための権限付与が必要です(過去に作成されたことのあるユーザは既にこの権限をお持ちです)。詳しくは /persisted/create をご覧ください。
※具体的な作成方法は DMP eventのヘルパー関数 - sendEvent や DMP eventのヘルパー関数 - getUserSegmentIds() が参考になります。
クエリを作成するにあたって重要なパラメータは次の三つです。
-
コマンドパス (/some/command)
-
リクエストオブジェクト ({ "param1":"value1", "param2", "value2", "param3":"value3" })
-
Webページからの変更を指定できる可変パラメータ ({ "param1":True, "param3", True })
以下のスクリプトは、登録した機能/操作にアクセス可能なWebページで使用する為のpersistedクエリIDを返します。APIキーを参照するには APIキー確認方法 をご覧ください。
|
上記のスクリプトはこの先のセクションでも使用します。
Webページ上からPersistedクエリIDを利用する方法
上記のスクリプトで、下記例のpersistedクエリの設定を登録します。このクエリではAPI /siteを使用してアクセス権限のある全てのサイトの情報をリクエストします。
|
このクエリを登録するとPersistedクエリIDが発行されます。
例: bda7639f305555555c981f86ff46ab7e6014fb97
ここでは、アクセス権のあるすべてのサイトのデータが返されるように、発行されたIDをPiano InsightのJSONP呼び出しで使用します。JSONPのテンプレートは以下のようになります。
|
登録したコマンドパスとpersistedクエリIDは既に登録/発行済みです。以下のWebページのソースコードではコールバック関数listSitesを呼び出し、Piano Insightから受け取るJSONデータが表示されます。ブラウザにsrcで指定するurlを挿入して、ページを実装する前にJSONPがどのように呼び出されているか確認が出来ます。
|
コールバック関数は、下記の画像のようにアクセス可能な全てのサイト名を抽出してWebページに表示します。
この場合は全てのサイトがレスポンスに含まれています。特定のサイトに限定したい場合は、Persistedクエリを作る際にsiteIdまたはsiteIdsパラメータをリクエストオブジェクトに追加できます。
|
cX.jsonpRequest() 関数の利用
cx.jsライブラリ内のcX.jsonpRequest() 関数はJSONPリクエストより便利です。
固定された文字列ではなく、変数を使う事ができるようになります。
|
このWebページでは、JSONPの処理の時と同じ出力が表示されます。
異なる点は、cX.jsonpRequest()関数がリクエストから出力まで処理することです。
Webページからのリクエスト可能なオブジェクトパラメータを指定する
これまでの例ではWebページ(ユーザ)が何を返すかに対して影響を与える方法はありませんでした。persistedクエリは予め固定されている為に、リクエストを受け取るもしくは残すだけです。 次の例では、Webページ(ユーザー)がデータを取得するサイトを決定できるようにします。新しいPersistedクエリを作成する際にsiteIdをWebページからmutable (変更可能な)パラメータとして登録します。
|
このクエリをPython スクリプトで登録するとPersistedクエリIDが発行されます。
例: 31caec61462f60555556107384ad246dfe00d127
追加のパラメータを即座に提供するためのJSONPテンプレートは次のとおりです。
|
jsonデータはURLエンコードが必要です。
したがって、Webページの実際のJSONP呼び出し(この場合、サイトIDは9222302702321341959)は
次のようになります。
|
実際に利用されるWebページの例
これまでの例はポイントを解説するために最小限の解説のみとしていました。ここからはもう少し実際に利用されるような例を取り上げていきます。jqueryui.com のページではPiano Searchのサジェスト検索に近いクエリコンプリション(検索ワードの自動補完)の例があります。
実際のサンプルは ここからダウンロードできます。 下記にはサンプルコードの一部を記載します。ここではjQueryを使ってリクエストとレスポンスを処理します。
|
このコードが機能するには、2つの前提条件があります。
-
クエリコンプリーション辞書を作成してアップロードする必要があります。
-
辞書内検索はpersistedクエリを介して行う必要があります。
先ほど紹介したサンプルには辞書管理チュートリアル の通りアップロード可能な映画タイトルのクエリコンプリートの辞書ファイル(afi.json)が同梱されています(ファイル内のカスタマプリフィクスはご自身のサイトグループのものに変更してください)。persistedクエリの設定は次のようになります。 dictionaryIdは、辞書を作成した際に取得します。
|
下記の画像では入力した文字列を補完して候補のリストが表示されます。
特殊な例:DMP オーディエンスセグメント
DMPオーディエンスセグメントの抽出は、他のpersistedクエリより若干特殊なケースになります。 作成プロセスはまったく同じですが、Webページの使用方法はgetUserSegtmentId()というcx.jsライブラリ関数でサポートされています。以下はpersistedクエリの設定になります。
|
このクエリをPython スクリプトで登録するとPersistedクエリIDが発行されます。
例: 5d2c2ebfdbc41cc555551ae63fdd0b5516d812de
|
Piano Admin GUIからの作成と管理
Pythonでコードの作成を行わなくても、今までのセクションを実行可能です。 以下では、Persisted Query管理ページにアクセスする方法と、persistedクエリの作成/更新を作成します。
以下の画像は、これまでのセクションでPythonスクリプトを使用して作成したsiteIdを可変パラメータにしてサイト情報を取得するpersistedクエリの設定方法です。