2017-08-03 347 views
3

發送文件下載事件從服務器下載鏈接通過電子郵件發給客戶的谷歌分析

你好,
請找到你的產品在這裏:https://www.example.com/files/yourfile.zip

我d想要在Google Analytics中跟蹤此下載,作爲Goal轉換。

不幸的是,當用戶點擊鏈接時,文件是由網絡服務器直接發送的,而無需通過.html頁面。

如何跟蹤Google 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。

但另一方面,我不想使用非常少的二手黑客。這種常見情況的通常解決方案是什麼?

回答

2

谷歌分析實際上有一個從任意來源發送分析數據的協議。看到這裏:https://developers.google.com/analytics/devguides/collection/protocol/v1/

因此,讓您的網絡服務器發送一個分析事件給谷歌並不像看起來那麼可笑。我不確定是否可以直接鉤入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 

所以好像你需要做的與你在_ga餅乾查找有點字符串分割。 (我已經更新上述代碼)

EDIT 4:如果任何人的疑惑,這與上面提到的Cookie值在analytics.js腳本生成該請求。

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 
+0

感謝。我目前正在解析服務器日誌,但這很難手動提取信息。然後,將這些信息發送給GA更加困難。要有一個完整的自動化解決方案看起來很複雜(腳本從服務器日誌+ GA API中提取信息,將這些數據發送到GA +'cron'作業等)。我想應該有一個更簡單的解決方案,因爲*這是一個非常普遍的情況,想跟蹤網站上的下載?*非程序員博客誰想跟蹤他們給的免費PDF下載? – Basj

+0

1)聽起來不錯。你可以提供更多的信息,它將如何工作? – Basj

+0

Apache提供了mod_rewrite,它允許在客戶端沒有注意到的情況下重寫服務器上的URL。所以你可以把/downloads/cool.zip改寫成/download.php?file=cool.zip。然後,PHP腳本可以讀取文件參數,與Google Analytics交談併發送用戶請求的文件。 或者,而不是給直接下載鏈接到你的用戶,你可以發送出/download.php?file=something鏈接這將不需要任何服務器端URL重寫。 –