WWW::Mechanize による Webアクセスの自動化

 

ログインを必要とする Webサイトへのアクセスを自動化するには、 WWW::Mechanize を使用すると簡単です。

本稿では Ruby スクリプトを使用して Google にログインした後、 Google Bookmarks に1件のブックマークを投稿してみます。

フォームを調べる

スクリプトを作成する前に、ログインフォームと投稿フォームの name 属性を調べます。 図1図2 の朱書きの部分は、 実際に name 属性を調べた結果を記入したものです。

スクリプトでは、これらの "Email" や "Passwd" に対して値を設定します。


図1 ログインフォーム


図2 投稿フォーム

ソースコード

フォームにセットする文字列の文字コードを Shift JIS に変換しています。 理屈が分ってないのですが、Shift JIS へ変換しないと 図4 のように文字化けが発生します。 図4 の文字化けは UTF-8 で投稿した場合のものですが、 EUC-JP, JIS の場合も文字化けが発生します。

post2gbookmarks.rb
#!/usr/bin/ruby -Ku

require 'rubygems'
require 'mechanize'         # gem install mechanize
require 'nkf'

username = '<username>'     # Googleユーザ名
password = '<password>'     # パスワード

nkfopt = '-s -m0'   # Shift JIS に変換する。偶然のMIME文字列をデコードしない。

agent = WWW::Mechanize.new

# Google にログイン
page = agent.get('http://www.google.com/bookmarks/?hl=ja')
form = page.forms.first
form.Email  = username
form.Passwd = password
res = agent.submit(form)

# Google Bookmarks に1件のブックマークを投稿
page = agent.get('http://www.google.com/bookmarks/mark?op=add&hl=ja')
form = page.form('add_bkmk_form')
form.title      = NKF.nkf(nkfopt, 'SBM に投稿されたコメントを取得 | Diaspar Journal')
form.bkmk       = NKF.nkf(nkfopt, 'http://diaspar.jp/node/145')
form.labels     = NKF.nkf(nkfopt, '後で試す, ruby')
form.annotation = NKF.nkf(nkfopt, 'Hpricot のサンプルとして参考になる。')
res = agent.submit(form)

puts res.code == '200' ? 'OK': 'NG'

実行結果

$ ruby --version
ruby 1.8.5 (2007-03-13 patchlevel 35) [i386-linux]
$ chmod 700 post2gbookmarks.rb
$ ./post2gbookmarks.rb
OK

OK と表示されたら、ブラウザで Google Bookmarks を表示して、 スクリプトから投稿したエントリが表示されることを確認します(図3)。


図3 ブラウザで投稿を確認 (Shift JIS で投稿した場合 - 文字化け無し)


図4 ブラウザで投稿を確認 (UTF-8 で投稿した場合 - 文字化け有り)

改版履歴

日付 内容
2007-03-29 初版