pythonのmechanizeではてぶする

pythonはてなブックマークの投稿をしたい。ほんで、投稿するためにははてなにログインする必要がある。どうしたらいいのかなーと考えてて、perlのmechみたいなものがpythonにもないかなと思って探してみたらmechanizeが見つかった。これ、perlのmechを参考に作ったらしい。
http://wwwsearch.sourceforge.net/mechanize/
で、早速インストールして使ってみようと思う。

インストール

ちなみに環境はSnowLeopardのPython 2.6.1

[02-05 11:41:48 suzuki@hoge /Users/suzuki] % easy_install mechanize
Searching for mechanize
Reading http://pypi.python.org/simple/mechanize/
Reading http://wwwsearch.sourceforge.net/mechanize/
Best match: mechanize 0.2.4
Downloading http://wwwsearch.sourceforge.net/mechanize/src/mechanize-0.2.4.tar.gz
Processing mechanize-0.2.4.tar.gz
Running mechanize-0.2.4/setup.py -q bdist_egg --dist-dir /var/folders/Sa/SaM9fOGkEteAEN8KMuERxk+++TI/-Tmp-/easy_install-jDPqBV/mechanize-0.2.4/egg-dist-tmp-pXjnuG
Adding mechanize 0.2.4 to easy-install.pth file

Installed /Library/Python/2.6/site-packages/mechanize-0.2.4-py2.6.egg
Processing dependencies for mechanize
Finished processing dependencies for mechanize

こんだけか。超簡単。

軽く使ってみる

>>> import mechanize
>>> br = mechanize.Browser()
>>> br.open("http://www.hatena.ne.jp/login") # はてなのログインページを開く
<response_seek_wrapper at 0x101404518 whose wrapped object = <closeable_response at 0x101404dd0 whose fp = <socket._fileobject object at 0x1010c5668>>>
>>> print br.title() # タイトルみてみる
ログイン - はてな
>>> br.select_form(nr=0)
br.select_form(nr=0)
>>> br.form
br.form
<mechanize._form.HTMLForm instance at 0x1013fce18>
>>> br['name'] = 'suzuki-shin'
br['name'] = 'suzuki-shin'
>>> br['password'] = '****'
br['password'] = '****'
>>> res = br.submit() # ログイン
res = br.submit()

これでログインまでできたっぽい。

はてなブックマークに投稿する

>>> import mechanize
>>> br = mechanize.Browser()
br = mechanize.Browser()
>>> br.open('http://www.hatena.ne.jp/login')
br.open('http://www.hatena.ne.jp/login')
<response_seek_wrapper at 0x101504830 whose wrapped object = <closeable_response at 0x101504518 whose fp = <socket._fileobject object at 0x1010bfde8>>>
>>> print br.title()
print br.title()
ログイン - はてな
>>> br.select_form(nr=0)
br.select_form(nr=0)
>>> br['name'] = 'suzuki-shin'
br['name'] = 'suzuki-shin'
>>> br['password'] = '****'
br['password'] = '****'
>>> res = br.submit() # さっきと同じようにログイン
res = br.submit()
>>> br.geturl() # なんとなくURLをみてみる
br.geturl()
'http://www.hatena.ne.jp/'
>>> br.open('http://b.hatena.ne.jp/entry/r.nanapi.jp/20588/') # 特定の記事のブックマークページを開く
br.open('http://b.hatena.ne.jp/entry/r.nanapi.jp/20588/')
<response_seek_wrapper at 0x1015046c8 whose wrapped object = <closeable_response at 0x101516a70 whose fp = <socket._fileobject object at 0x1010c5578>>>
>>> br.geturl()
br.geturl()
'http://b.hatena.ne.jp/entry/r.nanapi.jp/20588/'
>>> for f in br.forms():print f # なんとなくそのページにあるフォームをみてみる
for f in br.forms():print f
... 

<GET http://b.hatena.ne.jp/search application/x-www-form-urlencoded
  <TextControl(q=)>
  <SubmitControl(<None>=) (readonly)>>
<POST http://b.hatena.ne.jp/entry.update_category application/x-www-form-urlencoded
  <HiddenControl(rks=ea0c4e56970629cb0aebb202497931b077a6f8f6) (readonly)>
  <HiddenControl(url=http://r.nanapi.jp/20588/) (readonly)>
  <SelectControl(category_id=[4, 1, *0, 3, 6, 2, 5, 7])>
  <SubmitControl(<None>=変更) (readonly)>>
<POST http://b.hatena.ne.jp/entry.refresh application/x-www-form-urlencoded
  <HiddenControl(rks=ea0c4e56970629cb0aebb202497931b077a6f8f6) (readonly)>
  <HiddenControl(eid=28981153) (readonly)>
  <SubmitControl(refresh=更新する) (readonly)>>
>>> br.follow_link(url_regex=r'add\.confirm') # 確認ページへのリンクをたどる
br.follow_link(url_regex=r'add\.confirm')
<response_seek_wrapper at 0x1015045f0 whose wrapped object = <closeable_response at 0x101528098 whose fp = <socket._fileobject object at 0x1010e58c0>>>
>>> print br.title() # タイトルを確認
print br.title()
はてなブックマーク - ブックマーク - ブックマークを追加 - ブックマークの確認
>>> for f in br.forms():print f # フォームをみてみる(これで2つめのフォームが投稿フォームだとわかる)
for f in br.forms():print f
... 

<GET http://b.hatena.ne.jp/search application/x-www-form-urlencoded
  <TextControl(q=)>
  <SubmitControl(<None>=) (readonly)>>
<POST http://b.hatena.ne.jp/suzuki-shin/add.edit application/x-www-form-urlencoded
  <HiddenControl(rks=ea0c4e56970629cb0aebb202497931b077a6f8f6) (readonly)>
  <HiddenControl(url=http://r.nanapi.jp/20588/) (readonly)>
  <HiddenControl(from=web-confirm) (readonly)>
  <TextareaControl(comment=)>
  <SubmitControl(<None>=追加する) (readonly)>>
>>> br.select_form(nr=1) # 2つめのフォームを指定する
br.select_form(nr=1)
>>> res = br.submit() # 投稿
res = br.submit()
>>> 

で、ブックマークページを確認してみると、、おぉ、投稿できてる。めでたしめでたし。

ちょっと、つまったところ

mechanizeのメソッドの使い方なんかを詳しく知りたくてドキュメント探したんだけど、http://wwwsearch.sourceforge.net/mechanize/ではexampleとかしか見つけられなくて、結局mechanizeのソースみた。

感想

pythonのmechanizeも簡単に使えていいな