PHP Google Analytics
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);