WWW::MechanizeでEUCのサイトにポストするには・・

以前、WWW::Mechanizeを拡張しset_hookってメソッドで・・・ってことをやって、EUCのサイト(livedoorなど)のスクレイピングができたってことを書いたけど、あれではEUCのサイトにポストすることができなかった。

そこで、なんとなく調べてみたっ。
RubyのMechanizeの0.9.2が出ました - きたももんががきたん。 の、「Fixed problems with Iconv (RF #24190, RF #24192, RF #24043) 」の解決策(?)あたりで、


これは、Page#encoding= に UTF-8 を指定すれば動作しますが、なんか頼んでもないことで勝手に変更されて全く無関係な値を指定しなければならない感じがちょっとヤな感じです。

っていわれてるし、ページを取得する度にpage#encodingの設定するのはどうかとは思うが、いちお以下の感じでEUCのサイトにポストすることができた。

#!/usr/bin/ruby -Ku
require 'rubygems'
require 'mechanize'
require 'kconv'

agent = WWW::Mechanize.new  # インスタンス生成
agent.user_agent_alias = 'Windows IE 7' # User-Agentの設定

# ログインする
page = agent.get("http://member.livedoor.com/login/?.sv=blog")
page.encoding = "UTF-8" # ページはEUC-JPだけど実行環境がUTF-8なので

form = page.forms.first
form['livedoor_id']="livedoorのID"
form['password']="password"
form['.next']='http://cms.blog.livedoor.com/cms/'
form['.sv']='blog'
page = agent.submit(form)
page.encoding = "UTF-8"

# ログイン後ブログ投稿画面へ
uri = page.links.find{|l|l.text=="ブログを投稿する"}.href
blog_id = uri.scan(/d+$/)
page = agent.get(uri)
page.encoding = "UTF-8"

# ブログ内容を投稿
form = page.form("ArticleForm")
form['blog_id']=blog_id
form['reload']=0
form['title']="記事のタイトル"
form['category_id1']="23072"
form['tag']=""
form['body']="記事の内容"
form['status']=-1
form['regist_datetime_YYYY']=Time.now.year
form['regist_datetime_MM']=Time.now.mon
form['regist_datetime_DD']=Time.now.day
form['regist_datetime_H']=Time.now.hour
form['regist_datetime_M']=Time.now.min
form['format']=1
form['allow_comment']=1
form['allow_ping']=1
form['.save']="投稿する"

page.encoding = "EUC-JP"  # 送信するためにEUC-JPにするとMechanizeが送信時に必要に応じて変換するみたい

page = agent.submit(form)
page.encoding = "UTF-8"