すべてのプロダクト
Search
ドキュメントセンター

Quick Audience:ユーザー定義関数 UDF 統合管理

最終更新日:Jun 08, 2025

1. UDF の説明

UDF(ユーザー定義関数)は、一般的なデータ開発プラットフォームで使用されるユーザー定義関数です。以下の例では、カスタムコンポーネントの代わりに UDF を使用します。

UDF アクセスは、構成と実行で構成されます。構成は API 管理とキャンバス構成コンポーネントに使用され、実行はジャーニー実行中のコールバックに使用されます。実行部分は Webhook に似ています。

2. UDF の構成とアクセスドキュメント

Quick Audience に接続するには、HTTP サーバーを開発する必要があります。Post リクエストであり、リクエストタイムアウト期間は 10 秒であることに注意してください。次の表に、Quick Audience によって開始され、リクエストを受信する HTTP リクエストの共通パラメーターを示します。これらのパラメーターは必須です。

2.1 システム間のフロー API ダイアグラム

image.png

① 「オフライン開発」の構成情報を次のように提供します

② iframe ページにジャンプし、外部システムにジャンプします

③ API:トークンを使用してユーザー情報を取得します。同時に、結果は iframe ページに返される必要があります。

④ API:トークンを使用してタグ情報を取得します。同時に、結果は iframe ページに返される必要があります。

⑤ フロントエンドは iframe ページに埋め込まれた API にデータを送信し、外部システムのバックグラウンドは ⑥ を介して QA にデータを送信します

⑥ API:構成情報を QA に送信し、QA は選択されたタグ情報に従ってプロセスを実行します

2.1.1 製品 API 構成 UDF コンポーネント情報

image.png

フィールドの制限:

フィールド

制限

埋め込みページアドレス

iframe に埋め込むコンポーネントの URL は、使用されるプロトコル(http または https など)を含む有効で完全な URL である必要があります。情報転送のセキュリティを向上させるために、https を使用することをお勧めします。

アイコン URL

コンポーネント表示アイコン、推奨サイズ 21 * 21px

リクエストアドレス

メッセージをプッシュする API のアドレスは、プロトコル(http または https など)を含む有効で完全なアドレスである必要があります。情報転送のセキュリティを向上させるために、https を使用することをお勧めします。

受信設定

受信設定は、API の形式でマーケティング結果を QA に返します。受信結果フィールドを構成する必要があります。これは、受信結果に基づいて転換を決定するために、自動マーケティングで使用されます。

AES キー

AES キーの長さは 128、192、または 256 ビットで、文字は 16、24、および 32 ビットです。

2.1.1.1 元の JSON 情報の構成
{
    "name":"カスタムコンポーネント名",
    "type":"marketing", // カスタムコンポーネントカテゴリ:現在、marketing -> マーケティングコンポーネントのみがサポートされています。
    "version":"バージョン番号", // デフォルト 1.0
    "endpoint":"カスタムコンポーネントのターゲットドメインは http または https で始まります。例:http://demo.com /2 番目のレベルのパス/index.html",
    "iconUrl":"アイコンアドレス",
    "enable": true, // true または false で有効にするかどうか
    "accessKey":"コンポーネント認証用の AccessKey",
    "accessSecret":"AccessKey シークレット",
    "metaData":{ // メタデータ情報。メタデータの形式は、タイプコンポーネントの形式とは異なります。
        "allowIDType":"このコンポーネントは、モバイル、メール、idfa、imei などのユーザー ID タイプをサポートしています",
        "encryptionMethod":"プッシュマーケティングメッセージ暗号化アルゴリズム null | encryptionMethod",
        "sendParam":{
            "batchSendUrl":"マーケティングタスクをプッシュするための URL は、http://demo.com/send など、http または httpss で始まります。",
            "batchLimit":100, // 一度にプッシュされるレコードの最大数。デフォルト値は 1 から 1000.100 です。
            "timeout": 10, // リクエストタイムアウト期間(単位:秒)0 から 60。デフォルト値:10。
            "retryTimes":0, // 許可される再試行回数。デフォルト値:0。デフォルト値:0。
            "retryPeriod":0 // 再試行間隔(秒単位)0 から 3600。デフォルト値:0。
        },
        "callbackParam":{// マーケティングコンポーネント受信パラメーター
            "usableInHours": 3 * 24, //1 から 30 * 24。デフォルト値:3。プッシュ結果受信データが有効な日数。日数を超えると、データは破棄されます。
            "clearInHours": 7 * 24, //1 から 365 * 24。デフォルトでは、結果受信データがリサイクルされるまでの日数。
            "resultEnumList":[ // プッシュ結果受信のリスト。デフォルト値:success と fail。
                {
                    "code":"success",
                    "name":"成功"
                },
                {
                    "code":"fail",
                    "name":"失敗"
                }
            ],
            "extParams": {
              "extParam1": "拡張パラメーター列ヘッダー 001", // 効果分析に表示される列の名前。拡張フィールド 01
              "extParam2": "拡張パラメーター列ヘッダー 002", // 効果分析に表示される列名。拡張フィールド 02
              "extParam3": "拡張パラメーター列ヘッダー 003" // 効果分析に表示される列名。拡張フィールド 03
            }
        }
    }
}

2.1.2 iframe ジャンプ

外部システムは iframe ページを提供する必要があり、ページリンクは前のステップで構成されたエンドポイントに入力されます。

注:クロスドメインの問題が発生し、クロスドメインサポートを追加する必要があります。X-Frame-Options: allow-from https://example.com/

ジャンプ URL

/endPoint?comeFrom=xxx&qaEndpoint=xxx&token=xxx

成功応答のサンプル

{
  "success":true,
  "errorDesc":"エラーメッセージ(空にすることも可能)"
}

2.1.3 API 操作:トークンを使用してユーザー情報を取得する

API:/openapi/v3/account/query?token=xxx

戻り値

{
  "success": false,
  "errorDesc": "",
  "data": {
    "organizationId":"組織 ID",
    "organizationName":"組織名",
    "userId":"ユーザー ID",
    "nickName":"ユーザーニックネーム"
  },
  "@comment": {
    "success": "/**\n * 列挙値:true | false\n */",
    "errorDesc": "/**\n * エラーメッセージの説明 \n */",
    "data": "/**\n * ユーザー情報 \n */"
  }
}

ユーザー情報が取得された場合、システムは正常に利用可能です。ユーザー情報が取得されない場合、ページのレンダリング時にトークン無効エラーメッセージが返されます。

2.1.4 API:UDF によって選択されたクラウドとイベント ID を保存します。

API:/restapi/marketing/udf_component/genUdfComponentNode

入力パラメーター

{
    "componentId": "1001",
    "sourceId": "c1f5691dd5864479820c10c0089bece9 (イベントまたはクラウドの ID)",
    "sourceNodeId": "",
    "nodeId": "83a2d328-030d-436a-b607-21da8ee2e34b",
    "sourceType": 1 // イベントのタイプ。1 はクラウド、2 はイベントを示します。
}

戻り値

{
    "data": {
        "nodeId": "83a2d328-030d-436a-b607-21da8ee2e34b",
        "token": "zKBfv7flRQmhd+XP1l1uuKCjE6seEOq8l02cBFWWRr5xQoOUPxb3+tj+ZPctWDG4rM5vC2PMQLxG0Xw7Qw6TpsDfXSYFwD8kmTjpUOV4AjxQfZPfC5q0wPrEFhvgfjz9X1OKDu4V4p1oJnJcbt5nELidsVk6jxkbVwHEL8ezXcyXFRKbC+jVYxOwG5ElUhS0+hraAK5IiwR1XgZCarFgOGf5ZZo/Nacjrp5AP8HbF3tl4+thAjp8ZuMWTYXsBJbe"
    },
    "errorCode": null,
    "errorDesc": null,
    "exStack": null,
    "opers": [],
    "solution": null,
    "success": true,
    "traceId": "48d6e570-1918-47a4-83ee-27c3f32d3a99"
}

2.1.5 API:トークンでクラウドラベルリスト/イベント属性リストを取得する(1.4 に依存)

API:/openapi/v3/udf_component/marketing/getNodeUsableLabels?token=xxx&nodeId=xxx&version=VERSION_2

戻り値

[
    {
        "id": "タグ ID /プロパティ ID",
        "name": "ラベル名 /属性名"
    }
]

選択されたタグと属性は、サードパーティシステムが最終的に転送されるときにパラメーターとして渡されます。

2.1.6 フロントエンドが iframe 埋め込みページにデータを送信するための API

このページパラメーターはサードパーティによって定義されます。ページが最終的に実行されると、QA によってサードパーティに呼び出され、サードパーティが実行します。ただし、選択された QA タグは ⑥ の API を介して QA に返される必要があります。

2.1.7 UDF 構成情報を送信する

API: /openapi/v3/udf_component/marketing/saveOrUpdateNodeConfig?token=xxx

リクエスト本文:

{
  "nodeId": "ノード ID",
  "nodeName": "ノード名",
  "labelIdList": [
    "タグ ID1",
    "ラベル ID2"
  ]
}

戻り値:戻り値なし。HTTP ステータスは 200 です。

3. UDF 実行アクセスドキュメント

システムフローダイアグラムは次のように表示されます

image.png

3.1 ノード実行リクエスト

Quick Audience に接続するには、HTTP サーバーを開発する必要があります。Post リクエストであり、リクエストタイムアウト期間は 10 秒であることに注意してください。次の表に、Quick Audience リクエストとアクセス受信リクエストの共通パラメーターを示します。

リクエスト URL:{sendParam.batchSendUrl }

リクエストヘッダー情報

ヘッダー情報を読み取った後、java.net.URLDecoder#decode(java.lang.String, java.lang.String) で UTF-8 にエンコードする必要があります。

v=4 // 固定パラメーター。新しいバージョンと古いバージョンを区別するために使用されます。新しいバージョンは 4 で、古いバージョンにはこのフィールドがありません。

リクエスト本文:

リクエストパラメーター

備考

パラメーター

パラメーター

パラメーター

必須

リクエストタイムスタンプ

time

Long

はい

リクエスト ID

requstId

String

はい

コンポーネント ID

componentId

String

はい

AccessKey

accessKey

String

はい

AES キーの長さは 128、192、または 256 ビットで、文字は 16、24、および 32 ビットです。

メッセージ本文暗号化アルゴリズム

encryptionMethod

String

いいえ

デフォルトでは、null は暗号化されません。

現在、AES 暗号化のみがサポートされています。暗号化とパディングの方法は AES、ECB、および PKCS5Padding です。

署名

signature

String

はい

time +

componentId +

accessKey と accessSecret が hmac 暗号化された後

注:署名アルゴリズムは Webhook のものと同じです。

メッセージ本文

data

String

はい

encryptionMethod 暗号化後のメッセージ本文:

  • processId=ジャーニー ID

  • processName=ジャーニー名

  • processSchedulerId=ジャーニーの各定期スケジュールの ID

  • processSchedulerName=ジャーニーの各サイクルの名前:ジャーニー ID + サイクルの時間連結文字列。

  • processSchedulerStartTime=タイムスタンプ形式のジャーニー期間開始時刻

  • processNodeId=ジャーニーノード ID(各サイクルのノード ID は同じです)

  • processNodeName=ジャーニーノード名(各サイクルのノード ID は同じです)

  • batchId=バッチ ID。各バッチ呼び出しの一意の ID です。このパラメーターは、バッチ冪等 ID として使用できます(2022 年 7 月 7 日に追加)。

  • activityId=マーケティングカレンダーイベント ID

  • activityName=マーケティングカレンダーイベント名

  • subActivityId=マーケティングカレンダーサブアクティビティ ID

  • subActivityName=マーケティングカレンダー子イベント名

  • v=4 // 固定パラメーター。新旧バージョンを区別するために使用されます。新しいバージョンは 4 で、古いバージョンにはこのフィールドがありません。

  • jobId=廃止:processId と同じ。processId を使用することをお勧めします。

  • jobName=廃止:processName と同じ。processName を使用することをお勧めします。

  • nodeId=廃止:processNodeId と同じ。processNodeId を使用することをお勧めします。

  • nodeName=廃止:processNodeName と同じ。processNodeName を使用することをお勧めします。

  • taskStartTimestamp=廃止:processSchedulerStartTime と同じ、タイムスタンプ形式。processSchedulerStartTime を使用することをお勧めします。

  • processInstanceId=廃止:古いバージョンと互換性あり:processSchedulerId と同じ

  • processInstanceName=廃止:古いバージョンと互換性あり:processSchedulerName と同じ

  • processInstanceStartTime=廃止:古いバージョンと互換性あり:processSchedulerStartTime と同じ

  • taskId=このフィールドはありません。processNodeInstanceId と同じで、互換性がありません。

  • processNodeInstanceId=このフィールドがないため互換性がありません

  • processNodeInstanceStartTime=このフィールドがないため互換性がありません

  • nodeStartTimestamp=フィールドなし。processNodeInstanceStartTime と同じで、互換性がありません。

  • data

  • メッセージの ID。

  • customerList 配列

    • customerId ユーザー ID

    • labels => {"$labelId":"$labelValue"} マップ形式のラベルのリスト

    • featureMap => [{"key","value"},{"key","value"}] // featureMap は受信時に受信パラメーターとして返される必要があります。

    • processInfo => 説明

リクエスト本文のサンプル

{
  "time": 0,
  "requestId": "111",
  "componentId": "111",
  "accessKey": "111",
  "signature": "111",
  "encryptionMethod": [
    "AES"
  ],
  "data": "文字列形式。詳細な形式は次のとおりです"
}

// データ形式。
{
    "jobId": "",
    "jobName": "",
    "nodeId": "",
    "nodeName": "",
    "componentName": "",
    "taskId": "",
    "taskStartTimestamp": 0,
    "nodeStartTimestamp": 0,
    "data": {
      "messageId": "",
      "customerList": [
        {
          "customerId": "",
          "labels": {},
          "featureMap": {
            "受信フィールド":"そのまま戻す"
          },
          "processInfo": {
            "processInstanceId": "新バージョン:ジャーニーサイクルにおける各ユーザーのジャーニーインスタンス ID",
            "processInstanceStartTime": "新バージョン:ジャーニー期間における各ユーザーのジャーニーインスタンスの開始時刻(タイムスタンプ形式)",
            "processNodeInstanceId": "新バージョン:ジャーニーノードインスタンス ID(毎回異なる)",
            "processNodeInstanceStartTime": "新バージョン:ジャーニー期間における各ユーザーのジャーニーのノードインスタンス開始時刻(タイムスタンプ形式)",
            "groupName":"nodeId:nodeName:groupResult(node.result),groupName(node.resultExt);nodeId:nodeName:groupResult(node.result),groupName(node.resultExt)",
            "@comment":{
              "groupName" : "ノード ID:ノード名(API で構成):グループ化結果(ランダムグループ化のパーセンテージ数、小数点以下 2 桁):グループ名(API で構成)。複数ある場合はセミコロンで区切る"
            }
        	}
          "@comment": {
            "featureMap": "/**\n * 拡張フィールド。非同期受信中にダウンストリームで返される必要があります \n */"
          }
        }
      ]
    },
    "activityId": "",
    "activityName": "",
    "subActivityId": "",
    "subActivityName": "",
    "processId": "",
    "processName": "",
    "processInstanceId": "",
    "processInstanceName": "",
    "processInstanceStartTime": "",
    "processNodeId": "",
    "processNodeName": "",
    "processNodeInstanceId": "",
    "processNodeInstanceStartTime": "",
    "groupId": "",
    "groupName": "",
    "@comment": {
      "activityId": "/**\n * アクティビティ ID\n */",
      "activityName": "/**\n * アクティビティ名 \n */",
      "subActivityId": "/**\n * 子アクティビティの ID \n */",
      "subActivityName": "/**\n * 子アクティビティ名 \n */",
      "processId": "/**\n * ジャーニー ID(自動化 ID)。アクティビティ ID\n */",
      "processName": "/**\n * ジャーニー名(自動化名)。アクティビティ名 \n */",
      "processInstanceId": "/**\n * ジャーニーインスタンス ID。アクティビティインスタンス ID\n */",
      "processInstanceName": "/**\n * アクティビティインスタンスの名前(アクティビティの時刻)\n */",
      "processInstanceStartTime": "/**\n * アクティビティインスタンス開始時刻 \n */",
      "processNodeId": "/**\n * アクティブノードの ID \n */",
      "processNodeName": "/**\n * アクティビティノード名 \n */",
      "processNodeInstanceId": "/**\n * アクティブノードインスタンスの ID \n */",
      "processNodeInstanceStartTime": "/**\n * アクティブノードインスタンス開始時刻 \n */",
      "groupId": "/**\n * ABTest グループの ID。このパラメーターは空です。 \n */",
      "groupName": "/**\n * ABTest グループ名(null)\n */"
    }
  }

戻り値

{
  "success": true,
  "errorDesc": "エラーメッセージ",
  "customerList": [
    {
      "messageId": "メッセージ ID",
      "customerId": "顧客 ID",
      "returnType": "受信結果。この結果は受信結果と同じです。1 つある場合は、直接受信結果と見なされます。受信結果を直接入力したくない場合は、渡さないでください",
      "featureMap": {
        "受信フィールド":"そのまま戻す"
      },
          "processInfo": {
            "processInstanceId": "新バージョン:ジャーニーサイクルにおける各ユーザーのジャーニーインスタンス ID",
            "processInstanceStartTime": "新バージョン:ジャーニー期間における各ユーザーのジャーニーインスタンスの開始時刻(タイムスタンプ形式)",
            "processNodeInstanceId": "新バージョン:ジャーニーノードインスタンス ID(毎回異なる)",
            "processNodeInstanceStartTime": "新バージョン:ジャーニー期間における各ユーザーのジャーニーのノードインスタンス開始時刻(タイムスタンプ形式)"
        	}
    }
  ]
}

3.1.1 認証モード

署名アルゴリズム

long sendTime = System.currentTimeMillis();
// コンポーネントの ID です。
// Component AK
// Component sk

String sign = getSignatureByHmacSHA1(sendTime, componentModel.getComponentId(), componentModel.getAccessKey(), componentModel.getAccessSecret());

public static String getSignatureByHmacSHA1(long time, String prametersString, String accessKey, String accessSecret) {
    String str = time + prametersString + accessKey;
    return HmacUtils.hmacSha256Hex(accessSecret, str.replaceAll("\\s+", ""));
}

3.2 領収書レポート

UDF の例を次に示します。

例 1:

API : /restapi/marketing2/udfComponent/receiveCallback?

例 2:

{
  "time": 0,
  "componentId": "UDF コンポーネント ID",
  "signature": "署名",
  "data": "暗号化された領収書情報。文字列です。",
  "@comment":{
    "time":"領収書のタイムスタンプ(ミリ秒単位)"
  }
}

// データの元のフォーマット
{
  "nodeId": "ノード ID",
  "taskId": "タスク ID",
  "customerList": [
    {
      "messageId": "メッセージ ID",
      "customerId": "顧客 ID",
      "returnType": "領収書の結果",
      "sendTimestamp": 0,
      "featureMap": {
        "request parameters": "戻り値"
      },
      "@comment": {
        "messageId": "/**\n * メッセージの ID。この ID は、QA がメッセージをプッシュするときに含まれます。\n */",
        "customerId": "/**\n * ユーザー ID\n */",
        "returnType": "/**\n * 領収書の結果\n */",
        "sendTimestamp": "/**\n * メッセージのプッシュ時間\n */",
        "featureMap": "リクエストの送信に使用されたパラメーター。領収書に戻す必要があります。"
      },
      "extParam1": "拡張パラメーター 001-カスタム戻り値",
      "extParam2": "拡張パラメーター 002-カスタム戻り値",
      "extParam3": "拡張パラメーター 003-カスタム戻り値"
    }
  ],
  "@comment": {
    "nodeId": "/**\n * ノード ID\n */",
    "taskId": "/**\n * タスク ID\n */",
    "customerList": "/**\n * 領収書のユーザー/フォロワーのリスト\n */"
  }
}

注: この例では、fetch API を使用しています。他の JavaScript ライブラリも使用できます。

{
  "success": true,
  "errorDesc": "",
  "@comment": {
    "success": "/**\n * 列挙値:true | false\n */",
    "errorDesc": "/**\n * エラーメッセージの説明\n */",
    "data": "/**\n * ユーザー情報\n */"
  }
}