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()
ログインできました。