mobile?で検索クローラも真にしてしまえと。
一般的な用途に合うかどうかはさておき、モバイル用の検索クローラはモバイルとして扱えるようになってもよいかな、と。
正直、一番の目的はGitHubの利用です。forkしてcloneしてadd/commitしてpush。使い方がいまいちわからないので、本体に修正分が入ってしまいそうな恐怖と戦いながらの操作です。公開鍵が自分のしかないので、他人のリポジトリには書き込めないでしょうけど。
終わってみれば、安全に事を運べたように思います。本体を見ても、変更されていないようで一安心です。まあ、addせずに変更分がcommitできなかった事にpush後に気づいたのは内緒ですがね。
クローラ対応
さて、ここからは余談です。今回jpmobileをforkして修正した内容について、少しだけ書いておこうと思います。
- jpmobile便利に使わせていただいております!
- mobile?でtrueならモバイル用コンテンツを返したい
- 各キャリアの端末に対しては普通にできる
- クローラのインデクシングはどうなるんだろうか
このような流れで、モバイル用検索クローラからのリクエストも、モバイル端末からのリクエストとして扱いたいと思ったわけです。jpmobileでやる範囲のことなのか、深く考えていませんが、「mobile?」がひどく気に入っています。なので、「mobile?」を使いたいのです。
- 有名どころはIPとUA情報を公開している
- 簡単に見つかったのは、Google/Yahoo/Livedoor/Goo
- 簡単に見つかったのだけ、とりあえず対応する
jpmobileの拡張(対応キャリア追加)は、IPアドレス情報とUA情報がわかれば簡単にできる様なので、上記の修正を加えてみました。ちなみに、4社の公開情報は以下です。
- Googlebot-Mobile
- Yahoo!検索 ヘルプ - モバイル版Yahoo!検索の検索エンジン用ロボットについて
- モバイル検索 検索 Q&A livedoor ヘルプ
- 携帯検索クローラについて - goo ヘルプ
Googleの公開情報が、ブログでしか見つからなかったのが気になりますが、よしとしておきます。
適当な実装でごまかしましたが、端末とクローラの識別順序とでも言うのでしょうか、正規表現によるマッチングの実行順序をつけておきました。元々は、Jpmobile::Mobileが持っている定数をModule.constantsで取り出してeachしているわけですが、クローラのUAはDoCoMoから始まったりするので、クローラを優先的に処理しないと嘘になったりします。IPアドレスとセットでループさせても良かったかもしれませんが、定数名リストを明記して対応しました。
やった事はこんなところでしょうか。詳しくは"git://github.com/koshigoe/jpmobile.git"で。ここにも、forkしてからの差分を付けておきます。
diff --git a/CHANGELOG b/CHANGELOG index 10ca10b..bc4eba4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +== 0.0.3x 2008-08-20 + +* clone +* mobile web crawler + == 0.0.1 2007-06-16 * Initial release diff --git a/lib/jpmobile.rb b/lib/jpmobile.rb index 178ad7f..af7ac4c 100644 --- a/lib/jpmobile.rb +++ b/lib/jpmobile.rb @@ -15,6 +15,14 @@ module Jpmobile autoload :Emobile, 'jpmobile/mobile/emobile' autoload :Willcom, 'jpmobile/mobile/willcom' autoload :Ddipocket, 'jpmobile/mobile/willcom' + autoload :Google, 'jpmobile/mobile/google' + autoload :Yahoo, 'jpmobile/mobile/yahoo' + autoload :Livedoor, 'jpmobile/mobile/livedoor' + autoload :Goo, 'jpmobile/mobile/goo' + + def self.constants_with_discovery_order + [ :Google, :Yahoo, :Livedoor, :Goo, :Docomo, :Au, :Softbank, :Vodafone, :Jphone, :Emobile, :Willcom, :Ddipocket ] + end end end diff --git a/lib/jpmobile/mobile/goo.rb b/lib/jpmobile/mobile/goo.rb new file mode 100644 index 0000000..77e5c92 --- /dev/null +++ b/lib/jpmobile/mobile/goo.rb @@ -0,0 +1,11 @@ +# = gooモバイルクローラ + +module Jpmobile::Mobile + # == gooモバイルクローラ + class Goo < AbstractMobile + autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_goo' + + # 対応するUser-Agentの正規表現 + USER_AGENT_REGEXP = /ichiro\/mobile goo/ + end +end diff --git a/lib/jpmobile/mobile/google.rb b/lib/jpmobile/mobile/google.rb new file mode 100644 index 0000000..446002f --- /dev/null +++ b/lib/jpmobile/mobile/google.rb @@ -0,0 +1,11 @@ +# = googleモバイルクローラ + +module Jpmobile::Mobile + # == googleモバイルクローラ + class Google < AbstractMobile + autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_google' + + # 対応するUser-Agentの正規表現 + USER_AGENT_REGEXP = /Googlebot-Mobile/ + end +end diff --git a/lib/jpmobile/mobile/livedoor.rb b/lib/jpmobile/mobile/livedoor.rb new file mode 100644 index 0000000..a29c132 --- /dev/null +++ b/lib/jpmobile/mobile/livedoor.rb @@ -0,0 +1,11 @@ +# = livedoorモバイルクローラ + +module Jpmobile::Mobile + # == livedoorモバイルクローラ + class Livedoor < AbstractMobile + autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_livedoor' + + # 対応するUser-Agentの正規表現 + USER_AGENT_REGEXP = /LD_mobile_bot/ + end +end diff --git a/lib/jpmobile/mobile/yahoo.rb b/lib/jpmobile/mobile/yahoo.rb new file mode 100644 index 0000000..8a41e88 --- /dev/null +++ b/lib/jpmobile/mobile/yahoo.rb @@ -0,0 +1,11 @@ +# = yahooモバイルクローラ + +module Jpmobile::Mobile + # == yahooモバイルクローラ + class Yahoo < AbstractMobile + autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_yahoo' + + # 対応するUser-Agentの正規表現 + USER_AGENT_REGEXP = /^Y!J-(SRD|MBS)\/[0-9]+\.[0-9]+$/ + end +end diff --git a/lib/jpmobile/mobile/z_ip_addresses_goo.rb b/lib/jpmobile/mobile/z_ip_addresses_goo.rb new file mode 100644 index 0000000..89a0958 --- /dev/null +++ b/lib/jpmobile/mobile/z_ip_addresses_goo.rb @@ -0,0 +1,7 @@ +# = IPアドレス帯域テーブル(手動更新分) +# == Goo +# http://help.goo.ne.jp/help/article/1142/ +# 2008/08現在 +Jpmobile::Mobile::Goo::IP_ADDRESSES = %w( +210.150.10.32/27 +).map {|ip| IPAddr.new(ip) } diff --git a/lib/jpmobile/mobile/z_ip_addresses_google.rb b/lib/jpmobile/mobile/z_ip_addresses_google.rb new file mode 100644 index 0000000..8f8754d --- /dev/null +++ b/lib/jpmobile/mobile/z_ip_addresses_google.rb @@ -0,0 +1,8 @@ +# = IPアドレス帯域テーブル(手動更新分) +# == Google +# http://googlejapan.blogspot.com/2008/05/google.html +# 2008/08現在 +Jpmobile::Mobile::Google::IP_ADDRESSES = %w( +72.14.199.0/25 +209.85.238.0/25 +).map {|ip| IPAddr.new(ip) } diff --git a/lib/jpmobile/mobile/z_ip_addresses_livedoor.rb b/lib/jpmobile/mobile/z_ip_addresses_livedoor.rb new file mode 100644 index 0000000..a3b9513 --- /dev/null +++ b/lib/jpmobile/mobile/z_ip_addresses_livedoor.rb @@ -0,0 +1,7 @@ +# = IPアドレス帯域テーブル(手動更新分) +# == Livedoor +# http://helpguide.livedoor.com/help/search/qa/grp627 +# 2008/08現在 +Jpmobile::Mobile::Livedoor::IP_ADDRESSES = %w( +203.104.254.0/24 +).map {|ip| IPAddr.new(ip) } diff --git a/lib/jpmobile/mobile/z_ip_addresses_yahoo.rb b/lib/jpmobile/mobile/z_ip_addresses_yahoo.rb new file mode 100644 index 0000000..3d03d8a --- /dev/null +++ b/lib/jpmobile/mobile/z_ip_addresses_yahoo.rb @@ -0,0 +1,15 @@ +# 手動更新 +# = IPアドレス帯域テーブル(手動更新分) +# == Yahoo +# http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html +# 2008/08現在 +Jpmobile::Mobile::Yahoo::IP_ADDRESSES = %w( +124.83.159.146/31 +124.83.159.148/30 +124.83.159.152/29 +124.83.159.160/28 +124.83.159.176/29 +124.83.159.184/31 +124.83.159.224/28 +124.83.159.240/29 +).map {|ip| IPAddr.new(ip) } diff --git a/lib/jpmobile/request_with_mobile.rb b/lib/jpmobile/request_with_mobile.rb index e6f944c..15dcf39 100644 --- a/lib/jpmobile/request_with_mobile.rb +++ b/lib/jpmobile/request_with_mobile.rb @@ -33,7 +33,7 @@ module Jpmobile def mobile return @__mobile if @__mobile - Jpmobile::Mobile.constants.each do |const| + Jpmobile::Mobile.constants_with_discovery_order.each do |const| c = Jpmobile::Mobile.const_get(const) return @__mobile = c.new(self) if c::USER_AGENT_REGEXP && user_agent =~ c::USER_AGENT_REGEXP end diff --git a/spec/controllers/goo_spec.rb b/spec/controllers/goo_spec.rb new file mode 100644 index 0000000..731e531 --- /dev/null +++ b/spec/controllers/goo_spec.rb @@ -0,0 +1,14 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe "モバイルgoo 携帯検索クローラ からのアクセス" do + before do + request.user_agent = "DoCoMo/2.0 P900i(c100;TB;W24H11)(compatible; ichiro/mobile goo; +http://help.goo.ne.jp/door/crawler.html)" + end + controller_name :mobile_spec + it "request.mobile は Goo のインスタンスであるべき" do + request.mobile.should be_an_instance_of(Jpmobile::Mobile::Goo) + end + it "request.mobile? は true であるべき" do + request.mobile?.should be_true + end +end diff --git a/spec/controllers/google_spec.rb b/spec/controllers/google_spec.rb new file mode 100644 index 0000000..51b69ec --- /dev/null +++ b/spec/controllers/google_spec.rb @@ -0,0 +1,14 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe "Google モバイルウェブクローラー からのアクセス" do + before do + request.user_agent = "DoCoMo/1.0/N505i/c20/TB/W20H10 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)" + end + controller_name :mobile_spec + it "request.mobile は Google のインスタンスであるべき" do + request.mobile.should be_an_instance_of(Jpmobile::Mobile::Google) + end + it "request.mobile? は true であるべき" do + request.mobile?.should be_true + end +end diff --git a/spec/controllers/livedoor_spec.rb b/spec/controllers/livedoor_spec.rb new file mode 100644 index 0000000..52955ab --- /dev/null +++ b/spec/controllers/livedoor_spec.rb @@ -0,0 +1,14 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe "Livedoor モバイルサイト検索用のクローラー からのアクセス" do + before do + request.user_agent = "DoCoMo/1.0/N505i/c20/TB/W20H10 (compatible; LD_mobile_bot; +http://helpguide.livedoor.com/help/search/qa/grp627)" + end + controller_name :mobile_spec + it "request.mobile は Livedoor のインスタンスであるべき" do + request.mobile.should be_an_instance_of(Jpmobile::Mobile::Livedoor) + end + it "request.mobile? は true であるべき" do + request.mobile?.should be_true + end +end diff --git a/spec/controllers/yahoo_spec.rb b/spec/controllers/yahoo_spec.rb new file mode 100644 index 0000000..2344d81 --- /dev/null +++ b/spec/controllers/yahoo_spec.rb @@ -0,0 +1,17 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe "モバイル版Yahoo!検索の検索エンジン用ロボット からのアクセス" do + controller_name :mobile_spec + it "request.mobile は Yahoo のイン
forkしてcloneした後の"rake spec"が実行できず、四苦八苦してましたが、"rspec-fixture"というgemが必要だったようです。"sudo gem install rspec-fixture"したら実行できる様になりました。


コメントする