人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: popattack
●カテゴリ:コンピュータ インターネット
✍キーワード:Gmail Google Perl Ruby WWW
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● kmon
●23ポイント

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

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

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

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

mechanize-0.7.6 Documentation


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

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

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


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

◎質問者からの返答

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


2 ● るびきち
●23ポイント

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"] = "XXXX@gmail.com"
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>
◎質問者からの返答

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


3 ● るびきち
●22ポイント

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

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

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

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


4 ● kmon
●22ポイント
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/


5 ● kitamomonga
●10ポイント

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

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 = 'login_address@gmail.example.com'
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>/)
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ