コンテキストエンリッチャー
Zarazコンテキストエンリッチャーは、Cloudflare Workerを使用してZaraz全体で使用されるコンテキストを変更または強化するためのツールです。コンテキストエンリッチャーを使用すると、クライアントおよびシステム変数にアクセスできます。
コンテキストエンリッチャーを使用するには、まず新しいCloudflare Workerを作成する必要があります。これをCloudflareダッシュボードを通じて行うか、Wranglerを使用して行うことができます。
Cloudflareダッシュボードで新しいWorkerを作成するには:
- Cloudflareダッシュボード ↗にログインします。
- Workers & Pagesに移動し、アプリケーションを作成を選択します。
- Workerに名前を付け、デプロイを選択します。
- コードを編集を選択します。
これで「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設定でそれを選択できます:
- Cloudflareダッシュボード ↗にログインします。
- Zaraz > 設定に移動します。
- コンテキストエンリッチャーWorkerを選択します。
- 設定を保存します。
これで、指定されたゾーン内のすべてのZarazリクエストでコンテキストエンリッチャーが実行されます。
コンテキストエンリッチャーを使用して、コンテキストに情報を追加できます。たとえば、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)); },};