在谷歌标签管理器服务器端准备一个输入表,作为 API 请求正文的一部分发送

Posted

技术标签:

【中文标题】在谷歌标签管理器服务器端准备一个输入表,作为 API 请求正文的一部分发送【英文标题】:preparing an input table on google tag manager server side to be send as part of an API request body 【发布时间】:2021-10-23 06:57:42 【问题描述】:

我正在使用 Google 跟踪代码管理器服务器容器。

我正在尝试对 POST API 进行调用

https://api.hubapi.com/events/v3/send?hapikey=hubspot api key

之间的部分是在谷歌标签管理器中获取和设置的变量。它们正在正确填充。

此 API 调用的目的是将自定义行为事件(类似于 google 分析事件)发送到 Hubspot - custom behaviour events manual tracking

对于这些事件,您可以发送页面 url、google cid、文件类型、页面标题等属性。

这些属性被添加到请求正文中,因此它们包含在以下请求的setBody

sendHttpRequest(url, (statusCode, headers, body) => 
                if (statusCode >= 200 && statusCode <300) 
                  data.gtmOnSuccess();
                 else 
                 data.gtmOnFailure();
            
              setResponseStatus(statusCode);
              setResponseHeader('cache-control', headers['cache-control']);
              setResponseBody(body);
,headers: postHeaders, method: 'POST', timeout: 3000, setBody);

setBody 使用以下代码设置:


if (data.additionalProperties) 
  for (let key in data.additionalProperties) 
    postPropertiesData = ["",postPropertiesData, data.additionalProperties[key].property,":",data.additionalProperties[key].value,""].join('');
  



const postProperties = JSON.stringify(postPropertiesData);

const setProperties = JSON.stringify(
  utk: data.userToken,
  eventName: data.eventName,
  ocurredAt: getTimestamp(),
);

const setBody = [setProperties,'properties:',postProperties].join(' ');

(if (data.additionalProperties) 部分从这样的输入表中获取属性 .

data.additionalProperties 访问表。左列具有名为 property 的内部名称,右列具有称为 value 的内部名称。

我需要将它作为对象输出到“属性”:'firstname':'michael','lastname':'stone','email':'michael.stone@gmail.com' 然后字符串化使用 JSON.stringify() 函数

我使用上面的代码尝试准备成为请求正文的一部分。

我也试过了。

let postPropertiesData = ;

if (data.additionalProperties) 
  for (let key in data.additionalProperties) 
    postPropertiesData[data.additionalProperties[key].property =data.additionalProperties[key].value,";
  





const setBody = JSON.stringify(
  utk: data.userToken,
  eventName: data.eventName,
  properties: postPropertiesData,
  ocurredAt: getTimestamp(),
);

无论哪种方式我都会得到相同的结果

属性部分为空。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您也可以查看这个 HubSpot GTM 服务器端标签https://github.com/stape-io/hubspot-tag的来源

它还具有向 HubSpot 发送自定义行为事件的功能。

这里有一篇关于如何使用它的博文https://stape.io/how-to-connect-website-with-hubspot-using-server-side-tracking/

【讨论】:

我看到你把它上传到了 github。挺好看的,就是有限制。例如,我的最终目标是能够使用 hubspot 用户令牌来获取 id,以便进行更新。我没有他们的电子邮件地址,并且通过谷歌标签管理器网络版本发送该地址可能会暴露 PII, 我们这样使用它: - 用户提交注册表。 - 我们此时有用户电子邮件并将其发送到 GTM 服务器。 - 在 GTM 上,我们向少数几个系统发送用户电子邮件,其中之一是 HubSpot。在注册时发送用户电子邮件是正常的。这就是后端开发人员通常会做的事情。 此外,HubSpot Stape 标签支持“utk”,以防您没有电子邮件但已将 utk 存储在 cookie 中。【参考方案2】:

最后,我找到了答案。我不得不使用 makeTableMap API

所以我做了const makeTableMap = require('makeTableMap');

然后,我在对象本身中使用了三元组,而不是 if 语句和 for。

const setBody = JSON.stringify(
  'portalId':data.portalID,
  'utk': data.userToken,
  'eventName': data.eventName,
  'properties': (data.additionalProperties) ? makeTableMap(data.additionalProperties,'property','value'):,
  'ocurredAt': getTimestamp(),
);

而且成功了。

【讨论】:

以上是关于在谷歌标签管理器服务器端准备一个输入表,作为 API 请求正文的一部分发送的主要内容,如果未能解决你的问题,请参考以下文章

谷歌标签管理器无法在 Ionic+Angular 应用程序中工作

有没有办法在谷歌部署管理器中打印到stdout,stderr或日志文件?

仅在谷歌地图上呈现可见集群项目的最佳方式

按钮 [name=] 上带有 Google 跟踪代码管理器的 CSS 选择器

谷歌标签管理器定位

如何在谷歌脚本中将文本作为日期插入单元格? (符合时区转换)