Site icon Soul & Shell Blog

利用 php-ga 在圖片中加入 Google Analytics 進行追蹤

PHP Google Analyticsanalytics-logo1

Google Analytics 提供了流量分析與統計的免費工具,一般來說都是在網頁中掛上 JavaScript 就可以進行資料蒐集,在 App 也可以透過 SDK 進行資料蒐集。那為什麼要在圖片中加入 Google Analytics 呢?要這樣做的情況比較特別,當有時候我們沒有網頁更改權限時,傳統的掛載方式就無法進行了。這樣的情況像是「露天拍賣」與「Y 拍」等等的電商平台都是禁止在商品描述中加入 JavaScript,然而在台灣的主流拍賣平台,對於分析功能實在有點弱,所以只少自己想辦法實作流量分析。

其實概念很簡單,既然無法在商品中加入 JavaScript 程式碼(總不能使用 XSS 攻擊吧!!),那我們就利用載入外站圖片的動作來蒐集統計資料,並且植入自己可以控制的 Cookie 來保持使用者資訊。大致的實現流程如下:

 

在這裡我們透過 php-ga 這個函式庫來完成 (可以在 GitHub 中取得),官方網站介紹的使用方法實在再簡單不過了,最最基本的程式碼如下:

use UnitedPrototype\GoogleAnalytics;

// Initilize GA Tracker
$tracker = new GoogleAnalytics\Tracker('UA-12345678-9', 'example.com');

// Assemble Visitor information
// (could also get unserialized from database)
$visitor = new GoogleAnalytics\Visitor();
$visitor->setIpAddress($_SERVER['REMOTE_ADDR']);
$visitor->setUserAgent($_SERVER['HTTP_USER_AGENT']);
$visitor->setScreenResolution('1024x768');

// Assemble Session information
// (could also get unserialized from PHP session)
$session = new GoogleAnalytics\Session();

// Assemble Page information
$page = new GoogleAnalytics\Page('/page.html');
$page->setTitle('My Page');

// Track page view
$tracker->trackPageview($page, $session, $visitor);

更有效地使用 php-ga 蒐集流量資訊

但是上述的程式碼並沒有持續地保留使用者的 Session 與 Visitor,造成每次執行都被判斷為新的使用者,這樣如果要對流量進行後續的分析,效果會打打折扣,完全沒有「跳出率」、「重新造訪」、「單一使用者瀏覽頁數」等等的資訊可以分析。

為了解決這個問題,我們可以利用 PHP 自有的 $_SESSION 來保留造訪者的連線,我已將這個專案 Fork 並且加上比較方便實作的功能,程式可以在 GitHub Project 取得,或者直接下載函式庫

最後整合圖片的使用方法如下:

<?php
// set time zone
date_default_timezone_set('Asia/Taipei');

// Initialize GoogleAnalytics
require(__DIR__ . '/libs/php-ga/autoload.php');
use UnitedPrototype\GoogleAnalytics;
$persistManager = new GoogleAnalytics\PersistManager();

// Initialize GA Tracker, Session and visitor
$tracker = $persistManager->makeTracker('UA-88888888-8', 'example.com');
$visitor = $persistManager->getVisitor();
$session = $persistManager->getSession();

// Assemble Page information
$page = new GoogleAnalytics\Page('/track.html');
$page->setTitle('Your Title');

// Track page view
$tracker->trackPageview($page, $session, $visitor);

// Store to $_SESSION
$persistManager->store();

// Load file
$filepath = __DIR__ . '/your-image.jpg';
$filename = basename($filepath);

// Set Http Herder
Header('Content-Description: File Transfer');
Header('Content-type: ' . mime_content_type($filename));
Header('Content-Transfer-Encoding: binary');
Header('Expires: 0');
Header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
Header('Pragma: public');
Header('Content-Length: ' . filesize($filepath));

// output image file
$fp = fopen($filepath, 'r');
while (!feof($fp)) {
    echo fgets($fp);
    ob_flush();
}
fclose($fp);

exit(0);

參考資料

Exit mobile version