Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。
Perlスクリプトを作ったんだけど... 動かない! なんでだろー。ちゃんと毎ページ呼んでるし、GETリクエストも遅れてるのに... 統計に反映されてない! ga.jsだからかと思ってUrchin.jsでアクティベートもしたのにダメだった。ちなみに元ネタはコレ。
動作確認できました。ソースは記事中の追記にて。
- Google Analytics without javascript!,Linklove
- ケータイサイトでGoogle Analyticsを利用するためのライブラリ,ke-tai.org
- Google AnalyticsのAnalysis、そして滞在時間のウソ,404 Blog Not Found
原理は簡単。Google Analyticsで呼び出してるJSは――読むのすっごいダルいんだけど――単に「http://www.google-analytics.com/__utm.gif」というGIF画像をリクエストしてるだけらしい。画像を読み込みはJavaScriptでクロスドメイン処理を行うときのセオリーだから、要はリファラとかUAだとかって各種情報をくっつけたGETリクエストを毎ページ送ってカウントしてるわけだ。
んで、話題の携帯analyticsモジュールはPHPからGETリクエストを送信することでGoogle Analyticsに対応してる。既にちゃんと動作確認も取れている(らしい)PHPコードを元に、だいたい同じような動作をするPerlコードに書き直したのが、以下のコード。
package Util;
use strict;
use LWP::UserAgent;
sub GoogleAnalystics {
my $domainH = '169191153'; #for test '.archiva.jp' only
my $utmn = int(rand(9999999998)) + 1; #random number
my $visitorID = int(rand(2147483646)) + 1; #number under 2147483647
my $utmac = 'UA-xxxxxxx-x';
my $utmhn = 'xxxxx.jp';
my $today = time();
my $referer = $ENV{'HTTP_REFERER'};
my $utmp = $ENV{'REQUEST_URI'};
my $utmsr = '-'; #1024x768
my $utmsc = '-'; #32-bit
my $utmul = '-'; #en
my $utmje = '0'; #java_enable / 1
my $utmfl = '-'; #flash_version / 9.0%20r28
my $utmdt = '-'; #page title
#utmcc = cookie settings
# __utma=<domain hash>.<unique visitor id>.<firstiTime>.<lastTime>.<currentTime>.<visit count>
#
my $urchinUrl = 'http://www.google-analytics.com/__utm.gif'
."?utmwv=1"
."&utmn=$utmn"
."&utmcs=$utmcs"
."&utmsr=$utmsr"
."&utmsc=$utmsc"
."&utmul=$utmul"
."&utmje=$utmje"
."&utmfl=$utmfl"
."&utmdt=$utmdt"
."&utmhn=$utmhn"
."&utmr=$referer"
."&utmp=$utmp"
."&utmac=$utmac"
."&utmcc="
.'__utma%3D'.$domainH.'.'.$visitorID.'.'.$today.'.'.$today.'.'.$today.'.2'.'%3B%2B'
.'__utmb%3D'.$domainH.'%3B%2B'
.'__utmc%3D'.$domainH.'%3B%2B'
.'__utmz%3D'.$domainH.'.'.$today.'.2.2'.'utmccn%3D\(direct\)%7Cutmcsr%3D\(direct\)%7Cutmcmd%3D\(none\)%3B%2B
.'__utmv%3D'.$domainH.'.'.$domainH.'%3B'
;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => $urchinUrl);
if($ENV{'HTTP_ACCEPT_LANGUAGE'}) { $request->header('Accept-language' => $ENV{'HTTP_ACCEPT_LANGUAGE'}); }
if($ENV{'HTTP_USER_AGENT'}) { $ua->agent($ENV{'HTTP_USER_AGENT'}); }
my $response = $ua->request($request);
# if ($response->is_success) {
# use Data::Dumper;
# warn Dumper $response;
# }
}
1;
...で、Util::GoogleAnalystics
を毎ページロードの度に呼び出すことでGoogle Analyticsに反映される ...筈なんだけどなあ? なんでダメなんだろ。domain hash も cookie numberも元ネタではランダムにしてるから、問題にはならないと思うんだが...。
ちなみにutmccはPCならCookieから読み込んでただろう情報ですな。Firefox(Web Developer)でトラッキングコード埋め込んだページを確認すると一発で判る。値に関しては、この辺が参考になった。携帯サイトではCookie保存できないから、訪問時間とか参照回数は記録できない ...ので、全アクセスがユニーク扱いになる仕様。セッション引き回してるような会員制サービスなら、もうちょっと正確なデータを扱えるかもね。
頑張って修正しても結果が判るのは1日後だったりするから、非常にめんどくさい。ここまで1weekほど粘ってみたけど、もうお手上げですよ! 教えて偉い人!
memo: LWPだからダメなんだと重い、wgetにしてみてもダメだった (・・。)ゞ
memo: 200 OKでレスポンス返って来てても、ダメなものはダメらしい(´・ω・)
memo: PHPで書いてみたら、あっさり成功した Σ(゜Д゜;≡;゜д゜)
追記(2009.03.31)
相変わらず何が原因なのかさっぱり不明ですが、下記Perlコードにて動作確認できました。
package Util;
use strict;
use LWP::UserAgent;
sub GoogleAnalystics {
my $utmac = "UA-xxxxxxx-x";
my $utmhn = "http://xxxxx.jp/";
my $today = time();
my $referer = $ENV{'HTTP_REFERER'};
my $utmp = '/'.$u_domain.$ENV{'REQUEST_URI'};
my $domainH = '84928587'; #for test '.dgjmp.jp' only;
my $utmn = int(rand(9999999998)) + 1; #random number
my $visitor = int(rand(2147483646)) + 1; #number under 2147483647
my $utmcs = 'Shift-JIS'; #character_coding
my $utmsr = '-'; #1024x768
my $utmsc = '-'; #32-bit
my $utmul = 'ja'; #en
my $utmje = '0'; #java_enable / 1
my $utmfl = '-'; #flash_version / 9.0%20r28
my $utmdt = '-'; #page title
#utmcc = cookiesettings
# __utma=<domain hash>.<unique visitor id>.<firstiTime>.<lastTime>.<currentTime>.<visit count>
my $urchinUrl = 'http://www.google-analytics.com/__utm.gif?utmwv=1'
."&utmn=$utmn"
."&utmcs=$utmcs"
."&utmsr=$utmsr"
."&utmsc=$utmsc"
."&utmul=$utmul"
."&utmje=$utmje"
."&utmfl=$utmfl"
."&utmdt=$utmdt"
."&utmhn=$utmhn"
."&utmr=$referer"
."&utmp=$utmp"
."&utmac=$utmac"
.'&utmcc=__utma%3D'.$domainH.'.'.$visitor.'.'.$today.'.'.$today.'.'.$today.'.2'
.'%3B%2B__utmb%3D'.$domainH
.'%3B%2B__utmc%3D'.$domainH
.'%3B%2B__utmz%3D'.$domainH.'.'.$today.'.2.2.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)'
.'%3B%2B__utmv%3D'.$domainH.'.'.$visitor.'%3B'
;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => $urchinUrl);
if ($ENV{'HTTP_ACCEPT_LANGUAGE'}) {
$request->header('Accept-language' => $ENV{'HTTP_ACCEPT_LANGUAGE'});
}
if ($ENV{'HTTP_USER_AGENT'}) {
$ua->agent($ENV{'HTTP_USER_AGENT'});
}
my $response = $ua->request($request);
return 1;
}
1;
原因が判らないのは何とも不安ですが、もともとロジックには問題ないので騙し騙し様子見でいこうかと。
k事前に以下みたいなフィルタを通しておくと、幸せになれるかも。
#User Agent
my $agent;
if ($ENV{HTTP_USER_AGENT} =~ /DoCoMo/) {
$agent = 'DoCoMo';
}
elsif ($ENV{HTTP_USER_AGENT} =~ /J-PHONE|Vodafone|SoftBank/) {
$agent = 'SoftBank';
}
elsif ($ENV{HTTP_USER_AGENT} =~ /^UP.Browser|^KDDI/) {
$agent = 'au';
}
elsif ($ENV{HTTP_USER_AGENT} =~ /iPhone;/) {
$agent = 'iPhone';
}
elsif ($ENV{HTTP_USER_AGENT} =~ /emobile/i) {
$agent = 'EMobile';
}
elsif ($ENV{HTTP_USER_AGENT} =~ /willcom/i) {
$agent = 'Willcom';
}
elsif ($ENV{HTTP_USER_AGENT} =~ /^Baiduspider|Yahoo! Slurp|Googlebot/){
return 1;
}
else {
$agent = $ENV{HTTP_USER_AGENT} if $ENV{HTTP_USER_AGENT};
}
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。
9 Comments
ここの記事でどない? 2009–02–13 17:21
僕もコレ見つけまして、いろいろ試した結果、これに近づいていったんですが... ダメでした。最後の辺のopenlog()~closelog()だけは省いた形なんですが、まあココは記録用でしょうからanalyticsとは関係ないでしょう。
良く見たらこのPerlコード、「動作確認できてる」とは何処にも書いてないんですよね^^; 2009–02–13 18:36
全アクセスがユニーク扱いで、一応会員サイトあつかってるので
それっぽくセッションもつけてあげたんですけど、、、ユニークしか取れない。
PHPではやってないんですけど、PHPでも全アクセスユニーク扱いなんでしょうか?
なぞだーー。。 2009–03–09 12:03
いいなー。僕の環境(というか導入サイトの環境)では、けっきょくPerlが動かなかったので、
けっきょくPHPで書いてPerlから呼んでます。
何が原因なんでしょうねぇ... 今は成功したPHP関数をちょいちょい弄りつつ原因解明中。
デバッグに時間のかかること^^;
ユニーク扱いになるのはCookie保存してない仕様上やむなきかな、と。PHPでもなってます。
上記サンプルで言う$utmcc内が本来ならCookieに保存されてる情報だろうから、
ここにセッションIDやらタイムスタンプやらを巧く引き渡してやれば...? 2009–03–09 16:56
ASP版(VBScript)のコードを作ろうと思うのですが、参考になるページをご存知でしたら教えて頂けますと幸いです。
↓ちなみに いま参考にしているページ
http://eos.exbridge.jp/projects/show/ga4k
http://mobileaffiliate.osakazine.net/e164963.html
http://beginner-note.net/2008/08/google-analytics.html
http://it.kndb.jp/entry/show/id/2376
http://www.ianlewis.org/jp/google-analytics 2009–03–11 15:12
PHPでもそうですか。。
EZはCookie保存できるみたいなんですけど、それでも反映されないですよね。
$utmccにユニークなものくっつけてみても。。。
ほんっとデバッグに時間かかりますねよね。
これからも少しずつ試して見ます(とかいって一週間放置ぎみですけど。。)
こっそりウェブクリ買いましたよw
ぐぐってここにたどりついたのも、なんかの縁とおもって。
ためになりました! 2009–03–16 10:20
遅くなりました ...とはいえ、僕が探した参照サイトでURL取っておいたのは、記事中で紹介したリンクのみです。申し訳ない^^;
初回のアクティベートはJavaScriptから行われる必要があるっぽい、とか、Cookie関連のプロパティ情報(__utmaの形式とか)は英語の記事しかないとゆーか英語なら山ほどある、といった程度でしょうか。参考になれば。
>kumaokaさん
ウェブクリwww ありがとうございます(≧∇≦)b
セッションに関しては、僕も手が空きしだい挑戦してみます。
ちなみに最近、カレンダーから今日の日付を指定してやれば、けっこうリアルタイムで集計結果が見れることに気付きました^^; 2009–03–18 18:19
とても参考になりました、ありがとうございます。
しかし、参照元のデータがどうしても取得できません。
Sig.さんは参照元が取得できていますでしょうか? 2009–04–16 12:31
なかでもutmcsrとかutmccn辺りだと思われます。
この辺にHTTP_REFERERとか突っ込んでやれば、反映されるかもしれません。
僕はまだ試してないので判らないっす! 2009–04–21 22:26