通过测量协议发送跟踪数据到Google Analytics时,客户端ID是什么?

64

我想使用Google的新测量协议,从我的服务器发送跟踪事件,而不是使用JavaScript。

这个页面说客户端ID是必需的: https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide#required

但这个页面说它是可选的: https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#visitor

另外,文档中定义的格式不同-第一个页面给出了一个整数作为示例,并仅表示它是“唯一的值”,而第二个链接指出它应该是UUID。

如果我在后端发送用户ID或生成的UUID,Google如何知道将该访问者链接到现有的访问者会话?似乎我需要检索GA对现有用户的内部引用。

如果能提供任何帮助,将不胜感激 - 谢谢!

3个回答

60

整数或UUID

cid是在使用JavaScript跟踪时相当于_utma cookie的第二个值。在js跟踪中,它是一个随机整数(由Math.round(2147483647 * Math.random())生成)。但它以字符串形式存储和发送,因此您可以使用两种格式(整数或UUID)。

必需/可选

对于js跟踪,如果请求缺少用户ID,则会被Analytics服务器忽略。因此请假定这是必需的。

链接网站访问者和测量协议操作

如果您想将后端用户与以前使用Analytics javascript ga.js 跟踪的访问者关联起来,可以从_utmacookie 中获取cid值。但我不建议这样做;每次它发生变化(终端或浏览器更改、清除cookie等),您都会失去与客户之前操作的链接。

更新

当问题被提出时,analytics.js还不存在。现在,cid存储在cookie _ga中。您可以使用以下JavaScript代码获取它:

ga(function(tracker) {
  var clientId = tracker.get('clientId');
});

目前为止,当你像上面的代码一样从跟踪器获取clientId时,它不会给你一个UUID,而是以“X.Y”格式给出两个随机的32位整数。这种实现将来可能会改变为UUID。

或者使用自己的值进行设置(例如后端生成的UUID):

ga('create', 'UA-XXXXX-Y', {'clientId': 'your_client_id'});

2
连接后端用户与以前由analytics.js跟踪的访问者不是“测量协议”的主要内容之一吗?该协议允许将引荐者/活动/着陆页与后来的非web结果进行关联。我怀疑正确的方法是从一开始就提供自己网站的clientId(使用https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId),这样它就可以轻松地同时用于analytics.js的页面内跟踪和您自己后来的测量协议操作。 - gojomo
21
clientId 表示客户端,例如 设备或者客户端 - 不是 用户。因此,不应将其设置为后端 UUID。谷歌之所以使其可写,仅是为了与测量协议一起使用。例如,要跟踪服务器端事件,您应该:
  1. 从 ga 中获取 clientId 值的 js 代码
  2. 将其发送到服务器(您可以将其存储在 session 中以供以后使用)
  3. 在服务器端使用该 clientId
- guidupuy
4
哦,将后端用户与 Google Analytics 相链接是尚未发布的“userId”的目的。即将推出! - guidupuy
1
那么什么是最佳方法呢?在服务器上生成cid(我正在使用node / universal-analytics),还是允许analytics.js管理cid,并从服务器上的cookie中检索它(仍然不确定如何做到这一点,格式看起来不同... req.cookies._ga:GA1.1.759500204.1374013344)。如果我在服务器上生成,似乎我需要为长期分析保持长时间运行的会话(例如express.session.MemoryStore()将不再适用)。 - Michael Dausmann
1
Math.round(2147483647 * Math.random()) 会产生一个有效的 cid 吗?看起来不够长。 - Ken Sharp
显示剩余2条评论

7
在Rails中:
  def save_google_analytics_client_id
    if current_user && cookies["_ga"]
      client_id = cookies["_ga"].split(".").last(2).join(".")
      if current_user.google_analytics_client_id != client_id
        current_user.google_analytics_client_id = client_id
        current_user.save
      end
    end
  end

请注意,谷歌警告直接读取 cookie 可能会导致格式更改。在撰写本文时,可以在此处找到该警告:https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#getting_the_client_id_from_the_cookie - rogerkk

3

我正在使用带有 Express 和 universal-analytics 模块的 Node,并选择使用嵌入在 _ga cookie 中的 cid,而不是在服务器端生成自己的 cid。

我的 server.js 文件如下:

app.use(function(req, res, next) {
  if(req.session && (!req.session.cid) && req.cookies._ga){
    //Use the cid already embedded in the _ga cookie and save to session so I can access from socket routes
    var gaSplit = req.cookies._ga.split('.');
    req.session.cid = gaSplit[2] + "." + gaSplit[3];
  };
  next();
});  

之后,我可以这样做...
ua = require('universal-analytics')
var visitor = ua('UAXXX', req.session.cid)

HTH


这个提交包括我所做的所有工作,以使服务器端GA集成正常工作(我想)https://github.com/hackify/hackify-server/commit/dc9244287b19b7a4c08136918cd213758f6dce11 - Michael Dausmann
2
可能会改为以下代码: req.session.cid = req.cookies._ga.split('.').slice(2, 4).join('.'); - waltfy
@MichaelDausmann,从你的例子来看,后端有data.userId。在我看来,我建议你开始使用服务器端的userID而不是客户端生成的clientID。这种方法可以解锁跨设备跟踪和增强的GA数据去重功能。他们在这个特定主题上有一篇很好的文章:https://support.google.com/analytics/answer/6205850?hl=en#clientid-userid - Vlad Mysla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接