from flask import Flask, request, jsonify, render_template_string, redirect, session from google_auth_oauthlib.flow import Flow from google.oauth2.credentials import Credentials from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseUpload import os import io import datetime app = Flask(__name__) app.secret_key = os.environ.get('FLASK_SECRET_KEY') SCOPES = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive.file'] SPREADSHEET_ID = '1rcIJflbC1VIc70F6dnASLFvGQ90TXHhCx0iyxsXR7Ww' FOLDER_ID = '1brmLNqOMCvRS0TDY6ECHvIBmlRx8pcPz' # OAuth configuration client_config = { "web": { "client_id": os.environ.get('GOOGLE_CLIENT_ID'), "client_secret": os.environ.get('GOOGLE_CLIENT_SECRET'), "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "redirect_uris": ["https://euler314-purchase-record.hf.space/oauth2callback"] } } def credentials_to_dict(credentials): return { '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 } def get_credentials(): if 'credentials' not in session: return None return Credentials(**session['credentials']) @app.route('/authorize') def authorize(): flow = Flow.from_client_config( client_config, scopes=SCOPES, redirect_uri=client_config['web']['redirect_uris'][0] ) authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true' ) session['state'] = state return redirect(authorization_url) @app.route('/oauth2callback') def oauth2callback(): state = session['state'] flow = Flow.from_client_config( client_config, scopes=SCOPES, state=state, redirect_uri=client_config['web']['redirect_uris'][0] ) authorization_response = request.url flow.fetch_token(authorization_response=authorization_response) credentials = flow.credentials session['credentials'] = credentials_to_dict(credentials) return redirect('/') @app.route('/') def index(): if not get_credentials(): return redirect('/authorize') return render_template_string(HTML_TEMPLATE) HTML_TEMPLATE = '''