site-socialmedia-progress-bars/app.py

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)