14

我有一种特殊情况,网站访问者可以从某个域访问该页面,但不能从其他域访问该页面。所以 HTML 和 assets 只要存储在服务器上就没有问题。另一方面,谷歌分析需要从谷歌服务器下载analytics.js,这是不可能的。

所以我正在寻找一种代理方法。网络服务器本身可以访问互联网,并且可以中继流量。为了向 Google 报告我的页面浏览量,我们从 Google 下载了一个单像素 GIF,如下所述:https ://developers.google.com/analytics/resources/concepts/gaConceptsTrackingOverview

我认为获取 GIF 中的所有参数并使用测量协议从服务器向 Google 报告会很容易——但难点是将所有这些信息都发送到服务器。下载analytics.js 并修改它以访问我自己的服务器,在我看来,这根本不是未来的证明。仅将当前页面从用户获取到服务器并不是什么大问题,但我们希望获取用户 ID、浏览器版本以及您通过 Analytics 获得的所有信息。

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

4

1 回答 1

20

更新:Google 已经发布了服务器端 GTM,它允许您通过自定义域代理请求和脚本。在我能想象的大多数用例中,这将是 dyi 代理的更优越的解决方案。


正如我在评论中指出的那样, utm.gif 不再使用。Google Analytics(分析)已完全切换到 Measurement Protocol,数据现在发送到 google-analytics.com/collect 上的 Measurement Protocol 端点。实际上,这仍然返回一个透明像素,因为使用参数调用图像是一种跨域边界传输信息的证明方式。

现在,您可以只使用 Measurement Protocol 来实现您自己的 Google Analytics(分析)跟踪器。

引用我自己的话:

每个调用至少包括您要向其发送数据的帐户的 ID、允许将交互分组到会话中的客户端 ID(因此每个访问者应该是唯一的,但不能识别用户个人)、交互类型 (浏览量、事件、时间等,某些交互类型需要额外的参数)和您使用的协议版本(目前只有一个版本)。

因此,记录浏览量的最基本示例如下所示:

www.google-analytics.com/collect/v=1&tid=UA-XXXXY&cid=555&t=pageview&dp=%2Fmypage

您可能想要添加用户 IP(将自动匿名)和用户代理。

但是,听起来您更喜欢使用标准分析代码来收集数据并通过您自己的服务器中继跟踪调用。虽然我没有在生产中使用以下内容,但我看不出它有任何不起作用的原因。

首先,您需要 analytics.js 文件。不鼓励自行托管文件,但给定的原因是代码有时会由 Google 更新,如果您自己托管,您可能会错过更新。这可以通过设置定期将文件下载到您的服务器的 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');

现在您有了代码,但跟踪调用仍将发送到分析服务器(即,在您的情况下,它根本不会发送)。因此,您需要通过服务器重新路由呼叫。

为了使这成为可能,谷歌(通用)分析代码具有称为“任务”的功能。任务是跟踪代码中的函数,其中正在组装跟踪调用。

可以通过使用跟踪器对象的“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 来创建图像请求)。

-function的模型参数sendHitTask包含(除了大量开销之外)有效负载,即包含分析数据的组装查询字符串。然后,您可以将 _ua.gif 设置为将请求代理到 google-analytics.com/collect 的脚本。

此时用户代理将是您的脚本,IP 地址将是您的服务器的,因此您需要包含 &uip(用户 IP 覆盖)和 &ua(用户代理覆盖)参数(https://groups.google.com /forum/#!msg/google-analytics-measurement-protocol/8TAp7_I1uTk/KNjI5IGwT58J)获取地理和技术信息。

如果您感觉更冒险,您可以改写它buildHitTask并尝试在那里添加其他参数(可能会更麻烦,因为您需要从某个地方获取 IP 地址)。

有关其他参数,请参阅analytics.jsMeasurement Protocol的参考。

于 2015-03-18T19:22:11.833 回答