http://mono.kmc.gr.jp/~yhara/rubyscraping/?WWW%3A%3AMechanize
このクラスの中にどういったメソッドがあり、どういった戻り値を返すのか、詳細に書かれたページを教えてください。英語のサイトでもかまいません。googleでは少し調べてみましたが、詳しく書かれているページは探せませんでした。
またこのクラスとRubyを使って、Gmailにログインするところまで教えてください。PerlでWWW::Mechanizeを使ってログインする方法は見たことがありますが、rubyではありません。あくまでRubyでのログインスクリプトをお願いします。
参考サイト:
http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%2FWWW%3A%3AMechanize
(1) WWW::Mechanize について説明が参考になるサイト
下記のページではいかがでしょうか。
RubyのWWW::Mechanizeを解説してみる - きたももんががきたん。
こちらはもう見ているかと思いますが、念のため。
(2) このクラスとRubyを使って、Gmailにログインするところまで、、
以下のページが参考になると思います。ただそのページのコメント欄に書かれているのですが、ログインまでは行けているのに、その後の新規メール作成がうまく動かなくなってしまっているようです。私も(ログインまでは)確認しました。
Gmailでメールを送る - バリケンのRuby日記 - Rubyist
以上、お役に立てば良いのですが。。。
http://d.hatena.ne.jp/kitamomonga/20080328/kaisetsu_ruby_www_mec...
↑ここがいいですよ、日本語!
で、ログインスクリプトはこんなの。
require 'rubygems' require 'mechanize' agent = WWW::Mechanize.new login_page = agent.get "http://mail.google.com/mail/" form = login_page.forms.first form["Email"] = "[email protected]" form["Passwd"] = "XXXX" form.submit puts agent.page.body # >> <html><head><title>Redirecting</title> # >> <meta http-equiv="refresh" content="0; url='http://www.google.co.jp/accounts/SetSID?ssdc=1&sidt=Tml%2FgRoBAAA%3D.HB1yEA%2BWoVyr2afgZX0NuUva....."></head> # >> ごにょごにょ</html>
login_page = agent.get "http://mail.google.com/mail/"
form = login_page.forms.first
でなぜか、require 'mechanize'してるにも関わらずundefined method `forms' for #<WWW::Mechanize:0x3aaa124> (NoMethodError)と表示されます。ただagent.get "http://mail.google.com/mail/"まで実行すると正しく実行されるので、なぜformsがundefinedになるかわかりません。原因わかるでしょうか?
こちらでは正常に動作します。
Mechanizeのバージョンが古いなんてことはありませんか?
Rubyのバージョンは1.8.7です。
http://d.hatena.ne.jp/kitamomonga/20080328/kaisetsu_ruby_www_mec...
login_page = agent.get "http://mail.google.com/mail/"
の所を、
login_page = agent.get "http://mail.google.com/mail/h/"
として、gmailの「basic HTML」モードを対象として実行しないとまずいですよ。
前者のURIはAjaxで動くページのため、formなどはjavascriptで動的につくっているようです。地のhtmlファイルには、formが1つも見当たりません。従って、Mechanizeもformを見つけられず、その結果、login_page.formsはエラーとなります。
やったーメール送信できたよー
RubyのMechanizeでGmail送信できるようにした - きたももんががきたん。
すでに指摘がありますが、WWW::Mechanize のバージョンが古いんだと思います。
http://mail.google.com/mail/ に(ログイン済みのクッキーなしで)アクセスした結果は 302 Found で、Location ヘッダでログインフォームページに飛ばされてます。
もし、302 に対応してないバージョンの古い Mechanize をお使いの場合は、login_page はただの (念のためにリンクが1個書かれているだけの)ジャンプ用のページになってしまい、フォームがヒットしなくなってしまいます。login_page.forms が nil なのはそのせいなんじゃないでしょうか。
可能ならば WWW::Mechanize のアップグレードをおすすめします。
いや、原因が 302 に対応してないバージョンであるせいなのかはわからないんですが…
最新版の WWW::Mechanize 0.7.6 かひとつ前の WWW::Mechanize 0.7.5 でも同じ結果だという場合はたぶん何か困ったことが起きてます。
アップグレードはともかくログインできるかどうかだけでも確かめたい、という場合は以下のスクリプトをどうぞ。
古い Mechanize でも動くように書いた気がしますがきっと動かないんだろうな、という感じもします。
新しい Mechanize を使える人は参考にしないでください。
require 'rubygems' require 'mechanize' mail_address = '[email protected]' password = 'GMAIL_LOGIN_PASSWORD' agent = WWW::Mechanize.new # ログインしてクッキーを取得するだけ login_page = agent.get(URI.parse('https://www.google.com/accounts/ServiceLogin?service=mail')) login_form = login_page.forms[0] login_form.fields.name('Email').value = mail_address login_form.fields.name('Passwd').value = password login_form.submit # Googleアカウントのクッキー調査につきあう(302が数回) agent.get(URI.parse('http://mail.google.com/mail/h/')) while jump302 = agent.page.links[0] do jump302.click end inbox = agent.get(agent.page.body.scan(/content="0;URL=(.+?)"/).to_s) # やっと受信トレイを表示できたのでHTMLから太字を抽出してみる(表示はUTF-8) puts inbox.body.scan(/<b>(.+?)<\/b>/)
login_page = agent.get "http://mail.google.com/mail/"
form = login_page.forms.first
でなぜか、require 'mechanize'してるにも関わらずundefined method `forms' for #<WWW::Mechanize:0x3aaa124> (NoMethodError)と表示されます。ただagent.get "http://mail.google.com/mail/"まで実行すると正しく実行されるので、なぜformsがundefinedになるかわかりません。原因わかるでしょうか?