mecanize.rb で mixi diary を自動取得する

Posted by yoosee on Web at 2005-09-02 23:42 JST

*1  WWW::Mechanize alike in ruby

WWW::Mechanize は Webページに対して、ブラウザからのアクセス的な処理を自動化して行える ruby library。例えば

http://example.com にアクセス → 1番目の form の各フィールドに foo, bar, baz を入力して submit → ページ内の "foo" を含む link を列挙してクリック → ページを取得

と言ったアクセスの動作を記述できる Ruby library 。元は Perl に同名の WWW::Mechanize があり、それの ruby 版と言った立ち位置のようだ。Web Test フレームワークで同様の機能を持つものは結構あるが、それをプログラム内から使えるようにライブラリ化したものと考えればいいかも。

*2  WWW::Mechanize alike in ruby を使って mixi にアクセス

mixi へ login した後に新着日記の URL 一覧をとるには、以下のようにすればいい。
require 'mechanize'
username = 'foobar@example.com'
password = 'foobarbaz'

agent = WWW::Mechanize.new {|a| a.log = Logger.new('access.log') }
page = agent.get('http://mixi.jp/')
form = page.forms[0]
form.fields.find {|f| f.name == 'email'}.value = username
form.fields.find {|f| f.name == 'password'}.value = password
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)

if /url=([^"])"/ =~ page.body
  link = 'http://mixi.jp' + $1.to_s
  agent.get(link)
end

diarylist = agent.get('http://mixi.jp/new_friend_diary.pl')
diarylist.links.each do |link|
  diaryurl = link.href # => 'view_diary.pl?id=12345&owner_id=2345'
end
といった感じ。page.body が html text を持つので文字列操作などをしたいときはこれを使うと良い。

*3  mechanize.rb と net/smtp を同時に require → トラブル

しかし便利なだけかと思ったら微妙な落とし穴と言うか不具合が。mechanize を使いつつ net/smtp を使うと、Net::SMTP.start(host) ... が
/usr/lib/ruby/1.8/net/smtp.rb:393:in `do_start':
private method `open' called for Net::InternetMessageIO:Class (NoMethodError)
などというエラーを吐くんである。net/smtp のみを使った場合はなんの問題もなく、mechanize を require すると発生する問題のようだ (さらっと書いているが突き止めるのに数時間かかった…)。

調べてみると、mechanize には mechanize/net-overrides/protocols.rb と言うファイルがあり、mechanize.rb の先頭で load-path に上記を追加している。これにより純正の net/protocols.rb が上書きされており、Net::InternetMessageIO を全く完全に再実装しているのがトラブルの元らしい。どうやら経過措置のつもりのようだが、少なくとも ruby1.8.2 の標準 net/protocols との組合わせでは mechanize は動作しない。結局 system から mailx を呼ぶという逃げを打ってしまったが、こんなのどう解決するのが正しいんだろう? 恐らくこのままだと net/smtp だけでなく、net/protocols を使う他の net/* ライブラリも影響を受けるだろうし、load-path をいじられてると分離も難しそう。mechanize 内部の require や Net::* を色々いじれば逃げられるだろうか。

( Permalink | Comments (3) | tags: programming  ruby  )
1. mixi2gmail from World Wide Walker at 2005-10-13 19:53
[mixi2gmail] とりあえず trac なサイトに、mixi 最新日記を取得して htmlメールとして送信する mixi2gmail.rb の最新版を置いときました。利用には ruby 及び WWW::Mechanize (手元のものは 0.3.1) が必要。以前書いた通り、mechanize.rb を使って mixi 日記を取得 しています。h.....
mecanize.rb で mixi diary を自動取得する mecanize.rb で mixi diary を自動取得する - World Wide Walker yooseeさんの上記のエントリーを参考にMixi新着日記のURLのリストを自動取得するPRaggerプラグインを作...
まだちゃんとテストも出来てないですが…。 ブログに書いた内容をmixiにも投稿したい場合に使うことを想定しています。 仕様は以下の通り。 RSSフィードの最初の一つを投稿する titleはYAMLで指定しない場合は一つ目のフィードのtitle merge_feedsを指定した場合は、フィー...
yahooブリーフケースを一括でダウンロードするツールを探したのですが、見つからないので作ってみました。 インターネットストレージとしてのYahooブリーフケース - sshi.Continualでも自動化らしきことが書いていたので少しは需要があるのかな? 自動化ツールを使うことで...
Comments
1. garyo at 2007-02-23 22:04  (link)
こんにちは。garyoといいます。こちらのエントリーを参考にPRagger用にMixi新着日記のURLのリストを自動取得するPRaggerプラグインを作成しました。PRaggerの開発元に送っても宜しいでしょうか。
2. yoosee at 2007-02-24 00:28
はい、問題ありません。PRagger は近いうちに手を出してみようと思っていますので、巡って私も使うかもしれませんし。
3. garyo at 2007-02-26 00:14  (link)
ありがとうございます。
mechanizeさわってみましたが、難しいですね。

Please write your comment. email address won't appear. Cannot use any HTML tags in comment.
コメントをお書き下さい。メールアドレスは公開されません。 またHTMLタグは利用できません。
Name   E-mail   URL
Comment

About W.W.Walker

World Wide Walker は yoosee による blog です。PDA, Web・サーバ技術, 美味しい食べ物などの話題を取り上げています... read more

このエントリーのブックマーク

Monthly Archives

Select Month to read