#!/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)