Преобразование файлов cookie Google Analytics в локальное хранилище/сеанс

UPDATE http://jsfiddle.net/musicisair/rsKtp/embedded/result/


Google Analytics устанавливает 4 файла cookie, которые будут отправляться со всеми запросами в этот домен (и с его поддоменами). Из того, что я могу сказать, сервер фактически не использует их напрямую; они отправляются только с __utm.gif в качестве параметра запроса.

Теперь, очевидно, Google Analytics читает, записывает и действует на свои значения, и они должны быть доступны для отслеживания GA script.

Итак, мне интересно, можно ли:

  • перепишите куки __utm* в локальное хранилище после того, как ga.js написал их
  • удалить их после выполнения ga.js
  • переписать куки файлы из локального хранилища обратно в форму cookie прямо перед тем, как ga.js читает их
  • начать

Или, патч обезьяны ga.js, чтобы использовать локальное хранилище, прежде чем он начнет чтение/запись cookie.

Очевидно, что если мы уходим так далеко, чтобы удалить куки __utm*, мы также захотим использовать вариант Async Analytics.

Я предполагаю, что голос был пустым, потому что я не задавал вопросов. DOH!

Мои вопросы:
Можно ли это сделать, как описано выше?
Если да, то почему это не было сделано?


У меня есть шаблон шаблона HTML/CSS/JS по умолчанию, который пропускает YSlow, PageSpeed ​​и Chrome Audit с почти идеальными баллами. Я действительно ищу способ сжать оставшиеся байты cookie из Google Analytics в браузерах, которые поддерживают локальное хранилище.

Ответ 1

Используйте это:

(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.google-analytics.com/analytics.js','ga');

if(window.localStorage) {
    ga('create', 'UA-98765432-1', 'www.example.com', {
      'storage': 'none'
      , 'clientId': window.localStorage.getItem('ga_clientId')
    });
    ga(function(tracker) {
      window.localStorage.setItem('ga_clientId', tracker.get('clientId'));
    });
}
else {
    ga('create', 'UA-98765432-1', 'www.example.com');
}
ga('send', 'pageview');

Во-первых, я проверяю, поддерживается ли localStorage. Если он поддерживается, опция 'storage': 'none' отключит файлы cookie. Теперь мы можем установить clientId из localStorage. Если он пуст, Google Analytics создаст новый для нас. Мы сохраняем новый (или существующий) clientid в localStorage после загрузки трекера.

Если localStorage не поддерживается, я просто использую метод регулярной аналитики. После инициализации я отправляю страницуView через ga('send', 'pageView').

Кроме того, проверьте этот список: http://plnkr.co/MwH6xwGK00u3CFOTzepK

Ответ 2

Некоторые эксперименты в хроме показывают, что для этого может быть возможно использовать геттеры и сеттеры для исправления document.cookie для чего-то вроде:

document.__defineGetter__('cookie', function () {
    // Replace this with code to read from localstorage
    return "hello";
});
document.__defineSetter__('cookie', function (value) {
    // Replace this with code to save to localstorage
    console.log(value);
});

ga.js(или любой другой javascript) может запускать и получать доступ к файлам cookie как обычно, они просто не передаются на сервер.

Очевидно, что это будет работать только в некоторых браузерах. Браузеры, в которых он не работает, должны вернуться к обычным файлам cookie.

Есть некоторые связанные идеи в этом вопросе: Возможно ли издеваться над document.cookie в JavaScript?

Ответ 3

Да, это можно сделать. Вам нужно только запросить __utm.gif с параметрами. Остальная часть данных используется только для отслеживания источника, времени начала сеанса и/или предыдущих посещений.

Вы можете легко перенести файлы cookie в оба конца, поэтому ваш первый подход должен работать нормально.

Если ваш второй подход работает... не уверен. Я не знаю код ga.js, достаточный для оценки того, что было бы или было бы нелегко.

Существует также третий вариант, запустите свою собственную версию ga.js. Вы не обязаны использовать версию Google.

Можно ли это сделать, как описано выше? Да

Почему это не было сделано?

  • Файлы cookie невелики, не так уж много пользы, если вы используете cookieless-домены для всего своего статического контента.
  • это менее удобно, поскольку многие браузеры еще не поддерживают его