2012-05-11
超便利な Python モジュール requests を使って OAuth 認証し、Zaim と連携する方法
「HTTP for Humans」でおなじみの requests モジュールが 0.12.0 で OAuth に対応し、0.12.1 では HTTP レスポンスが JSON だった場合、オブジェクトへ自動変換できるようになりました。かなり手軽に Web サービスの API をたたけるようになりました。
そこで、試しに Zaim と連携してみたいと思います。
requests のインストール
pip install requests
または
easy_install requests
アプリケーションを登録
Zaim Developers にアクセスし、「アプリケーションを登録」してください。
Consumer Key や Consumer Secret が発行されるのでそれらをメモしておきます。
Access Token を発行する
Python スクリプトから OAuth 認証を要求し、zaim のログイン画面でログイン後、Access Token が発行されます。
以下が Access Token 取得用 Python スクリプトです。
スクリプトを実行すると、認証用 URL が表示され、「What is the PIN?」と聞かれますので、oauth_verifier の値を入力します。
ちなみに oauth_verifier は画面には表示されず、ブラウザで「ソースを表示」すると oauth_verifier が書いてあります。
consumer_key, consumer_secret の設定をお忘れ無く。
# coding: utf-8 import urlparse import requests from requests.auth import OAuth1 consumer_key = u"YOUR CONSUMER KEY" consumer_secret = u"YOUR CONSUMER SECRET" request_token_url = u"https://api.zaim.net/v1/auth/request" authorize_url = u"https://www.zaim.net/users/auth" access_token_url = u"https://api.zaim.net/v1/auth/access" callback_uri = u"https://www.zaim.net/" def oauth_requests(): # Request Token # Web サービスとして実装する場合は、callback_uri に認証が完了したことが通知される。 # callback_uri にリダイレクトする際、oauth_verifier がパラメータとして渡される。 auth = OAuth1(consumer_key, consumer_secret, callback_uri=callback_uri) r = requests.post(request_token_url, auth=auth) request_token = dict(urlparse.parse_qsl(r.text)) # Authorize print "Auth link:" print "%s?oauth_token=%s" % (authorize_url, request_token["oauth_token"]) print oauth_verifier = unicode(raw_input("What is the PIN? ")) auth = OAuth1(consumer_key, consumer_secret, request_token["oauth_token"], request_token["oauth_token_secret"], verifier=oauth_verifier) r = requests.post(access_token_url, auth=auth) access_token = dict(urlparse.parse_qsl(r.text)) return access_token if __name__ == "__main__": print oauth_requests()
Zaim と連携する
Access Token がとれたら、Zaim API にアクセスできるようになります。
consumer_key, consumer_secret, oauth_token の設定をお忘れ無く。
以下のスクリプトで情報表示、支払い情報の入力を行っています。
requests のおかげで楽ちんですね。あとはリファレンスを参照しながら遊んでみましょう。
# coding: utf-8 from datetime import datetime import requests from requests.auth import OAuth1 consumer_key = u"YOUR CONSUMER KEY" consumer_secret = u"YOUR CONSUMER SECRET" access_token = u"ACCESS TOKEN" access_secret = u"ACCESS TOKEN SECRET" auth = OAuth1(consumer_key, consumer_secret, access_token, access_secret) def date_now(): return datetime.now().strftime("%Y-%m-%d") def genre(lang="ja"): endpoint = "https://api.zaim.net/v1/genre/pay.json" data = {"lang": lang} r = requests.post(endpoint, data=data, auth=auth) return r.json def create_payment(price=0): endpoint = "https://api.zaim.net/v1/pay/create.json" data = { "category_id": "101", "genre_id": "10101", "price": unicode(price), "date": date_now(), "comment": "test", } r = requests.post(endpoint, data=data, auth=auth) return r.json def money(): endpoint = "https://api.zaim.net/v1/money/index.json" data = {"limit": "10",} r = requests.post(endpoint, data=data, auth=auth) return r.json def credentials(): endpoint = "https://api.zaim.net/v1/user/verify_credentials.json" r = requests.post(endpoint, auth=auth) return r.json if __name__ == "__main__": print "-" * 100 print genre() print "-" * 100 print create_payment(1234) print "-" * 100 print money() print "-" * 100 print credentials()
まとめ
requests モジュールのおかげで、REST API へのアクセスが簡単になりました。
お気に入りの Web サービスと連携したい場合は、requests を利用してみてください。