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

昨日までのスクリプトで、ペタ貼りに必要なcookieは全部入手できたので、いよいよ目的のブログにペタを貼るスクリプトを書く。
まず、以下の二つの正規表現を準備する。

  • ペタを貼るためのペタ貼り用のページのurlを見つけるための正規表現
  • 実際にペタを貼るためurlを見つけるための正規表現
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])*))")

次に、ペタを貼るブログのトップページにアクセスして、ぺタ貼り用のページのurlを取得する。
ペタを貼るブログのidは、予め'peta_target.txt'というファイルに一行ずつ改行して格納しておく。
アメブロのトップページのurlは'http:://ameblo.jp/ユーザid/'という形式なので、'peta_target.txt'から読み込んだidに対して一行ずつ処理を進める。
response = Net::HTTP.get('ameblo.jp','/'+line+'/')
として、各ブログのトップページからの応答を得る。
この応答の中から、if peta_blog_e_get = peta_entry.match(response) で、ペタを貼り用のページのurlを取得する。if文を使っているのは、ブログによってはペタを拒否している場合もあるので、その時に処理をスキップして次のブログへ処理を進める為。

#各ペタページにアクセスしてペタ貼りをする
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)#ペタ貼り用のページのurlを見つける
      peta_e_path = peta_blog_e_get.to_s
      p peta_e_path

実は、ペタ貼り用のページのurlは'http://peta.ameba.jp/p/addPeta.do?targetAmebaId=ユーザid'で良い。しかし、アメブロではどこからペタを貼られたのかが判る様に、

  • service
  • key
  • sig

の三つの変数をurlの中に含める様、最近仕様変更が行われた。
'service'は、空白、'blog'、'blog_e'、'profile'の4種類の定義がある。これはそれぞれ、ペタ帳に'表示なし(その他)'、'ブログから'、'ブログ記事から'、'プロフィールから'と表示されるのに対応する。'key'と'sig'は'service=blog_e'の時だけ意味があって、ブログのどの記事のペタリンクからペタが貼られたか判る様になっている。
自動でペタを貼る場合、横着をして'http://peta.ameba.jp/p/addPeta.do?targetAmebaId=ユーザid'だけで、ペタ貼りの処理をすると、どこからペタを貼ったのかが表示されず、相手に記事を読まずにペタを貼っているのがバレてしまう。実際にその通りなのだからバレても仕方ないのだが、自動ペタ貼りをするのは、相手にペタを返すのが礼儀なのだけれど時間がないから自動化したい。という所が出発点なので、ここは礼儀を失しない範囲で騙れるのならば騙っておきたい。年賀状を印刷で済ませる様なモノだと割り切る。
ブログ記事を読んでペタを貼る場合には、通常は'service=blog_e'で表示は『ブログ記事から』
プロフからペタを貼る場合には'service=profile'で表示は『プロフィールから』
おそらくちゃんとブログを読んでペタを貼ってますよと騙れる許容範囲はここまでだろう。
'service=blog'は『ペタを貼ってね』という画像を表示させている場合にのみ出てくる。そういう画像を貼っていない場合に表示で『ブログから』となった場合には、自動ペタ貼りソフトである事を白状した様なモノだ。
で、仕方ないから、ブログのトップページから実際のブログ記事のペタ貼り用のページurlを見つける仕様にしてある。

次に、ペタ貼り用のページを読み込んで、その中から実際にペタを貼る為のurlを先に定義しておいた正規表現'peta_url'で見つける。
で最後に、見つけたペタを貼る為のurlを送って、ペタ貼りを行う。

      #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)#実際にペタをはるurlを見つける
        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

ペタ貼り用のurlを見つける辺りのリクエストを、都度、newして'Connection'と'Cookie'を設定しているのは効率が悪い様な気がするので、それはこれからの宿題。