developer's diary

最近はc#のエントリが多いです

RubyのMechanizeでシリアルクッキー作る時にsave_asとloadでハマったのでcookie_jarごとシリアルにして食べました。

とあるサイトにMechanizeでログインする上で、何度もログインするのは良くないと思い、Cookieを使い回そうと試みたのですが、cookie_jarのloadとsave_asが上手く働いてくれなかったのでその場合の対応をメモします。

試したロジック

a = Mechanize.new
a.cookie_jar.load("example.yaml") #yaml形式のcookieを読み込む
if isLogin(a) then #ログイン出来ているかチェック
   puts "loginできてないですよ"
   login(a) #ログインする関数
   a.cookie_jar.save_as("example.yaml") #cookieをyaml形式で保存
else
   puts "login OK!"
end

よし。これで実行すると。。。

[user@localhost]$ ruby login.rb
loginできてないですよ
[user@localhost]$ ruby login.rb
loginできてないですよ
[user@localhost]$ ruby login.rb
loginできてないですよ

....あれ?2回目はシリアルクッキーを食べて上手くいくはずなのになぜ??

じゃあジャーごと食べてしまおう。...(--;)

a = Mechanize.new

yaml_text = File.read("example.yaml", :encoding => Encoding::UTF_8)
a.cookie_jar = YAML.load(yaml_text)
#a.cookie_jar.load("example.yaml") #yaml形式のcookieを読み込む
if isLogin(a) then #ログイン出来ているかチェック
   puts "loginできてないですよ"
   login(a) #ログインする関数
   File.write("example.yaml", a.cookie_jar.to_yaml)
   #a.cookie_jar.save_as("example.yaml") #cookieをyaml形式で保存
else
   puts "login OK!"
end

loadメソッドとsave_asは利用せずに、cookie_jarをそのままシリアライズしました。 するとどうでしょう。2回目以降はログイン処理を通さずにCookieが上手く利用されてます!

[user@localhost]$ ruby login.rb
loginできてないですよ
[user@localhost]$ ruby login.rb
login OK!
[user@localhost]$ ruby login.rb
login OK!