Rubyによるアメブロのペタ貼り自動化スクリプト(16) まとめ
いささか不具合があるものの、一旦、改善したスクリプトをココに貼って、一区切り。
クライアントからは、『Androidスマートフォンから同様の事が出来る様にしてくれ』というワガママな依頼が来ている。
AndroidはJavaのサブセットだから、アルゴリズムが決まっていれば、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