Created
February 14, 2018 09:16
-
-
Save jsbain/43c22bb7be38120be2c7c61781a05352 to your computer and use it in GitHub Desktop.
quickstart_web.py
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
# -*- coding: utf-8 -*- | |
import os | |
import json | |
import flask | |
import google.oauth2.credentials | |
import google_auth_oauthlib.flow | |
import googleapiclient.discovery | |
# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains | |
# the OAuth 2.0 information for this application, including its client_id and | |
# client_secret. | |
CLIENT_SECRETS_FILE = "client_secret.json" | |
# This OAuth 2.0 access scope allows for full read/write access to the | |
# authenticated user's account and requires requests to use an SSL connection. | |
SCOPES = ['https://www.googleapis.com/auth/youtube'] | |
API_SERVICE_NAME = 'youtube' | |
API_VERSION = 'v3' | |
app = flask.Flask(__name__) | |
# Note: A secret key is included in the sample so that it works, but if you | |
# use this code in your application please replace this with a truly secret | |
# key. See http://flask.pocoo.org/docs/0.12/quickstart/#sessions. | |
app.secret_key = 'REPLACE ME - this value is here as a placeholder.' | |
@app.route('/') | |
def index(): | |
print('index') | |
if 'credentials' not in flask.session: | |
return flask.redirect('authorize') | |
# Load the credentials from the session. | |
credentials = google.oauth2.credentials.Credentials( | |
**flask.session['credentials']) | |
print(credentials) | |
print(dir(credentials)) | |
print(vars(credentials)) | |
return 'Auth successful. see creds.json' | |
#vars(flask.session['credentials']) | |
@app.route('/authorize') | |
def authorize(): | |
print('auth') | |
# Create a flow instance to manage the OAuth 2.0 Authorization Grant Flow | |
# steps. | |
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( | |
CLIENT_SECRETS_FILE, scopes=SCOPES) | |
flow.redirect_uri = flask.url_for('oauth2callback', _external=True) | |
authorization_url, state = flow.authorization_url( | |
# This parameter enables offline access which gives your application | |
# both an access and refresh token. | |
access_type='offline', | |
# This parameter enables incremental auth. | |
include_granted_scopes='true') | |
print(authorization_url,state) | |
# Store the state in the session so that the callback can verify that | |
# the authorization server response. | |
flask.session['state'] = state | |
return flask.redirect(authorization_url) | |
@app.route('/oauth2callback') | |
def oauth2callback(): | |
# Specify the state when creating the flow in the callback so that it can | |
# verify the authorization server response. | |
state = flask.session['state'] | |
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( | |
CLIENT_SECRETS_FILE, scopes=SCOPES, state=state) | |
flow.redirect_uri = flask.url_for('oauth2callback', _external=True) | |
# Use the authorization server's response to fetch the OAuth 2.0 tokens. | |
authorization_response = flask.request.url | |
flow.fetch_token(authorization_response=authorization_response) | |
# Store the credentials in the session. | |
# ACTION ITEM for developers: | |
# Store user's access and refresh tokens in your data store if | |
# incorporating this code into your real app. | |
credentials = flow.credentials | |
flask.session['credentials'] = { | |
'token': credentials.token, | |
'refresh_token': credentials.refresh_token, | |
'token_uri': credentials.token_uri, | |
'client_id': credentials.client_id, | |
'client_secret': credentials.client_secret, | |
'scopes': credentials.scopes | |
} | |
with open('creds.json','w') as f: | |
json.dump(flask.session['credentials'],f) | |
print(credentials) | |
return flask.redirect(flask.url_for('index')) | |
def channels_list_by_username(client, **kwargs): | |
response = client.channels().list( | |
**kwargs | |
).execute() | |
return flask.jsonify(**response) | |
from objc_util import * | |
import ui | |
import time | |
def webview_with_useragent(agentstring=None, *args, **kwargs): | |
d=ObjCClass('NSUserDefaults').standardUserDefaults() | |
old=d.volatileDomainForName_('NSRegistrationDomain') | |
if agentstring: | |
d.registerDefaults_({'UserAgent':agentstring}) | |
w= ui.WebView(*args,**kwargs) | |
w.load_url('http://') # webview needs to be initialized | |
time.sleep(1) # there maybe a more robust way... wait before setting old default | |
d.setVolatileDomain_forName_(old,'NSRegistrationDomain') | |
return w | |
def reload(sender): | |
w.reload() | |
pass | |
if __name__ == '__main__': | |
# When running locally, disable OAuthlib's HTTPs verification. When | |
# running in production *do not* leave this option enabled. | |
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' | |
w=webview_with_useragent('JonTestApp') | |
w.right_button_items=[ui.ButtonItem('Test')] | |
w.right_button_items[0].action=reload | |
def launch(): | |
print('launching webview') | |
w.frame=(0,0,576,576) | |
w.load_url('http://localhost:8090/') | |
w.present('sheet') | |
ui.delay(launch,2.0) | |
app.logger.level = 10 | |
app.run(None,8090,use_reloader=False, debug=True) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment