Преобразование файлов 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-домены для всего своего статического контента.
- это менее удобно, поскольку многие браузеры еще не поддерживают его