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)

この状態では、まだセッションは繋がっている事に注意!<続く>