【问题标题】:Send file download event from server to Google Analytics [duplicate]将文件下载事件从服务器发送到 Google Analytics [重复]
【发布时间】:2023-03-13 18:00:01
【问题描述】:

非常相关和有帮助:Send event to Google Analytics using API server sided


下载链接通过电子邮件发送给客户

你好,
请在此处找到您的产品:https://www.example.com/files/yourfile.zip

我想在 Google Analytics 中跟踪此下载,作为Goal 转化。

不幸的是,当用户点击链接时,文件由网络服务器直接传递,没有经过 .html 页面。

如何在 Analytics 中跟踪此类直接文件下载?

  1. 我是否应该在“中间”添加一个虚拟 HTML 页面,该页面将使用 analytics.js 跟踪 sn-p 并使用 ga.send(...) 向 GA 发送下载事件,然后在 500 毫秒后重定向到实际文件setTimeout(redirect, 500)?它真的是一个干净安全的解决方案吗?我看到许多潜在的小问题:500 毫秒可以吗?应该使用什么样的重定向?此外,禁用 JS 的用户将永远无法获得他的文件...或者如果使用 <noscript> 则无法记录目标转换。

  2. 有没有办法让 Apache(谁为客户端提供 yourfile.zip)或 PHP 在提供此文件时向 GoogleAnalytics 发送跟踪事件?

  3. 另一种解决方案?

似乎解决方案 2. 具有 100% 可靠的优势,无论客户端是否启用了 JS。

但另一方面,我不想使用很少使用的 hack。对于这种非常常见的情况,通常的解决方案是什么?

【问题讨论】:

标签: javascript php apache google-analytics analytics.js


【解决方案1】:

Google 分析实际上有一个用于从任意来源发送分析数据的协议。见这里:https://developers.google.com/analytics/devguides/collection/protocol/v1/

因此,让您的网络服务器向 Google 发送分析事件并不像看起来那么难。我不确定您是否可以直接连接到 Apache 以生成这些事件。不过,我确实看到了至少两种解决方案。

1) 将所有下载重定向到服务器端脚本,该脚本发送数据并可以生成所需的分析事件。
2) 解析服务器日志并从中生成分析事件。

解决方案 1 的编辑示例:
请确保标签前后没有空格,因为这将是发送给客户端的实际响应的一部分。

下载.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

因此,您似乎需要对 _ga cookie 中的内容进行一些字符串拆分。 (我已经更新了上面的代码)

编辑 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

【讨论】:

  • 谢谢。我目前正在解析服务器日志,但是手动提取信息非常困难。然后,我认为将这些信息发送给 GA 更加困难。拥有一个完全自动化的解决方案似乎很复杂(从服务器日志中提取信息的脚本 + GA API 以将此数据发送到 GA + cron 工作等)。我想应该有一个更简单的解决方案,因为想要跟踪网站上的下载是一种非常常见的情况?想要跟踪他们提供的免费 PDF 下载的非程序员博客作者如何?
  • 1) 听起来不错。你能提供更多信息吗?
  • Apache 提供了 mod_rewrite,它允许重写服务器上的 URL,而客户端不会注意到它。因此,您可以将 /downloads/cool.zip 之类的内容重写为 /download.php?file=cool.zip。然后 PHP 脚本可以读取文件参数,与 Google Analytics 对话并发送用户请求的文件。或者,您可以发送不需要任何服务器端 URL 重写的 /download.php?file=something 链接,而不是直接向您的用户提供下载链接。
  • 好主意@NicolasRistock。但是 PHP 可以访问客户端 UUID(存储在客户端 cookie 中)吗? PHP 需要对 GoogleAnalytics 说“客户端 #3298474 已下载文件”,但 PHP 是否有权访问此 UUID?
  • 关于edit3:这意味着在内部,我们放置在页面上的analytics.js sn-p 也是如此:它向/collect?v=... 发送请求。很高兴知道!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2015-06-14
  • 2013-09-23
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多