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

いささか不具合があるものの、一旦、改善したスクリプトをココに貼って、一区切り。
クライアントからは、『Androidスマートフォンから同様の事が出来る様にしてくれ』というワガママな依頼が来ている。
AndroidJavaのサブセットだから、アルゴリズムが決まっていれば、Rubyでなくても簡単にできそうな気がするけれど、僕自身がAndroidの実行環境を持っていないので、いささか敷居が高い。
ボチボチとJavaの復習と、Androidの勉強をしようかと考えている所。

以下、暫定の最終コード

require 'csv'
require 'digest/md5'
require 'net/http'

Net::HTTP.version_1_2  #おまじない

cookie = Hash.new

#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

list = Array.new
not_list = Array.new

ameba_url = Regexp.new("http:\/\/ameblo.jp\/([A-Za-z0-9]*)\/")
peta_url = Regexp.new("(?-mix:\\/p\\/addPetaComplete.do(?:\\?(?:[;\\/?:@&=+$,A-Za-z0-9\\-_.!~*'()]|%[0-9a-fA-F][0-9a-fA-F])*))")
peta_entry = Regexp.new("/p/addPeta\\.do\\?targetAmebaId=[A-Za-z0-9\\-]+&service=blog_e&key=[0-9]+&sig=[a-z0-9]+")
amember_entry = Regexp.new("secret.ameba.jp/[A-Za-z0-9\\-]+/amemberentry-[0-9]+.html")


print "Please input your BlogID :"
blog_id = gets.chop
print "Please input your password :"
blog_pwd = gets.chop

#まずwww.ameba.jp/に接続してセッションIDを入手する
http = Net::HTTP.new("www.ameba.jp",80)
path = '/'
req=Net::HTTP::Get.new(path)
req['Connection'] = 'Keep-Alive'
req['Cookie'] = cookie_str(cookie)
http.start
response = http.request(req)
set_cookie_from_res(response,cookie)#入手したクッキーからセッションID等をハッシュに設定する
#ID、パスワードを送信して、ログインする
path = '/login.do'
post_data = 'amebaId=' + blog_id + '&password=' + Digest::MD5.hexdigest(blog_pwd) + '&Submit.x=0&Submit.y=0'
req = Net::HTTP::Post.new(path)
req['Connection'] = 'Keep-Alive'
req['Cookie'] = cookie_str(cookie)
response = http.request(req,post_data)
if response.code == '302'
  set_cookie_from_res(response,cookie)#入手したクッキーからpetaに必要なクッキーをハッシュに設定する

  #設定されたペタターゲットファイルを読み込む
  print "Reading Target textfile...\n"
  File.open("peta_target.txt").each do |file|
    file.each_line do |line|
      list.push(line.chomp!)
    end
  end

  #ペタをつけないブログのリストを読み込む
  print"Reading NG Blogs datafile...\n"
  File.open("peta_not_list.txt").each do |file|
    file.each_line do |line|
      not_list.push(line.chomp!)
    end
  end
  
  #自分のブログについたペタを確認。ペタ返しのためのブログurlをリストに追加する。
  print "Reading Recieved Petadata...\n"
  for i in 1..25
    res = Net::HTTP.get('peta.ameba.jp','/p/addPeta.do?petaId=&targetAmebaId='+blog_id+'&pageNo='+i.to_s)
    res.to_s.scan(ameba_url) do |a|
      list.push(a[0])
    end
  end

  #自分のつけたい分野のランキングを確認。例)本、読書ランキング上位のブログ
  for i in 1..10
    res = Net::HTTP.get('ranking.ameba.jp','/genre/detail?genreCode=book&page='+i.to_s)
    res.to_s.scan(ameba_url) do |a|
      list.push(a[0])
    end
  end

  #この後に更に自分のつけたい分野のランキングがあるならば上記を同様に繰り返すを確認

  list.delete(blog_id)#自分のブログを外す
  list.delete("famousblog")#人気ブログへのリンクを外す
  list.delete("content")#プレミアムブログへのリンクを外す
  list1 = list.uniq
  list1 = list1 - not_list#ペタをつけない設定のブログを外す

  #ログデータのlogへの読み込み
  log = Array.new
  log = CSV.readlines('logdata.csv')


  #各ペタページにアクセスしてペタ貼りをする
  http3 = Net::HTTP.new('peta.ameba.jp',80)
  http3.start
  header = Hash::new
  header['Connection'] = 'Keep-Alive'
  header['Cookie'] = cookie_str(cookie)
  g = 0
  ng = 0
  nup = 0

  list1.each do |line|
    print "Checking ", line ," blog... "
    #Get peta_entry url
    response = Net::HTTP.get('ameblo.jp','/'+line+'/')
    if peta_blog_e_get = peta_entry.match(response)
      entry_point = peta_blog_e_get.begin(0)
      peta_e_log = peta_blog_e_get.to_s
      #serchi Amenber entry
      #if find amenber entry link, check position between peta_link
      if (amember_e_get = amember_entry.match(response)) and (entry_point > amember_e_get.begin(0))
        amember_path = amember_e_get.to_s
        amember_path.sub!(/secret.ameba.jp/,'')
        http2 = Net::HTTP.new('secret.ameba.jp')
        http2.start
        amember_response = http2.get(amember_path, header)
        http2.finish
      
        if peta_entry.match(amember_response.body)
          peta_e_path = peta_blog_e_get.to_s
          posting_text = "from blog entry(amenber).."
        else
          peta_e_path = '/p/addPeta.do?targetAmebaId='+line+'&service=profile'
          posting_text = "from Profile(not amenber)..."
        end
      else
        peta_e_path = peta_blog_e_get.to_s
        posting_text = "from blog entry..."
      end
      if (log.assoc(line) == nil) or (log.assoc(line)[1] != peta_e_log) then
        print "Posting Peta " + posting_text
        response = http3.get(peta_e_path,header)
        
        if petaIDget =peta_url.match(response.body)
          peta_path =  petaIDget.to_s
          response = http3.get(peta_path,header)
          if log.assoc(line) == nil then
            log << [line, peta_e_log]
          else
            log.assoc(line)[1] = peta_e_log
          end
          print "OK"
          g += 1
        else
          print "NG"
          ng += 1
        end
      else
        print "not updated."
        nup += 1
      end
    else
      print "can't find peta link."
    end
    print "\n"
  end
  http3.finish
  
  print "\n"
  print "Number of peta target blogs: ", list1.length, "\n"
  print "Post peta successed: ", g, "\n"
  print "Post peta faild: ",ng, "\n"
  print "Not updated blogs: ", nup, "\n"
  
  #ログデータの書き込み
  print "\n"
  print "Saving log data. Wait a moment..."
  CSV.open("logdata.csv", 'w') do |writer|
  print "finish!\n"
    log.each do |line|
    writer << line
    end
  end

else
  print "Wrong ID or wrong pathword!!"
end
http.finish