93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- encoding: utf-8 -*-
|
|
|
|
import configparser
|
|
from pathlib import Path
|
|
|
|
import requests
|
|
from flask import Flask, redirect
|
|
from flask_restful import Api, Resource, reqparse
|
|
from requests_oauthlib.oauth1_auth import Client
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
from flask_migrate import Migrate
|
|
|
|
keys = configparser.ConfigParser()
|
|
keys.read(Path('keys.ini'))
|
|
|
|
|
|
class TwitterAuthenticate(Resource):
|
|
def get(self):
|
|
uri, headers, body = oauth.sign(
|
|
'https://twitter.com/oauth/request_token')
|
|
res = requests.get(uri, headers=headers, data=body)
|
|
# Splitting between the two params sent back
|
|
res_split = res.text.split('&')
|
|
# Pulling our APPS OAuth token from the response.
|
|
oauth_token = res_split[0].split('=')[1]
|
|
return redirect('https://api.twitter.com/oauth/authenticate?oauth_token=' + oauth_token, 302)
|
|
|
|
|
|
def callback_parser():
|
|
parser = reqparse.RequestParser()
|
|
parser.add_argument('oauth_token')
|
|
parser.add_argument('oauth_verifier')
|
|
return parser
|
|
|
|
|
|
class TwitterCallback(Resource):
|
|
def get(self):
|
|
parser = callback_parser()
|
|
args = parser.parse_args() # Parse our args into a dict
|
|
res = requests.post('https://api.twitter.com/oauth/access_token?oauth_token=' +
|
|
args['oauth_token'] + '&oauth_verifier=' + args['oauth_verifier'])
|
|
res_split = res.text.split('&')
|
|
oauth_token = res_split[0].split('=')[1]
|
|
oauth_secret = res_split[1].split('=')[1]
|
|
userid = res_split[2].split('=')[1]
|
|
username = res_split[3].split('=')[1]
|
|
# ... Do Code Here
|
|
existing_user = TwitterOAuth.query.filter_by(user_id=userid).first()
|
|
if existing_user is None:
|
|
db.session.add(TwitterOAuth(
|
|
user_id=userid,
|
|
user_name=username,
|
|
oauth_token=oauth_token,
|
|
oauth_secret=oauth_secret,
|
|
))
|
|
else:
|
|
existing_user.user_name = username
|
|
existing_user.oauth_token = oauth_token
|
|
existing_user.oauth_secret = oauth_secret
|
|
db.session.commit()
|
|
return redirect('/', 302)
|
|
|
|
|
|
config = {
|
|
'twitter_consumer_key': keys['twitter']['api_key_public'],
|
|
'twitter_consumer_secret': keys['twitter']['api_key_secret'],
|
|
}
|
|
app = Flask(__name__)
|
|
application = app
|
|
api = Api(app)
|
|
oauth = Client(
|
|
client_key=config['twitter_consumer_key'],
|
|
client_secret=config['twitter_consumer_secret'],
|
|
)
|
|
api.add_resource(TwitterAuthenticate, '/authenticate/twitter')
|
|
api.add_resource(TwitterCallback, '/callback/twitter')
|
|
|
|
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///db.sqlite"
|
|
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
|
|
db = SQLAlchemy(app)
|
|
|
|
|
|
class TwitterOAuth(db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
user_id = db.Column(db.String, unique=True, nullable=False)
|
|
user_name = db.Column(db.String, unique=False, nullable=False)
|
|
oauth_token = db.Column(db.String, unique=False, nullable=False)
|
|
oauth_secret = db.Column(db.String, unique=False, nullable=False)
|
|
|
|
|
|
migrate = Migrate(app, db)
|