携帯サイトでGoogle Analyticsを利用する

/web/server-side

Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。

Perlスクリプトを作ったんだけど... 動かない! なんでだろー。ちゃんと毎ページ呼んでるし、GETリクエストも遅れてるのに... 統計に反映されてない! ga.jsだからかと思ってUrchin.jsでアクティベートもしたのにダメだった。ちなみに元ネタはコレ。

動作確認できました。ソースは記事中の追記にて。

原理は簡単。Google Analyticsで呼び出してるJSは――読むのすっごいダルいんだけど――単に「http://www.google-analytics.com/__utm.gif」というGIF画像をリクエストしてるだけらしい。画像を読み込みはJavaScriptでクロスドメイン処理を行うときのセオリーだから、要はリファラとかUAだとかって各種情報をくっつけたGETリクエストを毎ページ送ってカウントしてるわけだ。

んで、話題の携帯analyticsモジュールはPHPからGETリクエストを送信することでGoogle Analyticsに対応してる。既にちゃんと動作確認も取れている(らしい)PHPコードを元に、だいたい同じような動作をするPerlコードに書き直したのが、以下のコード。

  1. package Util;
  2.  
  3. use strict;
  4. use LWP::UserAgent;
  5.  
  6. sub GoogleAnalystics {
  7. my $domainH = '169191153'; #for test '.archiva.jp' only
  8. my $utmn = int(rand(9999999998)) + 1; #random number
  9. my $visitorID = int(rand(2147483646)) + 1; #number under 2147483647
  10.  
  11. my $utmac = 'UA-xxxxxxx-x';
  12. my $utmhn = 'xxxxx.jp';
  13. my $today = time();
  14. my $referer = $ENV{'HTTP_REFERER'};
  15. my $utmp = $ENV{'REQUEST_URI'};
  16.  
  17. my $utmsr = '-'; #1024x768
  18. my $utmsc = '-'; #32-bit
  19. my $utmul = '-'; #en
  20. my $utmje = '0'; #java_enable / 1
  21. my $utmfl = '-'; #flash_version / 9.0%20r28
  22. my $utmdt = '-'; #page title
  23.  
  24. #utmcc = cookie settings
  25. # __utma=<domain hash>.<unique visitor id>.<firstiTime>.<lastTime>.<currentTime>.<visit count>
  26. #
  27. my $urchinUrl = 'http://www.google-analytics.com/__utm.gif'
  28. ."?utmwv=1"
  29. ."&utmn=$utmn"
  30. ."&utmcs=$utmcs"
  31. ."&utmsr=$utmsr"
  32. ."&utmsc=$utmsc"
  33. ."&utmul=$utmul"
  34. ."&utmje=$utmje"
  35. ."&utmfl=$utmfl"
  36. ."&utmdt=$utmdt"
  37. ."&utmhn=$utmhn"
  38. ."&utmr=$referer"
  39. ."&utmp=$utmp"
  40. ."&utmac=$utmac"
  41. ."&utmcc="
  42. .'__utma%3D'.$domainH.'.'.$visitorID.'.'.$today.'.'.$today.'.'.$today.'.2'.'%3B%2B'
  43. .'__utmb%3D'.$domainH.'%3B%2B'
  44. .'__utmc%3D'.$domainH.'%3B%2B'
  45. .'__utmz%3D'.$domainH.'.'.$today.'.2.2'.'utmccn%3D\(direct\)%7Cutmcsr%3D\(direct\)%7Cutmcmd%3D\(none\)%3B%2B
  46. .'__utmv%3D'.$domainH.'.'.$domainH.'%3B'
  47. ;
  48.  
  49. my $ua = LWP::UserAgent->new;
  50. my $request = HTTP::Request->new(GET => $urchinUrl);
  51. if($ENV{'HTTP_ACCEPT_LANGUAGE'}) { $request->header('Accept-language' => $ENV{'HTTP_ACCEPT_LANGUAGE'}); }
  52. if($ENV{'HTTP_USER_AGENT'}) { $ua->agent($ENV{'HTTP_USER_AGENT'}); }
  53. my $response = $ua->request($request);
  54.  
  55. # if ($response->is_success) {
  56. # use Data::Dumper;
  57. # warn Dumper $response;
  58. # }
  59. }
  60.  
  61. 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コードにて動作確認できました。

  1. package Util;
  2.  
  3. use strict;
  4. use LWP::UserAgent;
  5.  
  6. sub GoogleAnalystics {
  7. my $utmac = "UA-xxxxxxx-x";
  8. my $utmhn = "http://xxxxx.jp/";
  9. my $today = time();
  10. my $referer = $ENV{'HTTP_REFERER'};
  11. my $utmp = '/'.$u_domain.$ENV{'REQUEST_URI'};
  12.  
  13. my $domainH = '84928587'; #for test '.dgjmp.jp' only;
  14. my $utmn = int(rand(9999999998)) + 1; #random number
  15. my $visitor = int(rand(2147483646)) + 1; #number under 2147483647
  16.  
  17. my $utmcs = 'Shift-JIS'; #character_coding
  18. my $utmsr = '-'; #1024x768
  19. my $utmsc = '-'; #32-bit
  20. my $utmul = 'ja'; #en
  21. my $utmje = '0'; #java_enable / 1
  22. my $utmfl = '-'; #flash_version / 9.0%20r28
  23. my $utmdt = '-'; #page title
  24.  
  25. #utmcc = cookiesettings
  26. # __utma=<domain hash>.<unique visitor id>.<firstiTime>.<lastTime>.<currentTime>.<visit count>
  27. my $urchinUrl = 'http://www.google-analytics.com/__utm.gif?utmwv=1'
  28. ."&utmn=$utmn"
  29. ."&utmcs=$utmcs"
  30. ."&utmsr=$utmsr"
  31. ."&utmsc=$utmsc"
  32. ."&utmul=$utmul"
  33. ."&utmje=$utmje"
  34. ."&utmfl=$utmfl"
  35. ."&utmdt=$utmdt"
  36. ."&utmhn=$utmhn"
  37. ."&utmr=$referer"
  38. ."&utmp=$utmp"
  39. ."&utmac=$utmac"
  40. .'&utmcc=__utma%3D'.$domainH.'.'.$visitor.'.'.$today.'.'.$today.'.'.$today.'.2'
  41. .'%3B%2B__utmb%3D'.$domainH
  42. .'%3B%2B__utmc%3D'.$domainH
  43. .'%3B%2B__utmz%3D'.$domainH.'.'.$today.'.2.2.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)'
  44. .'%3B%2B__utmv%3D'.$domainH.'.'.$visitor.'%3B'
  45. ;
  46.  
  47. my $ua = LWP::UserAgent->new;
  48. my $request = HTTP::Request->new(GET => $urchinUrl);
  49. if ($ENV{'HTTP_ACCEPT_LANGUAGE'}) {
  50. $request->header('Accept-language' => $ENV{'HTTP_ACCEPT_LANGUAGE'});
  51. }
  52. if ($ENV{'HTTP_USER_AGENT'}) {
  53. $ua->agent($ENV{'HTTP_USER_AGENT'});
  54. }
  55. my $response = $ua->request($request);
  56.  
  57. return 1;
  58.  
  59. }
  60.  
  61. 1;

原因が判らないのは何とも不安ですが、もともとロジックには問題ないので騙し騙し様子見でいこうかと。

k事前に以下みたいなフィルタを通しておくと、幸せになれるかも。

  1. #User Agent
  2. my $agent;
  3. if ($ENV{HTTP_USER_AGENT} =~ /DoCoMo/) {
  4. $agent = 'DoCoMo';
  5. }
  6. elsif ($ENV{HTTP_USER_AGENT} =~ /J-PHONE|Vodafone|SoftBank/) {
  7. $agent = 'SoftBank';
  8. }
  9. elsif ($ENV{HTTP_USER_AGENT} =~ /^UP.Browser|^KDDI/) {
  10. $agent = 'au';
  11. }
  12. elsif ($ENV{HTTP_USER_AGENT} =~ /iPhone;/) {
  13. $agent = 'iPhone';
  14. }
  15. elsif ($ENV{HTTP_USER_AGENT} =~ /emobile/i) {
  16. $agent = 'EMobile';
  17. }
  18. elsif ($ENV{HTTP_USER_AGENT} =~ /willcom/i) {
  19. $agent = 'Willcom';
  20. }
  21. elsif ($ENV{HTTP_USER_AGENT} =~ /^Baiduspider|Yahoo! Slurp|Googlebot/){
  22. return 1;
  23. }
  24. else {
  25. $agent = $ENV{HTTP_USER_AGENT} if $ENV{HTTP_USER_AGENT};
  26. }

Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。

9 Comments

osakana wrote:
http://tf0054.blogspot.com/2009/01/perl.html
ここの記事でどない? 2009–02–13 17:21
Sig. wrote:
情報ありがとうございます!
僕もコレ見つけまして、いろいろ試した結果、これに近づいていったんですが... ダメでした。最後の辺のopenlog()~closelog()だけは省いた形なんですが、まあココは記録用でしょうからanalyticsとは関係ないでしょう。

良く見たらこのPerlコード、「動作確認できてる」とは何処にも書いてないんですよね^^; 2009–02–13 18:36
kumaoka wrote:
perlでいちおう動きました。
全アクセスがユニーク扱いで、一応会員サイトあつかってるので
それっぽくセッションもつけてあげたんですけど、、、ユニークしか取れない。

PHPではやってないんですけど、PHPでも全アクセスユニーク扱いなんでしょうか?

なぞだーー。。 2009–03–09 12:03
Sig. wrote:
おーできましたか!
いいなー。僕の環境(というか導入サイトの環境)では、けっきょくPerlが動かなかったので、
けっきょくPHPで書いてPerlから呼んでます。

何が原因なんでしょうねぇ... 今は成功したPHP関数をちょいちょい弄りつつ原因解明中。
デバッグに時間のかかること^^;

ユニーク扱いになるのはCookie保存してない仕様上やむなきかな、と。PHPでもなってます。
上記サンプルで言う$utmcc内が本来ならCookieに保存されてる情報だろうから、
ここにセッションIDやらタイムスタンプやらを巧く引き渡してやれば...? 2009–03–09 16:56
k wrote:
すごい参考になりました。
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
kumaoka wrote:
>ユニーク扱いになるのはCookie保存してない仕様上やむなきかな、と。PHPでもなってます。

PHPでもそうですか。。
EZはCookie保存できるみたいなんですけど、それでも反映されないですよね。
$utmccにユニークなものくっつけてみても。。。

ほんっとデバッグに時間かかりますねよね。
これからも少しずつ試して見ます(とかいって一週間放置ぎみですけど。。)

こっそりウェブクリ買いましたよw
ぐぐってここにたどりついたのも、なんかの縁とおもって。
ためになりました! 2009–03–16 10:20
Sig. wrote:
>kさん
遅くなりました ...とはいえ、僕が探した参照サイトでURL取っておいたのは、記事中で紹介したリンクのみです。申し訳ない^^;
初回のアクティベートはJavaScriptから行われる必要があるっぽい、とか、Cookie関連のプロパティ情報(__utmaの形式とか)は英語の記事しかないとゆーか英語なら山ほどある、といった程度でしょうか。参考になれば。

>kumaokaさん
ウェブクリwww ありがとうございます(≧∇≦)b
セッションに関しては、僕も手が空きしだい挑戦してみます。
ちなみに最近、カレンダーから今日の日付を指定してやれば、けっこうリアルタイムで集計結果が見れることに気付きました^^; 2009–03–18 18:19
Sasuke wrote:
はじめまして、こちらのサイト参考にさせて頂き、GoogleAnalyticsでデータが取れるようになりました。
とても参考になりました、ありがとうございます。

しかし、参照元のデータがどうしても取得できません。
Sig.さんは参照元が取得できていますでしょうか? 2009–04–16 12:31
Sig. wrote:
参照元はたぶん、__utmzですね。
なかでもutmcsrとかutmccn辺りだと思われます。
この辺にHTTP_REFERERとか突っ込んでやれば、反映されるかもしれません。

僕はまだ試してないので判らないっす! 2009–04–21 22:26