【Twitterやってます】 koress project | しがく(shigaku) | おかじ(okaji)

2007年10月18日 02:08

モバイル版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を用いた位置情報取得アプリケーションの作成
ケータイ良いサイトまとめ よいさいと(β)

トラックバック

コメントする

※返信が必要な場合にはメールにてお問い合わせください.