Last active
August 29, 2015 14:05
-
-
Save c-bata/7807f84a64b7a6f3d533 to your computer and use it in GitHub Desktop.
Python/FlaskでRauthライブラリを使ったTwitterログイン
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
from flask import (Flask, flash, request, redirect, render_template, session, | |
url_for) | |
from rauth.service import OAuth1Service | |
from rauth.utils import parse_utf8_qsl | |
from datetime import datetime | |
CONSUMER_KEY = 'consumer key' | |
CONSUMER_SECRET = 'consumer secret' | |
# Flask setup | |
app = Flask(__name__) | |
app.secret_key = 'secret key' | |
# rauth OAuth 1.0 service wrapper | |
twitter = OAuth1Service( | |
name='twitter', | |
consumer_key=CONSUMER_KEY, | |
consumer_secret=CONSUMER_SECRET, | |
request_token_url='https://api.twitter.com/oauth/request_token', | |
access_token_url='https://api.twitter.com/oauth/access_token', | |
authorize_url='https://api.twitter.com/oauth/authorize', | |
base_url='https://api.twitter.com/1.1/') | |
# views | |
@app.route('/') | |
def index(): | |
if 'username' in session: | |
return 'Hello %s<br><a href="/logout">Log out.</a>' % session['username'] | |
return '<a href="/login">Sign in with Twitter</a>' | |
@app.route('/login') | |
def login(): | |
if 'username' in session: | |
return redirect(url_for('index')) | |
oauth_callback = url_for('callback', _external=True) | |
params = {'oauth_callback': oauth_callback} | |
r = twitter.get_raw_request_token(params=params) | |
data = parse_utf8_qsl(r.content) | |
session['twitter_oauth'] = (data['oauth_token'], | |
data['oauth_token_secret']) | |
return redirect(twitter.get_authorize_url(data['oauth_token'], **params)) | |
@app.route('/callback') | |
def callback(): | |
""" | |
OAuth callback from Twitter | |
""" | |
request_token, request_token_secret = session.pop('twitter_oauth') | |
# check to make sure the user authorized the request | |
if not 'oauth_token' in request.args: | |
flash('You did not authorize the request') | |
return redirect(url_for('index')) | |
try: | |
creds = {'request_token': request_token, | |
'request_token_secret': request_token_secret} | |
params = {'oauth_verifier': request.args['oauth_verifier']} | |
sess = twitter.get_auth_session(params=params, **creds) | |
except Exception, e: | |
flash('There was a problem logging into Twitter: ' + str(e)) | |
return redirect(url_for('index')) | |
# tweet test | |
text = 'test tweet - {now_time}'.format(now_time=datetime.now()) | |
response = sess.post('statuses/update.json', | |
data={'status':text}).json() | |
# get user profile | |
verify = sess.get('account/verify_credentials.json', | |
params={'format':'json'}).json() | |
session['username'] = verify['screen_name'] | |
session['twitter_id'] = verify['id'] | |
session['name'] = verify['name'] | |
#flash('Logged in as ' + verify['name']) | |
return redirect(url_for('index')) | |
@app.route('/logout') | |
def logout(): | |
""" | |
Logout | |
""" | |
# Delete session data | |
session.pop('username', None) | |
session.pop('twitter_id', None) | |
session.pop('name', None) | |
return redirect(url_for('index')) | |
if __name__ == '__main__': | |
app.run(debug=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment