-
-
Save pn11/3dfe5d6465a48795d1f0d5d5c3b0d780 to your computer and use it in GitHub Desktop.
Pythonではてなの OAuth 対応 API を利用する(python3版)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CONSUMER_KEY = 'コンシューマキー' | |
CONSUMER_SECRET = 'コンシューマシークレット' | |
SECRET_KEY = '使わない' | |
SCOPE = 'read_public' | |
DEBUG = '' | |
REQUEST_TOKEN_URL = 'https://www.hatena.com/oauth/initiate' | |
ACCESS_TOKEN_URL = 'https://www.hatena.ne.jp/oauth/token' | |
AUTHORIZE_URL = 'https://www.hatena.ne.jp/oauth/authorize' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment