Google Analytics перехватывает все запросы - PullRequest
5 голосов
/ 07 июля 2019

Я хотел бы получать обратный вызов каждый раз, когда 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 ]

2 голосов
/ 17 июля 2019

Google фактически использует gif для синхронизации данных со своим сервером, поэтому перехват XHR-запросов работать не будет.

В analytics.js есть официальный способ сделать это. через Задачи , вот небольшой пример:

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 голос
/ 12 июля 2019

Я бы продемонстрировал, как вы можете перехватить любой AJAX-вызов.Используя это универсальное решение, вы можете отфильтровать запросы GA и выполнить необходимые действия.

Я изменил этот ответ.

Идея этого решения заключается в измененииМетоды 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);
0 голосов
/ 09 июля 2019

возможно? Да практично? Нет. Посмотрите, как выглядит схема BigQuery для GA, и вы почувствуете сложность, которая скрывается за кулисами.

Тем не менее, я думаю, что вы МОЖЕТЕ сделать:

  1. Используйте GTM для реализации GA.
  2. Настройте пользовательский шаблон тега для ссылки на ваш собственный сервер, который будет собирать информацию. Передавая только те данные, которые вам нужны, вместо всего, что собирает GA.
  3. Запускайте новые пользовательские теги везде, где вы запускаете теги GA.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...