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"