JavaScriptが使いにくい携帯などの環境でGoogle Anlyticsを利用する場合は、通常このサイトで配布される1x1の画像を吐き出すサーバサイドのビーコンスクリプトを設置し、 Webサイドからリンクを張りますが、このサーバサイドのスクリプトのうちPerlのコードはCGI以外では実行しづらいモノなので、PSGIにアプリケーションにしてCPANにリリースしました。
加えて、タイムアウトの制御が細かくできるようLWPをFurlにし、勝手にビーコンが他人に利用されないようchecksumを追加しています。また、PSGIアプリケーションで利用できるURL生成用のクライアントライブラリもつくりました。
使い方。まずサーバサイド。
use WWW::GoogleAnalytics::Mobile::PSGI;
use Plack::Builder;
builder {
mount "/ga" => WWW::GoogleAnalytics::Mobile::PSGI->new(
secret => 'my very secret key',
timeout => 4,
);
...
};
サーバサイドは、単独のアプリケーションでも他のアプリケーションと同居でもどちらでもかまいません。Google Analyticsが障害を起こした際の影響を考えると分けたいとか思うかもしれません。実際の稼働率はわかりません。
secretはチェックサムのための秘密の文字列。クライアントライブラリと共通にします。timeoutはGoogleへの問い合わせの制限時間です。
クライアントサイドは、
use WWW::GoogleAnalytics::Mobile;
my $gam = WWW::GoogleAnalytics::Mobile->new(
secret => 'my very secret key',
base_url => '/ga',
account => '...',
);
my $image_url = $gam->image_url($env);
image_urlメソッドに渡すenvはPSGIのenvです。これで画像のurlが得られるのでテンプレート中に埋め込んで利用します。
いくつかTips。
WWW::GoogleAnalytics::Mobile::PSGIでGoogleにアクセス際にProxyを通すには、環境変数を利用します。
my $app = WWW::GoogleAnalytics::Mobile::PSGI->new()->to_app;
$app = sub {
local $ENV{http_proxy} = 'http://192.168.32.1;
$app->(shift);
};
な感じ。
また、Net::DNS::Liteを使っているので、googleにアクセスする際の名前解決の結果をCache::LRUなどを使ってキャッシュできます。
use WWW::GoogleAnalytics::Mobile::PSGI;
use Cache::LRU;
# setup cache for Net::DNS::Lite
$Net::DNS::Lite::CACHE = Cache::LRU->new(
size => 256,
);
おためしくださいませませ。