from flask import Flask, request, jsonify, render_template_string 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__) SPREADSHEET_ID = '1rcIJflbC1VIc70F6dnASLFvGQ90TXHhCx0iyxsXR7Ww' FOLDER_ID = '1brmLNqOMCvRS0TDY6ECHvIBmlRx8pcPz' # OAuth 2.0 credentials CREDENTIALS = { 'token': None, 'refresh_token': None, 'token_uri': 'https://oauth2.googleapis.com/token', 'client_id': os.environ.get('GOOGLE_CLIENT_ID'), 'client_secret': os.environ.get('GOOGLE_CLIENT_SECRET'), 'scopes': ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive.file'] } HTML_TEMPLATE = ''' Purchase Record Form

購買記錄表單 Purchase Record Form

''' # Single route definition for index @app.route('/') def index(): return render_template_string(HTML_TEMPLATE) @app.route('/submit', methods=['POST']) def submit(): try: name = request.form['name'] student_id = request.form['studentId'] product = request.form['product'] cost = request.form['cost'] file = request.files['receipt'] credentials = Credentials.from_authorized_user_info(CREDENTIALS) # Upload file to Drive drive_service = build('drive', 'v3', credentials=credentials) file_metadata = { 'name': f"{student_id}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}_{file.filename}", 'parents': [FOLDER_ID] } media = MediaIoBaseUpload( io.BytesIO(file.read()), mimetype=file.content_type, resumable=True ) uploaded_file = drive_service.files().create( body=file_metadata, media_body=media, fields='id,webViewLink' ).execute() file_url = uploaded_file.get('webViewLink', '') # Update Google Sheet sheets_service = build('sheets', 'v4', credentials=credentials) timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') ip_address = request.remote_addr values = [[name, student_id, product, cost, file_url, timestamp, ip_address]] body = {'values': values} sheets_service.spreadsheets().values().append( spreadsheetId=SPREADSHEET_ID, range='Sheet1!A:G', valueInputOption='USER_ENTERED', body=body ).execute() return jsonify({'success': True, 'message': 'Data submitted successfully!'}) except Exception as e: return jsonify({'success': False, 'message': f'Error: {str(e)}'}) if __name__ == '__main__': app.run(host='0.0.0.0', port=7860)