Rubyによるアメブロのペタ貼り自動化スクリプト(1)

国内最大のユーザを抱えるブログサイトがアメブロ
僕もアメブロでお気楽ブログを書いている。
アメブロには独特の仕組みがある。
ペタとかアメーバピグとかである。

特に『ペタ』という奴がやっかいである。
どうもランキングに関係しているみたいなので、アメブロでブログの記事を読んだ後は、ペタ貼りをするのが礼儀らしい。
そんなモノは放っておけば良いのだけれど、知り合いから自動で『ペタ貼り』を出来るプログラムを作って欲しいとリクエストがあった。

そんな仕組みは放っておけよ。と言いたい所だが、彼の知り合いにとってはランキングとかペタは非常に大事らしい。

そういうわけでペタの仕組みを調べてみた。
ペタ貼りをするまでのHTTPクライアント(ブラウザ)とサーバーのやりとりはざっとこんな感じだ。

  1. まずログインのページをGETして、cookie('JSESSIONID')を取得する。
  2. ユーザIDとパスワードをPOSTして、cookie('N','I')を取得する。
  3. ペタを貼りたいブログをGETしての中からペタ貼り用ページのurlを取得する。(実はこのurlは、わざわざGETしなくてもブログのIDから作成する事も可能なのだが、後述する要因から一手間をかけて読み込む事にする。)
  4. 上で取得したペタ貼り用ページurlからデータをGETして、実際にペタを貼るためのurlを取得する。
  5. ペタを貼るための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

詳細内容については、次回以降説明