2007年10月18日 02:08
- | Retweet
-
モバイル版AdSenseの概要と導入(Ruby on Rails + jpmobile)
「ケータイ良いサイトまとめ よいさいと」に、モバイル版AdSenseをさっそく導入してみました。
このエントリでは、モバイル版AdSenseの裏側の仕組みと、Ruby on Railsとjpmobileプラグインを使って携帯サイトを構築している人向けにAdSenseの導入方法をまとめています。
モバイル版AdSenseって見たことねーよって人はまず(宣伝も兼ねて)http://yois.jp/にアクセスして、体験してみてくださいな。
モバイル版AdSenseの仕組み
モバイル版AdSenseはCGIで動く
モバイル版AdSenseは、htmlコードの断片を挿入する方式のPC版AdSenseとは動きが異なります。まず最初にAdsenseモバイル版を申請すると、「コードスニペット」と呼ばれるPerlやPHPのコードが発行され、運営者はこれをサーバのCGIプログラムのソース中に組み込むことで、広告が出力されるようになります。
つまり、htmlだけで書かれたケータイサイトはモバイル版AdSenseには対応できません。
コードを設置するとGoogleがコンテンツを分析しに来る
コードスニペットを自分のperlやPHPのCGIの中にうまく挟むと、設置した場所にタグが埋め込まれるようになります。このタグは<!-- google:afm XXXXXXX -->というコメントになっています。GoogleのAdSenseクローラはこのコメントを見つけると、おそらくそのページを分析してどんな広告を出すか決定するのでしょう。この時点ではコメントが挿入されるだけなので、ユーザ目にはページには広告は表示されません。
分析が終わると、コードスニペットは広告htmlを吐き出すようになる
Google側で分析が終わると、それまで<!-- -->を吐き出していたコードスニペットは、広告用のhtmlを吐き出すようになり、はじめてユーザは広告を見るようになります。よいさいとの場合は、コード設置から数十分でクローラが来て、だいたい1時間ぐらいで広告が表示されるようになりました。
AdSense用のコードスニペットをRubyに翻訳する
発行されるコードスニペットはPerl,PHP,JSP,ASPの4種類だったので、仕方なくRuby用のコードを自分で作ってみました。テンプレートに直感的に<%= adsense %>と書きたかったため、アプリケーションヘルパーに追記しました。
参考までにapplication_helper.rbのコードを乗せておきます。(Rubyを始めてから2ヶ月なので無駄の多いコードかと思いますがご了承ください)
require "uri"
require "open-uri"
module ApplicationHelper
def adsense
env_http_host = request.env["HTTP_HOST"] || ""
env_remote_addr = request.env["REMOTE_ADDR"] || ""
env_http_referer = request.env["HTTP_REFERER"] || ""
env_request_uri = request.env["REQUEST_URI"] || ""
env_user_agent = request.env["HTTP_USER_AGENT"] || ""
google_dt = sprintf "%.0f", 1000.0 * Time.now.to_f
google_scheme = request.env["HTTPS"] == "on" ? "https://" : "http://"
google_host = URI.escape( google_scheme + env_http_host )
google_ad_url = "http://pagead2.googlesyndication.com/pagead/ads?" +
"ad_type=text" +
"&channel=XXXXXXXXX" +
"&client=ca-mb-pub-XXXXXXXXXXXXXXXXXXX" +
"&dt=" + google_dt +
"&format=mobile_single" +
"&host=" + google_host +
"&ip=" + URI.escape(env_remote_addr) +
"&markup=xhtml" +
"&oe=utf8" +
"&output=xhtml" +
"&ref=" + URI.escape( env_http_referer ) +
"&url=" + google_host + URI.escape( env_request_uri ) +
"&useragent=" + URI.escape(env_user_agent)
open(google_ad_url).read
end
end
10/20 ※コメントでご指摘いただいた内容を反映しました! ありがとうございます!
jpmobileを修正してGoogleクローラに対応する
よいさいとでは携帯電話からのアクセスとPCからのアクセスをjpmobileプラグインによって識別して、同じURLで違うhtmlを吐くようにしています。そのままではGoogleのAdSenseクローラが来てもPC用のコンテンツをクロールしてしまい、<!-- -->のコメントを見つけることができません。そこで、jpmobileに手を加えます。
仮想端末の追加
jpmobileの携帯電話の抽象クラスAbstractMobileを継承した仮想端末「Google」クラスを宣言します。
#{RAILS_ROOT}/vendor/plugins/jpmobile/lib/jpmobile/mobile/google.rb を新規作成する。
# googleモバイルクローラ
require 'ipaddr'
module Jpmobile::Mobile
class Google < AbstractMobile
USER_AGENT_REGEXP = /Mediapartners-Google/
end
end
Googleの公式ヘルプによると、AdsenseクローラはUser-Agentに「Mediapartners-Google」を含むらしい
IPアドレス空間の追加
次に、IPアドレス空間の定義ファイルに、Google仮想端末たらしめるIPアドレスを加えます。今回は「66.249.70.87」でしかクロールしに来なかったため、1個だけ追加してみました。たぶん、複数のIPアドレスを持っているはずなので、この部分は自分で確かめながら必要に応じて増やす必要があるかもしれないです。
#{RAILS_ROOT}/vendor/plugins/jpmobile/lib/jpmobile/mobile/z_ip_addresses.rb に追加
Jpmobile::Mobile::Google::IP_ADDRESSES=<<EOF 66.249.70.87 EOF
以上で、モバイル版AdSenseの導入完了です。
おまけ1
AdSenseクローラのUser-Agentが面白い。NokiaとKDDIを名乗ってきた。
- Nokia6820/2.0 (4.83) Profile/MIDP-1.0 Configuration/CLDC-1.0 (compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html)
- KDDI-CA34 UP.Browser/6.2.0.10.2.2 (GUI) MMP/2.0 (compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html)
本当にNokiaやKDDI端末を使っているんだろうか?また、モバイル版AdSenseがDocomoに対応していない理由は、つまりこのクローラの部分のPartnershipのことなんだろうか。なぞ。
おまけ2
AdSenseモバイルを導入するにはMediapartners-Googleを名乗るリクエストにはコンテンツを解放しなくちゃいけない。つまり、いまPCから見られないコンテンツでも、このUAを名乗ればPCからも見られるようになる? これは変化かも。
関連情報
Google AdSense
jpmobile
jpmobileを用いた位置情報取得アプリケーションの作成
ケータイ良いサイトまとめ よいさいと(β)
コメントする