PythonでHTTPS通信してはてなにログインしてみる

今書いているプログラムでhttps通信を使ったログイン処理っぽい事をする必要が出てきたのでPythonのマニュアルを読んで、簡単にできることがわかりました。urllib2を使うみたいだ。
http://www.python.jp/doc/2.5/lib/urllib2-examples.html

サンプルとして、はてなにログインするプログラムを書きました。

import urllib2

url = 'https://www.hatena.ne.jp/login'

name = '' # type your own username
password = '' # password

req = urllib2.Request(url, 'name=%s&password=%s' % (name, password))
#req.add_header('hoge', 'fuga')
cont = urllib2.urlopen(req).read()

f = open('out.html', 'w')
f.write(cont)
f.close()

変数にユーザ名とパスワードを入力して実行するとout.htmlにレスポンスが保存されます。実行後にfirefoxで開くと、

ログインできました。

ただこれだとレスポンスに含まれるクッキー情報を保持しておかないのでセッションを維持できずログイン処理をした意味がありません。クッキーを扱う必要があります。
http://www.python.jp/doc/2.5/lib/module-urllib2.html
http://www.python.jp/doc/2.5/lib/http-cookie-processor.html

urllib2.build_openerでインスタンス化されるOpenerDirectorクラスは、内部でハンドラ群を持っていて、リクエスト・レスポンスをそのハンドラ群に処理させる・・・らしい。適当な事言ってます。

urllib2にはハンドラの一つとして、HTTPCookieProcessorというHTTPリクエストに対してCookieヘッダを付加したり、レスポンスに含まれるSet-Cookieヘッダを読み取って保存してくれるCookie処理のハンドラが定義されていますが、デフォルトのハンドラとしては定義されていません。そのため自分でハンドラ群に加える必要があります。OpenerDirector.add_handlerでハンドラを追加します。

試しに、ログイン後にはてなダイアリーの編集ページにアクセスしました。ダイアリーの編集ページはログインしていないとブログトップにリダイレクトされてしまいます。クッキーが正しく処理されていれば編集ページが表示されるはずです。

import urllib2
import cookielib

name = ''
password = ''


url = 'https://www.hatena.ne.jp/login'
req = urllib2.Request(url, 'name=%s&password=%s' % (name, password))
#req.add_header('hoge', 'fuga')

opener = urllib2.build_opener()
opener.add_handler(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))

conn = opener.open(req)

url = 'http://d.hatena.ne.jp/%s/edit' % name
req = urllib2.Request(url)
conn = opener.open(req)

cont = conn.read()

f = open('out.html', 'w')
f.write(cont)
f.close()

ログインできました。