【问题标题】:Google analytics intercept all requests谷歌分析拦截所有请求
【发布时间】:2019-07-07 13:47:56
【问题描述】:

我希望每次 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>

【问题讨论】:

  • 你可以考虑使用 serviceworker。您应该能够拦截 GA 网络请求(可能是 POST),并按照您的意愿进行响应。我建议在执行此操作之前检查 GA 条款和条件。

标签: javascript google-analytics


【解决方案1】:

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。

【讨论】:

    【解决方案2】:

    我将演示如何拦截任何 AJAX 调用。从此通用解决方案中,您可以过滤 GA 请求并采取您想要的操作。

    我修改了this的答案。

    这个解决方案背后的想法是修改XMLHttpRequest对象的opensend原型方法并在那里进行拦截。 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);
    

    【讨论】:

    • 请在我的 jsfiddle 中进行。据我所知,它不适用于 ga
    • 这不起作用,因为 Analytics 不限于使用 XHR 进行事件报告。 transport method(图像、信标、XHR)是默认自动选择的,但我认为跟踪像素(图像加载请求)使用频率最高。
    【解决方案3】:

    可能吗?是的,实用吗?不。看看BigQuery schema for GA 的样子,您就会了解幕后的复杂性。

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

    1. 使用 GTM 实现 GA。
    2. 设置自定义标记模板以引用您自己的服务器,该服务器将收集信息。只传递您需要的数据,而不是 GA 收集的所有数据。
    3. 在触发 GA 代码的任何位置触发新的自定义代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2017-02-09
      相关资源
      最近更新 更多