Rubyによるアメブロのペタ貼り自動化スクリプト(2)
まず、ライブラリの読み込みと、変数・関数の準備する。
ライブラリは、Rubyに標準添付されているHTTPクライアントライブラリの'net/http'と、URIサポートライブラリ'uri'を読み込み。
(実は、今のところ'uri'は使っていないのだけれど…)
require 'uri' require 'net/http' Net::HTTP.version_1_2 #おまじない
ここでNet::HTTP.version_1_2は、Rubyのnet/httpライブラリのバージョンを指定するためのおまじない。
このライブラリは前バーションとの差異が大きいので、どちらも使える様に移行期間中らしい。
次にcookieを格納するためのハッシュを準備。
それからプログラムを簡単にするため、内部で繰り返し使う機能を関数にする。
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 #ハッシュcookieから、 #HTTPのリクエストヘッダに挿入する文字列を生成する def cookie_str(cook) cook.map{|k,v| "#{k}=#{v}" }.join(';') end
準備が出来たら、いよいよアメブロにアクセスする。
まず最初に人間がブラウザでログインするページ'http://www.ameba.jp/'にアクセスして、cookie'JSESSIONID'を貰う。
ここで大事なのはセッションを切らない事なので、リクエストヘッダの'Connection'に'Keep-Alive'をセットする。
同時にNet::HTTP.startするのだけれど、ブロックを使わない様にしている。
(これは、ブロックを使えばセッションを確実に終わらせられるという、Rubyお奨めの書き方からちょっと外れた書き方)
リクエストを投げて、返ってきたヘッダの中の'set-cookie'の項目をハッシュ変数cookieに格納する。
# 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 #入手したクッキーからセッションID等をハッシュに設定する set_cookie_from_res(response,cookie)
この状態では、まだセッションは繋がっている事に注意!<続く>