Google 分析代理
Google Analytics proxy
我有一种特殊情况,网站访问者可以从某个域访问页面,但不能访问其他域。所以HTML和assets只要存放在服务器上就没有问题。 Google 另一方面,分析需要从 Google 的服务器下载 analytics.js,这是不可能的。
所以我正在寻找一种方法来代理它。网络服务器本身可以访问互联网并可以中继流量。要向 Google 报告我的页面浏览量,请从 Google 下载单个像素 GIF,如下所述:https://developers.google.com/analytics/resources/concepts/gaConceptsTrackingOverview
我认为获取 GIF 中的所有参数并使用测量协议从服务器向 Google 报告会很容易 - 但难点在于将所有这些信息发送到服务器。下载 analytics.js 并修改它以转到我自己的服务器在我看来是一种黑客攻击,根本不是未来的证明。从用户到服务器获取当前页面没什么大不了的,但是我们想要获取用户 ID、浏览器版本以及您通过 Analytics 获取的所有内容。
你会怎么做?您找到解决方案了吗?
更新:Google 已发布 server-side GTM,它允许您通过自定义域代理请求和脚本。在我能想象的大多数用例中,这将是比 dyi 代理更好的解决方案。
正如我在评论中指出的那样,utm.gif 已不再使用。 Google Analytics 已完全切换到 Measurement Protocol,数据现在发送到位于 google-analytics.com/collect 的 Measurement Protocol 端点。实际上,这仍然是 return 透明像素,因为使用参数调用图像是一种跨域边界传输信息的验证方式。
现在,您可以只使用 Measurement Protocol 来实施您自己的 Google Analytics 跟踪器。
至:
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 代码来收集数据并通过您自己的服务器中继跟踪调用。虽然我没有在生产中使用过以下内容,但我看不出它不起作用的任何原因。
首先您需要 analytics.js 文件。不鼓励自托管文件,但给定的原因是 Google 有时会更新代码,如果您自己托管它,您可能会错过更新。这可以通过设置定期将文件下载到您的服务器的 cron 作业来解决,这样您就始终拥有最新版本。
接下来您将调整 GA bootstrap 函数以从您自己的服务器加载代码:
(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(通用)分析代码有一个 feature called "tasks". 任务是跟踪代码中的函数,跟踪调用正在其中组装。
可以通过使用跟踪器对象的“设置”函数修改任务,使用任务名称作为参数并传递一个overwrites/overloads任务函数的函数。
以下几乎是 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.js and the Measurement Protocol 的参考资料。
我有一种特殊情况,网站访问者可以从某个域访问页面,但不能访问其他域。所以HTML和assets只要存放在服务器上就没有问题。 Google 另一方面,分析需要从 Google 的服务器下载 analytics.js,这是不可能的。
所以我正在寻找一种方法来代理它。网络服务器本身可以访问互联网并可以中继流量。要向 Google 报告我的页面浏览量,请从 Google 下载单个像素 GIF,如下所述:https://developers.google.com/analytics/resources/concepts/gaConceptsTrackingOverview
我认为获取 GIF 中的所有参数并使用测量协议从服务器向 Google 报告会很容易 - 但难点在于将所有这些信息发送到服务器。下载 analytics.js 并修改它以转到我自己的服务器在我看来是一种黑客攻击,根本不是未来的证明。从用户到服务器获取当前页面没什么大不了的,但是我们想要获取用户 ID、浏览器版本以及您通过 Analytics 获取的所有内容。
你会怎么做?您找到解决方案了吗?
更新:Google 已发布 server-side GTM,它允许您通过自定义域代理请求和脚本。在我能想象的大多数用例中,这将是比 dyi 代理更好的解决方案。
正如我在评论中指出的那样,utm.gif 已不再使用。 Google Analytics 已完全切换到 Measurement Protocol,数据现在发送到位于 google-analytics.com/collect 的 Measurement Protocol 端点。实际上,这仍然是 return 透明像素,因为使用参数调用图像是一种跨域边界传输信息的验证方式。
现在,您可以只使用 Measurement Protocol 来实施您自己的 Google Analytics 跟踪器。
至
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 代码来收集数据并通过您自己的服务器中继跟踪调用。虽然我没有在生产中使用过以下内容,但我看不出它不起作用的任何原因。
首先您需要 analytics.js 文件。不鼓励自托管文件,但给定的原因是 Google 有时会更新代码,如果您自己托管它,您可能会错过更新。这可以通过设置定期将文件下载到您的服务器的 cron 作业来解决,这样您就始终拥有最新版本。
接下来您将调整 GA bootstrap 函数以从您自己的服务器加载代码:
(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(通用)分析代码有一个 feature called "tasks". 任务是跟踪代码中的函数,跟踪调用正在其中组装。
可以通过使用跟踪器对象的“设置”函数修改任务,使用任务名称作为参数并传递一个overwrites/overloads任务函数的函数。
以下几乎是 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.js and the Measurement Protocol 的参考资料。