Передача треков Google Analytics сторонним доменам без javascript

от автора

О чем статья?

  • О междоменном отслеживании
  • О том, что если чего-то нет в официальной документации, то это не повод печалится, а повод добавить такую возможность.

Зачем передавать?

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

Почему без javascript?

  • Если нужно выполнить редирект пользователя после обработки логики запроса на сервере.
  • Google Analytics api и так хорошо документирован, а читать копипаст документации это не уровень хабра, не так ли?

Суть метода проста. Берем все куки вида __utm и передаем их, как параметры, в урле на другой домен. Ничего не происходит. Расходимся. Добавляем последним параметром __utmk, который является особым хешем всех остальных кук гугл аналитики. Поздравляю мы сделали, то что делаем функция _link в известном файле ga.js от Google Analytics.
И так если у вас переход на другие сайты обрабатывал контроллер, то вам не надо во все ссылки добавлять конструкцию вида:

onclick="_gaq.push(['_link', 'https://www.payment-system.com?contractId=example']); return false;" 

Если нужны исходники формирования хеша для ключа utmk, прошу в github.
Далее история о процессе получения данного метода.

1. Задание получено:
«Прокинуть гугл аналитику для всех переходов с сайта на платежную систему»
Описание:
«Теряем информацию [откуда пришел, что искал, как дошел до кнопки buy] о самых важных пользователях, которые купили наш софт.

Документация аналитики советует воспользоваться конструкцией вида:

onclick="_gaq.push(['_link', 'http://another-domain.com']); return false;" 

И поставить ей на все ссылки, которые ведут на другой домен.
Вот и проблема — у нас ссылок нет на платежную систему. Есть корзина с несколькими шагами. И контроллер, который определяет, какую платежную систему задействовать и с какими параметрами. После чего делает редирект пользователя на платежную систему.
В голову лезут „ленивые идеи“. Можно же сделать промежуточную страницу на которой пользователь будет нажимать кнопку подтверждения, с вызовом функции аналитики из доки. Или же javascript будет формировать ссылку/форму и перенаправлять пользователя. Но мы эти идеи откидываем сразу как ущербные и идем читать доку дальше.

A session from one domain can only be transferred to another domain via a properly configured click or form submission, or via _getLinkerURL.

И так. Нам доступны: клик пользователя, отправка формы, javascript метод. Only? Only! Realy?

Посмотрим, что же происходит когда пользователь нажимает на ссылку у которой установлен атрибут onclick.

поищем через поисковик наш сайт, переход по ссылке, имеем данные куки от аналитики:

__utma	31500988.382379344.1389384850.1389388916.1389389624.3 __utmb	31500988.1.10.1389389624 __utmc	31500988 __utmz	31500988.1389389624.3.2.utmcsr=yandex|utmccn=(organic)|utmcmd=organic|utmctr=наш_запрос 

Подробнее о каждой из кук тут.

Перейдем на платежную систему через тестовую html ссылку, которая вызывает _gaq.push(‘link’… описанный в документации.
Воспользовавшись консолью браузера (так удобнее) узнаем что в урл добавились параметры:

__utma	31500988.382379344.1389384850.1389388916.1389389624.3 __utmb	31500988.1.10.1389389624 __utmc	31500988 __utmz	31500988.1389389624.3.2.utmcsr=yandex|utmccn=(organic)|utmcmd=organic|utmctr=наш_запрос __utmk	88022362 __utmv	- __utmx	- 

Так же установились куки (уже на другом домене) utma, utmb, utmc, и главное utmz, в которую перенеслось значение utmcsr=yandex|utmccn=(organic)|utmcmd=organic|utmctr=наш_запрос

Далее зашел в тупик, попробовав передать без клиента 4 значения известных кук как параметры урла, но они упорно не хотели устанавливаться аналитикой как треки.
Анализ ga.js, ga_debug.js, а точнее их минификация не дали результата, попытка сделать beautifality ga.js тоже ни к чему не привела.

Внимательные уже заметили, что после javascript обработки появляются 3 новых параметра в запросе:

__utmk	88022362 __utmv	- __utmx	- 

Заметил это и я, но чуть позже. Немного покопав, наткнулся на данный комментарий к схожей по тематике статье на хабре.

Это оказались сорцы на Google Analytics Tracking For Adobe Flash.
Осталось дело за малым. Выяснить, что на основе всех кук формируется хеш и записывается в __utmk и переписать

java функцию генерации хеша:

/**      * Generate hash for input string. This is a global method, since it does not need      * to access any instance variables, and it is being used everywhere in the GATC module.      * @param input Input string to generate hash value on.      * @return Hash value of input string. If input string is undefined, or empty, return hash value of 1.      */     public function generateHash( input:String ):int     {         var hash:int      = 1; // hash buffer         var leftMost7:int = 0; // left-most 7 bits         var pos:int;           // character position in string         var current:int;       // current character in string                 // if input is undef or empty, hash value is 1         if(input != null && input != "")         {             hash = 0;                         // hash function             for( pos = input.length - 1 ; pos >= 0 ; pos-- )             {                 current   = input.charCodeAt(pos);                 hash      = ((hash << 6) & 0xfffffff) + current + (current << 14);                 leftMost7 = hash & 0xfe00000;                                 if(leftMost7 != 0)                 {                     hash ^= leftMost7 >> 21;                 }             }         }                 return hash;     } 

на PHP.

В завершении проверяем, что для одинаковых значений треков оба варианта ( javascript — ga.js — link() и php generateHash ) генерируют одинаковый ключ для __utmk и на стороннем домене устанавливаются нужные треки.

Вывод:

У нас появился новый способ междоменного отслеживания. Он не лучше, не хуже, просто другой ( серверный ).

ссылка на оригинал статьи http://habrahabr.ru/post/208706/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *