読者です 読者をやめる 読者になる 読者になる

OAuthを簡単に利用するためのツールoauthlibを書いた

http://github.com/taka84u9/oauthlib
OAuthって便利だけど、RequestTokenとかAccessTokenとか色々やり取りが合って結構面倒ですよね。
Pythonで使えるOAuth用ライブラリとしてはLeah Culverという人が公開しているpython-oauthっていうモジュールがあるのですが、確かにOAuthのPython実装としてはいいのだけれど、OAuthのアルゴリズムを分かっている人じゃないと、上手に使いこなすのは難しい状態です。
今回書いたoauthlibはLeahさんのモジュールの薄いラッパーとなっています。

内容

oauthlibは現在oauth.py, oauth_tools.py, twitter.pyの3つのファイルから構成されています。

oauth.py

これがLeah Culverさんの書いたモジュールです。

oauth_tools.py

OAuthの中で最も大事なRequest Tokenの取得、User Authorization URLの構築、Access Tokenの取得を簡単に行えるようにするためのoauty.pyに対する薄いラッパー。

twitter.py

oauth_tools.pyにあるOAuthクラスを継承したTwitterOAuthクラスと、さらにDjangoでの活用に特化したDjangoTwitterOAuthクラスがある。

使い方

OAuthクラスは継承して、それぞれのサービスに特化したクラスを作成するための抽象クラスとなっています。
具体的な作り方はTwitterOAuthクラスを見ればだいたい分かるんじゃないかと。そのうち使い方のコメントも書こうと思います。

DjangoTwitterOAuthの使用例

urls.py

urlpatterns = patterns("",
    url(r"^update/$", "myapp.views.update_status", name="update_status"),
    url(r"^return/$", "myapp.views.twitter_return", name="twitter_return")
)

myapp/views.py

from oauthlib.twitter import DjangoTwitterOAuth

def update_status(request):
    if request.method == "POST":
        form = SomeForm(request.POST)
        if form.is_valid():
            status = form.cleaned_data["status"]
            dto = DjangoTwitterOAuth()
            updated, auth_url = dto.update_status(request, status)
            if updated:
                request.user.message_set.create(message=u"Twitterに投稿しました")
                return HttpResponseRedirect(redirect_to)
            else:
                request.session["status"] = status
                return HttpResponseRedirect(auth_url)
    else:
        form = SomeForm()
    return render_to_response(template_name, {"form": form})

def twitter_return(request):
    dto = DjangoTwitterOAuth()
    dto.request_helper(request)
    updated = dto.update_status(request, request.session["status"])[0]
    if updated:
        request.message_set.create(message=u"Twitterに投稿しました")
        return HttpResponseRedirect(redirect_to)
    else:
        # ここにくるはずはない....
        return HttpResponseServerError()