RubyのクラスにWWW::Mechanizeがあります。

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2008/06/20 14:40:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:kmon No.1

回答回数27ベストアンサー獲得回数5

ポイント23pt

(1) WWW::Mechanize について説明が参考になるサイト

下記のページではいかがでしょうか。

RubyのWWW::Mechanizeを解説してみる - きたももんががきたん。

こちらはもう見ているかと思いますが、念のため。

mechanize-0.7.6 Documentation


(2) このクラスとRubyを使って、Gmailにログインするところまで、、

以下のページが参考になると思います。ただそのページのコメント欄に書かれているのですが、ログインまでは行けているのに、その後の新規メール作成がうまく動かなくなってしまっているようです。私も(ログインまでは)確認しました。

Gmailでメールを送る - バリケンのRuby日記 - Rubyist


以上、お役に立てば良いのですが。。。

id:popattack

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になるかわかりません。原因わかるでしょうか?

2008/06/18 03:33:31
id:rubikitch No.2

回答回数120ベストアンサー獲得回数22

ポイント23pt

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&amp;sidt=Tml%2FgRoBAAA%3D.HB1yEA%2BWoVyr2afgZX0NuUva....."></head>
# >> ごにょごにょ</html>
id:popattack

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になるかわかりません。原因わかるでしょうか?

2008/06/18 03:33:30
id:rubikitch No.3

回答回数120ベストアンサー獲得回数22

ポイント22pt

こちらでは正常に動作します。

Mechanizeのバージョンが古いなんてことはありませんか?

Rubyのバージョンは1.8.7です。

http://d.hatena.ne.jp/kitamomonga/20080328/kaisetsu_ruby_www_mec...

id:kmon No.4

回答回数27ベストアンサー獲得回数5

ポイント22pt
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はエラーとなります。

http://q.hatena.ne.jp/

id:kitamomonga No.5

回答回数1ベストアンサー獲得回数0

ポイント10pt

やったーメール送信できたよー

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>/)

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません
${title} {{if price }}
${price}円
{{/if}}