Google Analytics代理

14

我有一个特殊情况,访问该网站的访客只能从某个特定域名访问页面,其他域名不能访问。因此,只要HTML和资产存储在服务器上,就不会有问题。另一方面,Google Analytics需要从Google的服务器下载analytics.js,这是不可能的。

因此,我正在寻找一种代理的方法。Web服务器本身具有Internet访问权限,可以中继流量。要向Google报告我的页面视图,需要从Google下载单个像素GIF,如此描述:https://developers.google.com/analytics/resources/concepts/gaConceptsTrackingOverview

我认为很容易获取GIF中的所有参数并使用测量协议从服务器向Google报告 - 但是困难在于将所有此信息传递到服务器。将analytics.js下载并修改为连接到自己的服务器,对我来说似乎是一个不可持续的黑客行为。仅仅将当前页面从用户处传递到服务器并不是什么大问题,但我们希望获取用户ID、浏览器版本以及Analytics所提供的所有信息。

你会怎么做?你能找到解决方案吗?


我需要一些时间才能回答这个问题(需要解释一下,而且我现在正在工作),但目前你链接中的信息已经过时了。当前版本的GA JavaScript客户端本身是基于测量协议构建的,因此会将数据发送到测量协议端点(仍然返回gif),并且参数名称已更改。 - Eike Pierstorff
好的,知道了!那我以后期待你更多的帮助 :) 到目前为止谢谢你。 - Tony Gustafsson
只是出于好奇,您是否曾在生产中使用过这个,并且它的效果如何? - Eike Pierstorff
@EikePierstorff,很遗憾,不行。我相信我可以利用下面的信息做出一些东西,但客户优先考虑其他事情。非常感谢您的答案,也许将来我会用到它。 - Tony Gustafsson
我不使用跟踪像素,但是由于这篇文章(http://kennystechtalk.blogspot.com/2016/03/adblockanalytics.html),我成功地使用了GA。 - Ken Sharp
1个回答

20
更新:Google已经发布了服务器端GTM,可以通过自定义域代理请求和脚本。在我能想象到的大多数用例中,这将是比DIY代理更优越的解决方案。
如我在评论中指出的那样,utm.gif 已不再使用。Google Analytics 已完全转向测量协议,并且数据现在发送到 google-analytics.com/collect 上的测量协议终端。实际上,这仍会返回一个透明像素,因为使用参数调用图像是跨域传输信息的一种可行方式。
现在,您可以使用测量协议来实现自己的 Google Analytics 追踪器。
对于引用自己
每个调用至少包括要发送数据的账户ID,一个客户端ID,用于将交互分组为会话(因此应该对每个访问者唯一,但不必个人识别用户),一个交互类型(页面视图、事件、时间等,某些交互类型需要额外的参数)以及您正在使用的协议版本(目前只有一个版本)。
因此,记录页面浏览量的最基本示例如下: www.google-analytics.com/collect/v=1&tid=UA-XXXXY&cid=555&t=pageview&dp=%2Fmypage 您可能希望添加用户的IP地址(将自动匿名化)和用户代理。
但是,听起来您更喜欢使用标准分析代码收集数据,并通过自己的服务器中继跟踪调用。虽然我没有在生产中使用以下内容,但我认为它应该可以工作。

首先,您需要获取analytics.js文件。不建议自行托管该文件,因为谷歌有时会更新代码,如果您自己托管它,则可能会错过更新。可以通过设置定期下载该文件的cron作业来解决此问题,以便始终拥有最新版本。

接下来,您需要调整GA引导函数以从您自己的服务器加载代码:

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.myserver.com/analytics.js','ga');

现在你已经有了代码,但跟踪调用仍将被发送到分析服务器(即在您的情况下根本不会被发送)。因此,您需要通过您的服务器重新路由该调用。
为了实现这一点,Google(Universal)Analytics代码具有一个名为“任务”的功能。任务是跟踪代码中的函数,其中跟踪调用正在被组装。
可以使用跟踪器对象的“set”函数修改任务,使用任务名称作为参数,并传递覆盖/重载任务函数的函数。
以下几乎是来自Google文档的示例(除了我省略了仍然向Google发送数据的部分 - 您此时不需要此部分):
ga('create', 'UA-XXXXX-Y', 'auto');

ga(function(tracker) {

  tracker.set('sendHitTask', function(model) {
    var payLoad = model.get('hitPayload');
    var gifRequest = new XMLHttpRequest();
    var gifPath = "/__ua.gif";
    gifRequest.open('get', gifPath + '?' + payLoad, true);
    gifRequest.send();
  });
});

ga('send', 'pageview');   

现在,这将把数据发送到名为__ua.gif的文件中,该文件位于您自己的服务器上(如果您需要跨域发送数据,您可以简单地执行var ua = new Image; ua.src = gifPath + '?' + payLoad来创建图像请求)。 sendHitTask函数的模型参数包含(除了很多开销之外)有效负载,即包含分析数据的组装查询字符串。然后,您可以使_ua.gif成为一个脚本,代理请求到google-analytics.com/collect。
此时,用户代理将是您的脚本,IP地址将是您的服务器的IP地址,因此您需要包括&uip(用户IP覆盖)和&ua(用户代理覆盖)参数(https://groups.google.com/forum/#!msg/google-analytics-measurement-protocol/8TAp7_I1uTk/KNjI5IGwT58J)以获取地理和技术信息。
如果你想更加冒险,你可以覆盖buildHitTask并尝试在那里添加额外的参数(可能会更麻烦,因为你需要从某个地方获取IP地址)。
有关其他参数,请参阅analytics.jsMeasurement Protocol的参考文档。

1
太棒了!非常感谢你的回答。我会再多了解一些关于任务的知识,看看能否解决这个问题 :) - Tony Gustafsson
现在想到的一个问题是很难设置超时时间 - 对于移动用户来说,1秒并不算太多,如果我增加它,一些记录将会丢失。我将首先尝试使用AJAX加载analytics.js,如果成功了 - 再执行正常的代码片段(如果我幸运的话,浏览器会缓存它,不会下载两次)。 - Tony Gustafsson
1
希望能看到 GA 版本 4 的方法。 - adi

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