Google Analytics(分析)会拦截所有请求

时间:2019-07-07 13:47:56

标签: javascript google-analytics

每次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>

3 个答案:

答案 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对象的sendXMLHttpRequest原型方法并在那里进行拦截。 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是什么样子,您就会了解幕后的复杂性。

也就是说,我认为您可以做的是:

  1. 使用GTM实施GA。
  2. 设置自定义标签模板,以引用您自己的服务器来收集信息。仅传递您需要的数据,而不传递GA收集的所有信息。
  3. 在触发GA标签的任何地方触发新的自定义标签。