响应令牌
响应令牌允许您自动将特定于Adobe Target的信息输出到品牌网页。 此信息可以包括有关活动、选件、体验、用户配置文件、地理信息等的详细信息。 这些详细信息提供了额外的响应数据,可用于与内部或第三方工具共享或用于调试。
响应令牌允许您选择要使用的变量(在键值对中),然后启用它们作为Target响应的一部分发送。 您使用开关启用一个变量,该变量将随Target响应一起发送,这可以在网络调用中验证。 响应令牌也可在Preview模式下使用。
插件和响应令牌之间的主要区别在于,插件可以将JavaScript交付到在交付时执行的页面。 但是,响应令牌会传递一个对象,然后可以使用事件侦听器读取该对象并对其执行操作。 响应令牌方法更安全,并且允许更轻松地开发和维护第三方集成。
我们鼓励使用 at.js 的客户使用响应令牌而不是插件。某些插件依赖的内部方法在mbox.js中存在(现已弃用),但在at.js中不存在;这些插件虽然可以交付,但却会失败。
使用响应令牌 section_A9E141DDCBA84308926E68D05FD2AC62
- 
                  
确保您使用的是Platform Web SDK版本2.6.0(或更高版本)或者at.js版本1.1(或更高版本)。
有关更多信息:
- Platform Web SDK:请参阅Platform Web SDK概述指南中的 安装SDK。
 - at.js:请参阅下载at.js。
 
 - 
                  
在Target中,单击 Administration > Response Tokens。
 - 
                  
激活所需的响应令牌,如
activity.id和offer.id。以下参数默认可用:
table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 5-row-3 6-row-3 7-row-3 8-row-3 9-row-3 10-row-3 11-row-3 12-row-3 13-row-3 类型 参数 注释 内置轮廓 profile.activeActivities返回该访客符合条件的 activityIds数组。它会随着符合条件的用户数量的增加而递增。例如,在包含两个交付两个不同活动的Target请求的页面上,第二个请求包含这两个活动。profile.isFirstSession返回“true”或“false”。 profile.isNewSession返回“true”或“false”。 profile.daysSinceLastVisit返回自该访客上次访问后已过的天数。 profile.tntId返回访客的 tntID profile.marketingCloudVisitorId返回访客的 Experience Cloud 访客 ID。 profile.thirdPartyId返回访客的第三方 ID。 profile.categoryAffinity返回访客最喜欢的类别。 profile.categoryAffinities将该访客排名前 5 的类别的数组作为字符串返回。 活动 activity.nameactivity.idexperience.nameexperience.idoffer.nameoffer.id当前活动的详细信息。 
请注意,优惠参数的值是在体验级别上评估的。地域 geo.countrygeo.countryCodegeo.stategeo.citygeo.zipgeo.dmageo.domainNamegeo.ispNamegeo.connectionSpeedgeo.mobileCarrier请参阅地域以了解在活动中使用地域定位的详细信息。 流量分配方法 
(仅适用于Auto-Target和Automated Personalization活动。)experience.trafficAllocationId如果访客因处于“control”流量中而获得体验,则返回0;如果访客从“targeted”流量分配获得体验,则返回1。 experience.trafficAllocationType返回“control”或“targeted”。 用户轮廓属性和客户属性也会显示在列表中。
note note NOTE 包含特殊字符的参数不会显示在列表中。只支持字母数字字符和下划线。  - 
                  
(视情况而定)要将配置文件参数用作响应令牌,但该参数尚未通过Target请求传递,因此尚未加载到Target UI中,您可以使用Add Response Token按钮将该配置文件添加到UI。
单击 Add Response Token,提供令牌名称,然后单击 Activate。
 - 
                  
创建一个活动。
 
侦听响应并读取响应令牌
根据您是Target还是at.js实施,用于侦听Platform Web SDK响应和读取响应令牌的进程会有所不同。
使用Handle对象类的 
          
            
            
            
            
               Platform Web SDK platform-web-sdk
        
        使用Handle对象类,该对象类具有元数据对象和数据对象,用于侦听Target响应并读取响应令牌。
以下响应示例将一个Platform Web SDK自定义事件处理程序直接添加到HTML页面(该表说明了代码中使用的对象):
<html>
<head>
 ...
 <script src="alloy.js"></script>
 <script>
  {
   "requestId": "4d0a7cfd-952c-408c-b3b8-438edc38250a",
   "handle": [{
    "type": "personalization:decisions",
    "payload": [{
     "id": "....",
     "scope": "__view__",
     "scopeDetails": {
      "decisionProvider": "TGT",
      "activity": {
       "id": "..."
      },
      "experience": {
       "id": "...."
      }
     },
     "items": [{
      "id": "123",
      "schema": "https://ns.adobe.com/personalization/dom-action",
      "meta": {
       "activity.id": "...",
       "activity.name": "...",
       "profile.foo": "...",
       "profile.bar": "..."
      },
      "data": {
       "id": "123",
       "type": "setHtml",
       "selector": "#foo",
       "prehidingSelector": "#foo",
       "content": "<div>Hello world</div>"
      }
     }]
    }]
   }]
  }
  });
 </script>
</head>
<body>
 ...
</body>
</html>
            使用自定义事件的 
          
            
            
            
            
               at.js
        
        使用at.js自定义事件监听Target响应并读取响应令牌。
以下代码示例可将一个 at.js 自定义事件处理程序直接添加到 HTML 页面:
<html>
  <head>
    ....
    <script src="at.js"></script>
    <script>
      document.addEventListener(adobe.target.event.REQUEST_SUCCEEDED, function(e) {
        console.log("Request succeeded", e.detail);
      });
    </script>
  <head>
  <body>
  ...
  </body>
</html>
            响应令牌常见问题解答 section_3DD5F32C668246289CDF9B4CDE1F536D
激活或停用响应令牌需要使用哪个角色?
响应令牌只能由具有Target Administrator角色的用户激活或停用。
如果我运行的是Platform Web SDK 2.6.0(或更早版本),会发生什么情况?
您无权访问响应令牌。
如果我运行的是at.js 1.0(或更早版本),会发生什么情况?
您可以看到响应令牌,但at.js不能使用它们。
我是否可以同时使Target Classic插件和响应令牌处于活动状态?
插件和响应令牌可并行使用;但是,未来将弃用插件。
响应令牌是通过所有Target响应还是仅通过Target响应交付活动?
响应令牌仅通过交付活动的Target响应来交付。
我的Target Classic插件包含JavaScript。 如何使用响应令牌复制其功能?
迁移到响应令牌时,必须将此类型的JavaScript保留在代码库或标签管理解决方案中。 您可以使用Platform Web SDK或at.js自定义事件触发此代码,并将响应令牌值传递给您的JavaScript函数。
为什么我的配置文件/客户属性参数不会显示在响应令牌列表中?
Target通常每15分钟刷新一次参数。 此刷新取决于用户操作,仅当查看响应令牌页面时才刷新数据。 如果您的参数未显示在响应令牌列表中,Target尚未刷新数据。
此外,如果参数包含非字母数字字符或下划线以外的任何符号,则该参数不会出现在列表中。 目前,仅支持字母数字和下划线字符。
如果响应令牌使用已删除的配置文件脚本或配置文件参数,它是否仍会交付内容?
响应令牌从用户配置文件中提取信息,然后交付该信息。如果删除配置文件脚本或参数,并不意味着该信息已从用户配置文件中删除。用户配置文件仍然具有与配置文件脚本对应的数据。 响应令牌将继续交付内容。 对于未在配置文件中保存该信息的用户或者新访客,不会交付该令牌,因为数据不存在于其配置文件中。
Target不会自动关闭令牌。 如果您要删除配置文件脚本并且不再希望交付该令牌,则必须自行关闭该令牌。
我重命名了我的配置文件脚本,但为什么使用该脚本的令牌仍使用旧名称?
如上所述,响应令牌处理的是为用户保存的配置文件信息。即使您重命名了配置文件脚本,但访问过您网站的用户会在其配置文件中保存旧的配置文件脚本值。 令牌会继续选取已保存在用户配置文件中的旧值。 如果您现在想要以新名称交付内容,则必须关闭以前的令牌,然后打开新令牌。
如果我的属性已更改,何时将其从列表中移除?
Target定期执行属性刷新。 任何未切换的属性将在下次刷新时删除。 但是,如果您具有已打开并已删除的属性,则在将其关闭之前,不会将该脚本从属性列表中删除。 例如,您删除了用作令牌的配置文件脚本。 删除或重命名Target时,只从列表中删除已切换的属性。
将数据发送到Google Analytics
以下部分介绍了如何将Target数据发送到Google Analytics 4。 由响应令牌发送的数据也可以发送到其他第三方集成。
          
            
            
            
            
              通过Platform Web SDK向Google Analytics发送数据
        
        通过在Google Analytics页面中添加以下代码,可以通过Platform Web SDK版本2.6.0(或更高版本)来发送HTML数据。
alloy("sendEvent"对象下。<script async src="https://www.googletagmanager.com/gtag/js?id=TAG_ID"></script>
<script type="text/javascript">
    alloy("sendEvent", {
    })
    .then(({ renderedPropositions, nonRenderedPropositions }) => {
        // concatenate all the propositions
        const propositions = [...renderedPropositions, ...nonRenderedPropositions];
        // extractResponseTokens() extract the meta from item -> meta
        const tokens = extractResponseTokens(propositions);
        const activityNames = [];
        const experienceNames = [];
        const uniqueTokens = distinct(tokens);
        uniqueTokens.forEach(token => {
            activityNames.push(token["activity.name"]);
            experienceNames.push(token["experience.name"]);
        });
        gtag('config', 'TAG_ID');
        gtag('event', 'action_name', {'eventCategory': 'target',
            'eventAction': experienceNames, 'eventLabel': activityNames
        });
    });
</script>
            
          
            
            
            
            
              通过at.js将数据发送到Google Analytics section_04AA830826D94D4EBEC741B7C4F86156
        
        通过在 HTML 页面中添加以下代码,即可通过 at.js 向 Google Analytics 发送数据:
<script async src="https://www.googletagmanager.com/gtag/js?id=TAG_ID"></script>
<script type="text/javascript">
    document.addEventListener(adobe.target.event.REQUEST_SUCCEEDED, function(e) {
        var tokens = e.detail.responseTokens;
        if (isEmpty(tokens)) {
            return;
        }
        var activityNames = [];
        var experienceNames = [];
        var uniqueTokens = distinct(tokens);
        uniqueTokens.forEach(function(token) {
            activityNames.push(token["activity.name"]);
            experienceNames.push(token["experience.name"]);
        });
        gtag('config', 'TAG_ID');
        gtag('event', 'action_name', {'eventCategory': 'target',
            'eventAction': experienceNames, 'eventLabel': activityNames
        });
    });
    function isEmpty(val) {
        return (val === undefined || val == null || val.length <= 0) ? true : false;
    }
    function key(obj) {
        return Object.keys(obj)
        .map(function(k) { return k + "" + obj[k]; })
        .join("");
    }
    function distinct(arr) {
        var result = arr.reduce(function(acc, e) {
            acc[key(e)] = e;
            return acc;
        }, {});
        return Object.keys(result)
        .map(function(k) { return result[k]; });
    }
</script>
            调试
以下部分提供了有关调试响应令牌的信息:
          
            
            
            
            
               Google Analytics和调试
        
        以下代码允许您使用Google Analytics调试:
<script async src="https://www.googletagmanager.com/gtag/js?id=TAG_ID"></script>
<script type="text/javascript">
    document.addEventListener(adobe.target.event.REQUEST_SUCCEEDED, function(e) {
      var tokens = e.detail.responseTokens;
      if (isEmpty(tokens)) {
        return;
      }
      var activityNames = [];
      var experienceNames = [];
      var uniqueTokens = distinct(tokens);
      uniqueTokens.forEach(function(token) {
        activityNames.push(token["activity.name"]);
        experienceNames.push(token["experience.name"]);
      });
      gtag('config', 'TAG_ID');
      gtag('event', 'action_name', {'eventCategory': 'target',
          'eventAction': experienceNames, 'eventLabel': activityNames
      });
    });
    function isEmpty(val) {
      return (val === undefined || val == null || val.length <= 0) ? true : false;
    }
    function key(obj) {
       return Object.keys(obj)
      .map(function(k) { return k + "" + obj[k]; })
      .join("");
    }
    function distinct(arr) {
      var result = arr.reduce(function(acc, e) {
        acc[key(e)] = e;
        return acc;
      }, {});
      return Object.keys(result)
      .map(function(k) { return result[k]; });
    }
</script>
            使用ttMeta插件的等效插件进行调试
通过向 HTML 页面添加以下代码,可以创建与 ttMeta 插件等效的调试工具:
<script type="text/javascript" >
  document.addEventListener(adobe.target.event.REQUEST_SUCCEEDED, function (e) {
    window.ttMETA= typeof(window.ttMETA)!="undefined" ? window.ttMETA : [];
    var tokens=e.detail.responseTokens;
    if (isEmpty(tokens)) {
      return;
    }
    var uniqueTokens = distinct(tokens);
    uniqueTokens.forEach(function(token) {
      window.ttMETA.push({
        'CampaignName': token["activity.name"],
        'CampaignId' : token["activity.id"],
        'RecipeName': token["experience.name"],
        'RecipeId': token["experience.id"],
        'OfferId': token["offer.id"],
        'OfferName': token["offer.name"],
        'MboxName': e.detail.mbox});
      console.log(ttMETA);
    });
  });
  function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
  }
  function key(obj) {
     return Object.keys(obj)
    .map(function(k) { return k + "" + obj[k]; })
    .join("");
  }
  function distinct(arr) {
    var result = arr.reduce(function(acc, e) {
      acc[key(e)] = e;
      return acc;
    }, {});
    return Object.keys(result)
    .map(function(k) { return result[k]; });
  }
</script>
            
          
            
            
            
            
              培训视频:响应令牌和at.js自定义事件 section_3AA0A6C8DBD94A528337A2525E3E05D5
        
        以下视频介绍如何使用响应令牌和at.js自定义事件将Target中的配置文件信息共享到第三方系统。
option.name和option.id,它们已分别替换为offer.name和offer.id。