Отправить событие загрузки файла с сервера в Google Analytics [дубликат]


На этот вопрос уже есть ответ здесь:

Ссылка на скачивание отправляется клиенту по электронной почте:

Привет,
Пожалуйста, найдите свой продукт здесь: https://www.example.com/files/yourfile.zip

Я бы хотелось бы отслеживать эту загрузку в Google Analytics как конверсию Goal.

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

Как отследить такую прямую загрузку файла внутри Analytics?

  1. Должен ли я добавить фиктивную HTML-страницу "посередине", которая будет использовать фрагмент отслеживания analytics.js и отправлять событие загрузки в GA с ga.send(...), а затем перенаправлять на фактический файл через 500 миллисекунд с setTimeout(redirect, 500)? Действительно ли это чистое и безопасное решение? Я вижу много небольших потенциальных проблем: 500 мс в порядке? какой тип перенаправления следует использовать? Кроме того, пользователь с отключенным JS никогда не получит свой файл... или, если использовать <noscript>, преобразование цели не может быть записано.

  2. Есть ли способ попросить Apache (который обслуживает yourfile.zip клиенту) или PHP отправить событие отслеживания в GoogleAnalytics при подаче этого файла?

  3. Еще один решение?

Похоже, что решение 2. будет иметь преимущество в 100% надежности, независимо от того, включен ли JS у клиента или нет.

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

Author: Basj, 2017-08-03

1 answers

В Google analytics фактически есть протокол для отправки аналитических данных из произвольных источников. Смотрите здесь: https://developers.google.com/analytics/devguides/collection/protocol/v1/

Таким образом, отправка вашим веб-сервером события аналитики в Google не так сложна, как может показаться. Я не уверен, что вы можете напрямую подключиться к Apache для генерации этих событий. Однако я вижу, по крайней мере, два решения.

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

ОТРЕДАКТИРУЙТЕ пример решения 1:
Убедитесь, что до или после тегов нет пробелов, потому что это будет частью фактического ответа, отправленного клиенту.

Download.php :

<?php
    // Read ?file=xxx URL parameter
    $requestedFile = $_GET["file"];

    // Read Google Analytics cookie
    $rawCookie = $_COOKIE["_ga"];
    $splitCookie = explode('.', $rawCookie);
    $trackingId = $splitCookie[2] . '.' . $splitCookie[3];

    // Create Google Analytics request data (see here https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide)
    $data = array('v' => 1, 
                  'tid' => 'UA-XXXXX-Y', 
                  'cid' => $trackingId, 
                  't' => 'event', 
                  'ec' => 'download', 
                  'ea' => 'download', 
                  'el' => $requestedFile);

    // Create the request options
    $options = array(
        'http' => array(
            'method' => 'POST',
            'content' => http_build_query($data)
        )
    );

    $context = stream_context_create($options);

    // Send GA request
    $result = file_get_contents('https://www.google-analytics.com/collect', false, $context);

    // GA request failed
    if($result === FALSE) { /* Error */ }

    // Requested file does not exist
    if(!file_exists($requestedFile)) { /* Error */ }

    // Set response headers for binary data
    header('Content-Type: application/octet-stream');
    header('Content-Length: ' . filesize($requestedFile));

    // Open the requested file
    $fileHandle = fopen($requestedFile, 'r');

    // Write the requested file to stdout (which is what the client receives)
    print fread($fileHandle, filesize($requestedFile));
    flush();

    // Close the requested file again
    fclose($fileHandle);

    exit;
?>

.правила htaccess/mod_rewrite:

RewriteEngine on
RewriteUrl ^/download/(.*)$ download.php?file=$1 [L]

Нет, прошла целая вечность с тех пор, как я написал свой последний PHP-код, и я не тестировал это. Но это должно дать довольно хорошая идея о том, как реализовать вариант 1)

ПРАВКА 2: Если вы отправляете запрос на отслеживание в www.google-analytics.com/debug/collect вы получите некоторую информацию о проверке, сообщающую вам, является ли ваш запрос действительным или нет (однако он не будет отслеживать событие).

ПРАВКА 3: Хорошо, итак, я проверил страницу, которая использует analytics.js . Скрипт устанавливает следующие файлы cookie:

_ga=GA1.3.1788966449.1501761573
_gid=GA1.3.1010429060.1501761573

Позже в запросах на сбор он устанавливает

cid:1788966449.1501761573
_gid:1010429060.1501761573

Так что, похоже, вам нужно сделать небольшое разделение строк с тем, что вы найдете в файле cookie _ga. (Я обновил приведенный выше код)

ПРАВКА 4: На случай, если кому-то интересно, это запрос analytics.js скрипт генерирует файлы cookie со значениями, указанными выше.

GET https://www.google-analytics.com/collect?v=1&_v=j56&a=1178408574&t=pageview&_s=1&dl=https%3A%2F%2Fdevelopers.google.com%2Fanalytics%2Fdevguides%2Fcollection%2Fanalyticsjs%2Fcommand-queue-reference&ul=de&de=UTF-8&dt=The%20ga%20Command%20Queue%20Reference%20%C2%A0%7C%C2%A0%20Analytics%20for%20Web%20(analytics.js)%20%C2%A0%7C%C2%A0%20Google%20Developers&sd=24-bit&sr=1920x1200&vp=1899x1072&je=0&_u=QDCAAAIhI~&jid=&gjid=&cid=1788966449.1501761573&tid=UA-41425441-2&_gid=1010429060.1501761573&z=1116872044
 2
Author: Nicolas Ristock, 2017-08-03 12:20:22