google-analytics - 谷歌分析代理

标签 google-analytics proxy measurement-protocol

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

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

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

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

最佳答案

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

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

Each calls includes at least the ID of the account you want to send data to, a client id that allows to group interactions into sessions (so it should be unique per visitor, but it must not identify a user personally), an interaction type (pageview, event, timing etc., some interactions types require additional parameters) and the version of the protocol you are using (at the moment there is only one version).

So the most basic example to record a pageview would look like this:

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');
现在您有了代码,但跟踪调用仍将发送到分析服务器(即,在您的情况下,它根本不会发送)。因此,您需要通过服务器重新路由调用。
为了使这成为可能,谷歌(通用)分析代码有一个 feature called "tasks".任务是跟踪代码中的函数,其中正在组装跟踪调用。
可以通过使用跟踪器对象的“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 的模型参数-function 包含(除了大量开销之外)有效负载,即包含分析数据的组装查询字符串。然后,您可以将 _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.js 的引用资料和 Measurement Protocol .

关于google-analytics - 谷歌分析代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29119361/

相关文章:

google-analytics - Google Analytics - 访客级自定义变量问题和观察

google-analytics - 向用户显示Google Analytics(分析)数据

python - conda SSL 错误

google-analytics-api - Google Measurement Protocol 离线应用和事件日期

google-analytics - Google Analytics.js发送方法

google-analytics - 如何正确使用谷歌分析测量协议(protocol)?

javascript - 来自 Google Analytics 的自定义维度值

apache - Apache作为代理,可为不同应用程序使用相同的URL和子路由

nginx - Docker Nginx反向代理

google-analytics - 使用测量协议(protocol)将事件发送到 Google Analytics 4 时,client_id 应该是什么?