Rubyによるアメブロのペタ貼り自動化スクリプト(1)
国内最大のユーザを抱えるブログサイトがアメブロ。
僕もアメブロでお気楽ブログを書いている。
アメブロには独特の仕組みがある。
ペタとかアメーバピグとかである。
特に『ペタ』という奴がやっかいである。
どうもランキングに関係しているみたいなので、アメブロでブログの記事を読んだ後は、ペタ貼りをするのが礼儀らしい。
そんなモノは放っておけば良いのだけれど、知り合いから自動で『ペタ貼り』を出来るプログラムを作って欲しいとリクエストがあった。
そんな仕組みは放っておけよ。と言いたい所だが、彼の知り合いにとってはランキングとかペタは非常に大事らしい。
そういうわけでペタの仕組みを調べてみた。
ペタ貼りをするまでのHTTPクライアント(ブラウザ)とサーバーのやりとりはざっとこんな感じだ。
- まずログインのページをGETして、cookie('JSESSIONID')を取得する。
- ユーザIDとパスワードをPOSTして、cookie('N','I')を取得する。
- ペタを貼りたいブログをGETしての中からペタ貼り用ページのurlを取得する。(実はこのurlは、わざわざGETしなくてもブログのIDから作成する事も可能なのだが、後述する要因から一手間をかけて読み込む事にする。)
- 上で取得したペタ貼り用ページurlからデータをGETして、実際にペタを貼るためのurlを取得する。
- ペタを貼るためのurlをGETする。
ざっと、こんな流れだ。
最初の2項目で入手するcookieは、一度ログインして取得すれば、ログオフするまでそのまま使えるので、複数のブログに『ペタ貼り』する場合には、後の3項目だけを繰り返せば良い。
プログラム(スクリプト)はRuby1.9.1で書いた。
こんな感じ
require 'uri' require 'net/http' Net::HTTP.version_1_2 #おまじない cookie = Hash.new # 要求・応答ヘッダ出力 def print_key_and_val(hash) puts "-- #{hash.class} --" hash.each do|k,v| puts "#{k} => \t#{v}" end puts '' end #Set-Cookie→クッキーの設定 def set_cookie_from_res(res,cook) res.get_fields('Set-cookie').each{|str| k,v = str[0...str.index(';')].split('=') cook[k] = v } end def cookie_str(cook) cook.map{|k,v| "#{k}=#{v}" }.join(';') end http = Net::HTTP.new("www.ameba.jp",80) # http.set_debug_output $stderr #まずwww.ameba.jp/に接続してセッションIDを入手する path = '/' req=Net::HTTP::Get.new(path) req['Connection'] = 'Keep-Alive' req['Cookie'] = cookie_str(cookie) http.start print_key_and_val req response = http.request(req) p response.code print_key_and_val response set_cookie_from_res(response,cookie)#入手したクッキーからセッションID等をハッシュに設定する #ID、パスワードを送信して、ログインする path = '/login.do' post_data = 'amebaId=******&password=********************************&Submit.x=0&Submit.y=0' req = Net::HTTP::Post.new(path) req['Connection'] = 'Keep-Alive' req['Cookie'] = cookie_str(cookie) print_key_and_val req response = http.request(req,post_data) p response.code print_key_and_val response set_cookie_from_res(response,cookie)#入手したクッキーからpetaに必要なクッキーをハッシュに設定する p cookie http.finish peta_url = Regexp.new("(?-mix:\\/p\\/addPetaComplete.do(?:\\?(?:[;\\/?:@&=+$,A-Za-z0-9\\-_.!~*'()]|%[0-9a-fA-F][0-9a-fA-F])*))") peta_entry = Regexp.new("(?-mix:\\/p\\/addPeta.do(?:\\?(?:[;\\/?:@&=+$,A-Za-z0-9\\-_.!~*'()]|%[0-9a-fA-F][0-9a-fA-F])*))") #各ペタページにアクセスしてペタ貼りをする http = Net::HTTP.new('peta.ameba.jp',80) http.start File.open("peta_target.txt").each do |file| file.each_line do |line| p line.chomp! #Get peta_entry url response = Net::HTTP.get('ameblo.jp','/'+line+'/') if peta_blog_e_get = peta_entry.match(response) peta_e_path = peta_blog_e_get.to_s p peta_e_path #Get petaId & targetAmebaId req = Net::HTTP::Get.new(peta_e_path) req['Connection'] = 'Keep-Alive' req['Cookie'] = cookie_str(cookie) response = http.request(req) p response if petaIDget =peta_url.match(response.body) peta_path = petaIDget.to_s p peta_path req = Net::HTTP::Get.new(peta_path) req['Connection'] = 'Keep-Alive' req['Cookie'] = cookie_str(cookie) response = http.request(req) p response end end end end http.finish
詳細内容については、次回以降説明