每次Google Analytics(分析)将数据发送到服务器时,我都希望获得回调。我也想将相同的数据发送到我的服务器。有可能吗?
https://jsfiddle.net/bk1j8u7o/2/
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-143361924-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-143361924-1');
</script>
答案 0 :(得分:2)
Google实际上是使用gif将数据同步到其服务器,因此拦截XHR请求将不会起作用。
在analytics.js中,有一种官方的方法可以做到这一点。 via Tasks,这是一些未经测试的小示例:
ga(function(tracker) {
var originalSendHitTask = tracker.get('sendHitTask');
tracker.set('sendHitTask', function(model) {
var payLoad = model.get('hitPayload');
originalSendHitTask(model);
var gifRequest = new XMLHttpRequest();
var gifPath = "http://localhost/collect";
gifRequest.open('get', gifPath + '?' + payLoad, true);
gifRequest.send();
});
});
确保在执行此代码后发送pageView。
答案 1 :(得分:1)
我将演示如何拦截任何AJAX调用。通过这种通用解决方案,您可以过滤GA请求并采取所需的操作。
我修改了this答案。
此解决方案背后的想法是修改open
对象的send
和XMLHttpRequest
原型方法并在那里进行拦截。 IIFE获取XMLHttpRequest
对象,保存原始原型方法,安装新方法并从新方法中调用原始方法。而且,当然,您可以同时处理数据。
(function(XHR) {
//Save the original methods
var open = XHR.prototype.open;
var send = XHR.prototype.send;
//Hook new open method in order to get the url
XHR.prototype.open = function(method, url, async, user, pass) {
this._url = url;
//Call the original
open.call(this, method, url, async, user, pass);
};
//Hook here too. This will be executed just before the data is sent
XHR.prototype.send = function(data) {
if (this_url === GA_URL_CONST) //Symbolic const
SendDataToMyServer(data); //Symbolic Fn
//Call the original
send.call(this, data);
}
})(XMLHttpRequest);
答案 2 :(得分:0)
可能吗?是的,实用吗?不需要。看看GA的BigQuery schema是什么样子,您就会了解幕后的复杂性。
也就是说,我认为您可以做的是: