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

Quick Audience:ユーザー定義 UDF のアクセス管理

最終更新日:Jan 16, 2026

1. UDF の説明

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

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

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

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

2.1 システム間のフローインターフェイス図

image.png

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

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

③ API インターフェイス:トークンを介してユーザー情報を取得します。同時に、結果を iframe ページに返す必要があります。

④ API インターフェイス:トークンによってタグ情報を取得します。同時に、結果を iframe ページに返す必要があります。

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

⑥ API インターフェイス:設定情報を QA に送信し、QA は選択されたタグ情報に従ってプロセスを実行します。

2.1.1 プロダクトインターフェイスでの UDF コンポーネント情報の設定

image.png

フィールドの制限:

フィールド

制限

埋め込みページアドレス

iframe に埋め込むコンポーネントの URL です。使用するプロトコル (HTTP や HTTPS など) を含む、有効で完全な URL である必要があります。情報伝送のセキュリティを向上させるために、HTTPS の使用を推奨します。

アイコン URL

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

リクエストアドレス

メッセージをプッシュしたいインターフェイスの URL です。使用するプロトコル (HTTP や HTTPS など) を含む、有効で完全な URL である必要があります。情報伝送のセキュリティを向上させるために、HTTPS の使用を推奨します。

受信設定

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

AES キー

AES キーの長さは 128、192、または 256 ビットで、それぞれ 16、24、32 文字に相当します。

パブリック

UDF コンポーネントは、現在の組織内のすべてのスペースで使用できます。

パブリックが無効になっている場合、UDF コンポーネントは現在のスペースでのみ使用できます。

2.1.1.1 元の JSON 情報の構成
{
    "name":"カスタムコンポーネント名",
    "type":"marketing", // カスタムコンポーネントのカテゴリ:現在、marketing -> マーケティングコンポーネントのみがサポートされています。
    "version":"バージョン番号", // デフォルトは 1.0
    "endpoint":"カスタムコンポーネントのターゲットドメイン名。http または https で始まります。例:http://demo.com /second-level path to point/index.html",
    "iconUrl":"アイコンアドレス",
    "enable": true // true または false、有効にするかどうか
    "accessKey":"コンポーネント認証用の AccessKey",
    "accessSecret":"AccessKey Secret",
    "metaData":{ // メタデータ情報。メタデータのフォーマットは、タイプコンポーネントのフォーマットとは異なります。
        "allowIDType":"このコンポーネントがサポートするユーザー ID タイプ。例:mobile、email、idfa、imei",
        "encryptionMethod":"プッシュマーケティングメッセージの暗号化アルゴリズム null | encryptionMethod",
        "sendParam":{
            "batchSendUrl":"マーケティングタスクをプッシュするための URL。http または https で始まります。例:http://demo.com/send",
            "batchLimit":100, // 一度にプッシュするレコード数。値は 1 から 1000 です。デフォルト値は 100 です。
            "timeout": 10, // リクエストのタイムアウト期間 (単位:秒) 0 から 60。デフォルト値:10。
            "retryTimes":0, // 失敗した場合のリトライ回数。0 から 3。デフォルト値: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 操作:トークンを使用したクラウドタグリストとイベント属性リストの取得 (2.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 タグは ⑥ のインターフェイスを介して QA に返す必要があります。

2.1.7 UDF 設定情報の送信 (2.1.5 に依存)

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

リクエスト本文:

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

戻り値:戻り値なし。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 (16 文字)、192 (24 文字)、または 256 (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 => 説明

  • idMappings

    QA は現在のユーザーの ID をこのフィールドに配置し、JSON 形式で発行します。

リクエストボディのサンプル:

{
  "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": "",
          "featureMap": {
            "受信フィールド":"そのまま返します"
          },
          "idMappings": {
                    "mobile": "携帯電話番号",// インスタンスの ID タイプ。
                    "qaid": "QA によって生成された QAID"
                },
                "labels": {},
          "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:ノード名 (インターフェイスで設定):グループ化結果 (ランダムグループ化のパーセンテージ、小数点以下 2 桁):グループ名 (インターフェイスで設定);複数ある場合はセミコロンで区切ります"
            }
        	}
          "@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": "受信結果。この値が存在する場合、直接受信結果とみなされます。受信結果を直接入力したくない場合は、このパラメーターを渡さないでください。",
      "returnMessage": "受信メッセージの長さは 255 文字です。長さが制限を超えた場合、メッセージは自動的に切り捨てられます。"
    }
  ]
}

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 領収書レポート

アクセスポイントがマーケティングタスクを実行すると、マーケティングメッセージの送信結果をフィードバックとして Quick Audience に報告します。

HTTPリクエストURL:

API : /restapi/marketing2/udfComponent/receiveCallback?

リクエストボディ

{
  "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 */"
  }
}

戻り値:

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