超便利な 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 を利用してみてください。