Python + FlaskでTumblrのOAuth認証まで

ライブラリを使うだけの話です。

環境 + ライブラリ

Python 3.x だと Flask-OAuth でエラーが出て使えなかった。

アプリケーションの登録

www.tumblr.com

今回は Callback URL を http://127.0.0.1:5000/callback

と設定する。 ConsumerKey と ConsumerSecret を保存しておく。

ソース

# -*- coding: utf-8 -*-
# oauth.py
import os

from flask import Flask, session, redirect, url_for, request, flash
from flask_oauth import OAuth

from tumblpy import Tumblpy

app = Flask(__name__)
app.secret_key = os.urandom(24)

oauth = OAuth()

CONSUMER_KEY = "<your consumer key>"
CONSUMER_SECRET = "<your consumer secret>"

BASE_URL = "https://api.tumblr.com/v2/"
REQUEST_TOKEN_URL = "https://www.tumblr.com/oauth/request_token"
ACCESS_TOKEN_URL = "https://www.tumblr.com/oauth/access_token"
AUTHORIZE_URL = "https://www.tumblr.com/oauth/authorize"


tumblr_app = oauth.remote_app('tumblr',
    base_url=BASE_URL,
    request_token_url=REQUEST_TOKEN_URL,
    access_token_url=ACCESS_TOKEN_URL,
    authorize_url=AUTHORIZE_URL,
    consumer_key=CONSUMER_KEY,
    consumer_secret=CONSUMER_SECRET
)

@tumblr_app.tokengetter
def get_tumblr_token(token=None):
    return session.get("request_token")

@app.route("/login")
def login():
    return tumblr_app.authorize(callback=url_for("callback",
        next=request.args.get("next") or request.referrer or None))

@app.route("/callback")
@tumblr_app.authorized_handler
def callback(resp):
    """ callback されたときに実行される """
    next_url = request.args.get("next") or url_for("index")
    if resp is None:
        flash(u"You denied the request to sign in.")
        return redirect(next_url)

    # session を保存
    session["request_token"] = (
            resp["oauth_token"],
            resp["oauth_token_secret"]
    )
    
    # とりあえず index にリダイレクトする
    return redirect(next_url)

@app.route("/")
def index():
    # session があれば表示する
    if "request_token" in session:
        request_token = session["request_token"]
        t = Tumblpy(CONSUMER_KEY, CONSUMER_SECRET,
            request_token[0], request_token[1])

        user_info = t.post('user/info')
        print user_info

        return "login was successful"

    return "index"

app.run()

python oauth.py

実行後に http://127.0.0.1:5000/login にアクセスすると認証画面が出てくる。 OK すると index に飛ばされ、"login was successful" と表示される。

ここまでできていれば、コンソールに tumblr アカウントの情報が出力される。

その他

はじめはエラーで悩んでいたけどライブラリが python3 に対応してないのが原因だった。python だとバージョン間の違いが顕著に出てくるから注意(まあ他の言語でも言えそう…)。

Web も Flask も初心者だけど、簡単な web アプリなら作れそうだと思った。もしくは作れないか、どっちかです。

参考

Tumblr APIでwebサービスを作りたい全ての人に向けて書きました

Flask-OAuth — Flask-OAuth

Tumblr API OAuth認証の方法(PHPサンプル付き) - Qiita