コンテンツにスキップ

コンテキストエンリッチャー

Zarazコンテキストエンリッチャーは、Cloudflare Workerを使用してZaraz全体で使用されるコンテキストを変更または強化するためのツールです。コンテキストエンリッチャーを使用すると、クライアントおよびシステム変数にアクセスできます。

Workerの作成

コンテキストエンリッチャーを使用するには、まず新しいCloudflare Workerを作成する必要があります。これをCloudflareダッシュボードを通じて行うか、Wranglerを使用して行うことができます。

Cloudflareダッシュボードで新しいWorkerを作成するには:

  1. Cloudflareダッシュボードにログインします。
  2. Workers & Pagesに移動し、アプリケーションを作成を選択します。
  3. Workerに名前を付け、デプロイを選択します。
  4. コードを編集を選択します。

これで「Hello world」と応答する基本的なWorkerが作成されました。このWorkerをコンテキストエンリッチャーとして機能させるには、コンテキストを返すようにコードを変更する必要があります:

export default {
async fetch(request, env, ctx) {
const { system, client } = await request.json();
// ここでシステムまたはクライアントオブジェクトを変更します。
/*
例えば、国を架空の「海賊の島」("PI")に変更するには、次のようにします:
system.device.location.country = 'PI';
*/
return new Response(JSON.stringify({ system, client }));
},
};

さまざまなユースケースのより完全な例については、引き続きお読みいただくか、Zarazコンテキストを参照してください。

コンテキストエンリッチャーの設定

Workerが公開されたので、Zaraz設定でそれを選択できます:

  1. Cloudflareダッシュボードにログインします。
  2. Zaraz > 設定に移動します。
  3. コンテキストエンリッチャーWorkerを選択します。
  4. 設定を保存します。

これで、指定されたゾーン内のすべてのZarazリクエストでコンテキストエンリッチャーが実行されます。

例:コンテキストエンリッチャー

APIを使用して任意の情報を追加する

コンテキストエンリッチャーを使用して、コンテキストに情報を追加できます。たとえば、APIを使用してユーザーの位置情報の現在の天気を取得し、それをコンテキストに追加することができます。

function getWeatherForLocation({ client, system }) {
// コンテキストから位置情報を取得します。
const { city } = system.device.location;
// APIから天気を取得します。
const response = await fetch(
`https://wttr.in/${encodeURIComponents(city)}?format=j1`
).then((response) => response.json());
// 天気をコンテキストに追加します。
client.weather = weather;
return { client, system };
}
export default {
async fetch(request, env, ctx) {
const { system, client } = await request.json();
// コンテキストに天気を追加します。
const newContext = getWeatherForLocation({ system, client });
// JSONとして返します
return new Response(JSON.stringify(newContext));
},
};

これで、Zaraz内の任意の場所でTrack Propertyを属性入力から選択し、weatherを入力することで天気プロパティを使用できます。

メールアドレスなどの機密情報をマスクする

機密情報、たとえばメールアドレスを削除したいと仮定しましょう。このために、コンテキスト全体でメールアドレスのすべての出現を置き換えます。この例は単なる例であり、すべてのエッジやユースケースに適合するわけではないことに注意してください。

この例の簡潔さのために、@記号を含むすべての文字列を置き換えます:

function redactEmailAddressesFromObject(context) {
// オブジェクトのすべてのキーをループします。
for (const key in context) {
// 値が文字列かどうかを確認します。
if (typeof context[key] === "string") {
// 文字列が@記号を含むかどうかを確認します。
if (context[key].includes("@")) {
// 文字列を削除されたバージョンに置き換えます。
context[key] = "REDACTED@example.com";
}
} else if (typeof context[key] === "object") {
// この関数を再帰的に呼び出してオブジェクトを削除します。
context[key] = redactEmailAddressesFromObject(context[key]);
}
}
return context;
}
export default {
async fetch(request, env, ctx) {
const { system, client } = await request.json();
// コンテキストからメールアドレスを削除します。
const newContext = redactEmailAddressesFromObject({ system, client });
// JSONとして返します
return new Response(JSON.stringify(newContext));
},
};