Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Pythonではてなの OAuth 対応 API を利用する(python3版)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
フレームワークとして Flask(http://flask.pocoo.org/) を、OAuth ライブラリとして oauth2(http://pypi.python.org/pypi/oauth2/) を利用したサンプルプログラムです。
下のコードを保存して (oauth_consumer.py とします)、YOUR_CONSUMER_KEY, YOUR_CONSUMER_SECRET となっている部分を自分の consumer_key, consumer_secret で置き換えます。(settings.pyに保存してください)
$ python oauth_consumer.py
... で起動してから http://localhost:5000 に Web ブラウザでアクセスして下さい。
+ 2015/10/25 python3用に書き換えました。
"""
import urllib.parse as urlparse
try:
import json
except ImportError:
try:
import simplejson as json
except ImportError:
from django.utils import simplejson as json
import flask
from flask import (
session, request, redirect, url_for, render_template_string,
)
import oauth2 as oauth
import settings
CONSUMER_KEY=settings.CONSUMER_KEY
CONSUMER_SECRET=settings.CONSUMER_SECRET
SECRET_KEY = settings.SECRET_KEY
SCOPE = settings.SCOPE
DEBUG = settings.DEBUG
REQUEST_TOKEN_URL=settings.REQUEST_TOKEN_URL
ACCESS_TOKEN_URL=settings.ACCESS_TOKEN_URL
AUTHORIZE_URL=settings.AUTHORIZE_URL
app = flask.Flask(__name__)
app.secret_key = SECRET_KEY
app.config['DEBUG'] = DEBUG
consumer = oauth.Consumer(CONSUMER_KEY, CONSUMER_SECRET)
TEMPLATE = """
<html>
<head>
<titile></title>
</head>
<body>
{% if user %}
<p>
Hello {{ user.display_name }}(id:{{ user.url_name }})
<img src="{{ user.profile_image_url }}">
</p>
<p><a href="{{ url_for('logout') }}">LOGOUT</a></p>
{% else %}
<p>Hello GUEST<img src="http://cdn.www.st-hatena.com/users/ri/ritou/profile.gif"></p>
<p><a href="{{ url_for('login') }}">LOGIN</a></p>
{% endif %}
</body>
</html>
"""
@app.route('/')
def index():
ctx = { 'user': None}
access_token = session.get('access_token')
if access_token:
# access_tokenなどを使ってAPIにアクセスする
token = oauth.Token(access_token['oauth_token'], access_token['oauth_token_secret'])
client = oauth.Client(consumer, token)
resp, content = client.request('http://n.hatena.com/applications/my.json')
# bytes列を文字列に変換
content_str = content.decode('utf-8')
ctx['user'] = json.loads(content_str)
return render_template_string(TEMPLATE, **ctx)
# リクエストトークン取得から認証用URLにリダイレクトするための関数
@app.route('/login')
def login():
# リクエストトークンの取得
client = oauth.Client(consumer)
resp, content = client.request('%s?scope=%s&oauth_callback=%s%s' % \
(REQUEST_TOKEN_URL, SCOPE, request.host_url, 'on-auth'))
# セッションへリクエストトークンを保存しておく
# byte文字列をstringに変換
request_token = bytes2str(urlparse.parse_qs(content))
session['request_token'] = request_token
# 認証用URLにリダイレクトする
return redirect('%s?oauth_token=%s' % (AUTHORIZE_URL, session['request_token']['oauth_token']))
# セッションに保存されたトークンを破棄しログアウトする関数
@app.route('/logout')
def logout():
if session.get('access_token'):
session.pop('access_token')
if session.get('request_token'):
session.pop('request_token')
return redirect(url_for('index'))
# 認証からコールバックされ、アクセストークンを取得するための関数
@app.route('/on-auth')
def on_auth():
# リクエストトークンとverifierを用いてアクセストークンを取得
request_token = session['request_token']
token = oauth.Token(request_token['oauth_token'], request_token['oauth_token_secret'])
token.set_verifier(request.args['oauth_verifier'])
client = oauth.Client(consumer, token)
resp, content = client.request(ACCESS_TOKEN_URL)
# アクセストークンをセッションに記録しておく
session['access_token'] = bytes2str(urlparse.parse_qs(content))
return redirect(url_for('index'))
def bytes2str(bytes_dic):
request_token = {}
request_token_bytes = bytes_dic
for key in request_token_bytes:
request_token[key.decode('utf-8')] = request_token_bytes[key][0].decode('utf-8')
return request_token
if __name__ == '__main__':
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment