Acxiom Identity ResolutionのためのTealium Functionsの使用
この記事では、Acxiom identityプロバイダから確率的なアイデンティティデータを取得し、訪問プロファイルに保存するための訪問関数の使用方法について説明します。
Acxiomからのデータを取得するために、訪問関数の使用を推奨します。訪問関数についての詳細は、Event and Visitor Functionsを参照してください。
訪問関数は以下のことを行います:
- Acxiomから追加のデータをリクエストします。
- 追加のデータと
tealium_visitor_id
を含むイベントをTealium Collectに送信します。
関数から送信されたイベントによって、EventStreamの属性と訪問の属性が豊かになります。
前提条件
- Tealium EventSteamとTealium Functions。
- データソースとしてのTealium Collect API。
- 追加情報を保存するための訪問の属性。
- 訪問の属性をエンリッチするために必要な属性を持つ
acxiom_function_event
というタイトルのイベント仕様。 - イベント属性の値に訪問の属性を構成するためのエンリッチメント。
Acxiom Real Tagタグがインストールされていると、この関数は最も効果的に動作します。この識別子は、訪問の信頼度を高めます。
イベントを処理するための関数の作成
関数を作成するには:
- Functionsに移動します。
- Add Functionをクリックします。
- 関数の名前を入力します。
- 関数の説明を記入します。
- Processed Eventトリガーを選択します。
- トリガーのイベントフィードを選択します。
- Continueをクリックします。
- 下記のサンプルコードをCodeボックスに入力します。
- 必要に応じてコードをカスタマイズします。
- 関数を保存します。
Test機能とPostman API Workbenchなどのツールを使用して、関数をテストすることができます。
関数の作成についての詳細は、Managing Functionsを参照してください。
例の関数コード
以下に示すテスト例の関数は、送信した属性に基づいて訪問プロファイルをマッチングしようとします:
属性 | 説明 |
---|---|
acxiom_function_event |
イベント仕様の名前 |
realId |
Acxiom rTag |
address |
ユーザーの住所 |
phone |
ユーザーの電話番号 |
email |
ユーザーのメールアドレス |
fullName |
ユーザーのフルネーム |
関数は、プロファイルの豊かさを増すための追加のユーザーデータを返します。
このコードは現在ベータ版です。
// イベントスコープの関数では、以下のモジュールが使用可能です: event, auth
import { event, store, tealium } from "tealium";
(async () => {
// これらのエンドポイントは、Acxiomとのセットアップに特有のものです。
const access_url="https://mydomain.com/metrics/access_token"
const query_url="https://mydomain.com/metrics"
const query_name="demo_dsapi_match"
// このコメントを外すと、イベントオブジェクトで何が使用可能かを正確に知ることができます
//console.log('Data available:\n', JSON.stringify(event, null, 2));
const data = {};
data.tealium_account = event?.data?.udo?.tealium_account;
data.tealium_profile = event?.data?.udo?.tealium_profile;
data.visitor_id = event?.data?.udo?.visitor_id;
data.trace_id = event?.data?.firstparty_tealium_cookies?.trace_id;
data.acxiom_real_id = event?.data?.udo?.acxiom_real_id || "";
data.customer_email = event?.data?.udo?.customer_email;
data.customer_first_name = event?.data?.udo?.customer_first_name;
data.customer_last_name = event?.data?.udo?.customer_last_name;
data.customer_full_name = `${data.customer_first_name} ${data.customer_last_name}`
// acxiom_real_idが利用可能かどうかを確認します
// if (typeof data.acxiom_real_id === "undefined") {
// console.error("acxiom_entity_id is unavailable.");
// return;
// }
// グローバル変数からリフレッシュトークンを取得します
const refresh_token = store.get("acxiom_refresh_token")
console.log("refresh_token: ", refresh_token)
// アクセストークンを生成します
const access_token_request = await fetch(access_url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${refresh_token}`
},
body: `{"grant_type":"refresh_token","refresh_token":"${refresh_token}"}`
})
.catch((error) => {
console.error('Error:', error);
});
const access_token_response = await access_token_request.json();
// console.log("access_token_response:", JSON.stringify(access_token_response));
const access_token = access_token_response.jwt_token;
// console.log("access_token: ", access_token)
// Acxiom PAILからacxiom_real_idを使用してquery_execution_idを取得します
const response = await fetch(`${query_url}/named_queries/${query_name}/execute`, {
method: "POST",
redirect: "follow",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${access_token}`
},
body: `{
"realID": "${data?.acxiom_real_id}",
"address": "${data?.customer_address}",
"phone": "${data?.customer_phone}",
"email": "${data?.customer_email}",
"fullName": "${data?.customer_full_name}"
}`
})
.then(res => {
console.log("Res: ", JSON.stringify(res))
return res
})
// .then(response => console.log("Response: ", JSON.stringify(response)))
.catch(error => console.error('Error: ', error.message));
const body = await response.json();
const query_execution_id = body.query_execution_id
// console.log("Status: " + response.status);
console.log("Body: " + JSON.stringify(body, null, 2));
// Acxiomからのレスポンスデータが利用可能かどうかを確認します
if (!response.ok) {
console.error("Acxiom response data is unavailable.");
return;
}
// query_execution_idを使用してAcxiom PAILからデータを取得します
const payload = await fetch(`${query_url}/query_executions/${query_execution_id}`, {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${access_token}`
}
})
.then(res => {
console.log("Res: ", JSON.stringify(res))
return res
})
// .then(response => response.json())
// .then(response => console.log("Response: ", JSON.stringify(response)))
.catch(err => console.error(err));
const user_data = await payload.json();
console.log("user_data: ", JSON.stringify(user_data))
let data_object = {};
for (let i=0; i < user_data.column_info.length; i++) {
data_object[user_data.column_info[i].name] = user_data.data[0][i]
}
// data_object = JSON.stringify(data_object)
let newEvent = {};
newEvent = { ...data_object }
newEvent.tealium_event = "acxiom_function_event";
newEvent.visitor_id = data.visitor_id;
newEvent.tealium_trace_id = data?.tealium_trace_id;
newEvent.customer_email = data_object?.email;
console.log("newEvent: " + JSON.stringify(newEvent, null, 2));
// Acxiomから受け取ったデータをTealiumに送信します
tealium
.sendCollectEvent(newEvent, data.tealium_account, data.tealium_profile)
.then(response => {
console.log('Status code: ', response.status);
return response;
})
.then(data => console.log('Result: ', JSON.stringify(data, null, 2)))
.catch(error => console.error('Error: ', error.message));
})();
最終更新日 :: 2024年March月29日