-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvercel_flask-plugin-spreeadsheet_sql.py
77 lines (61 loc) · 2.41 KB
/
vercel_flask-plugin-spreeadsheet_sql.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
"""
Author : ChungYi Fu (Kaohsiung, Taiwan) 2024/11/11 22:00
https://www.facebook.com/francefu
設定requirements.txt
Flask==3.0.3
"""
# 匯入 Flask 模組及其函數,用於建立 Web 應用程式和處理 JSON 請求
from flask import Flask, jsonify, request
# 匯入 urllib 模組中的 urlopen 和 Request,用於發送 HTTP 請求
from urllib.request import urlopen, Request
# 匯入 urllib 模組中的 urlencode,用於編碼 URL 查詢參數
from urllib.parse import urlencode
# 匯入 JSON 模組,用於處理 JSON 資料
import json
# 建立 Flask 應用程式實例
app = Flask(__name__)
# 設定專案標題
app.config['Project_title'] = '聯發科造課師(法蘭斯)的SQL查詢'
app.config['sheetID'] = '1PfmtHNPQvamES8uZwxCbn1A14C5_KWhbj-k02uVXYGM'
app.config['sheetName'] = '花園'
# 定義一個路由,當接收到 POST 請求時觸發此函數
@app.route('/', methods=['POST'])
def home():
try:
# 設定初始值
sql = ''
# 從 POST 請求中取得 JSON 格式參數資料
jsonData = request.get_json()
if jsonData is not None:
sql = str(jsonData.get('sql', ''))
# 檢查 sql 是否有效
if sql == '':
raise ValueError("SQL is missing or invalid")
# 對 SQL 查詢進行 URL 編碼
urlencode_sql = urlencode({'tq': sql})
urlencode_sheetName = urlencode({'sheet': app.config['sheetName']})
# 發送 HTTP 請求以取得Google試算表SQL查詢資料
url = f"https://docs.google.com/spreadsheets/d/{app.config['sheetID']}/gviz/tq?tqx=out:json&{urlencode_sheetName}&{urlencode_sql}"
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
with urlopen(req) as response:
remoteData = response.read().decode('utf-8')
# 構建回應資料並返回
response_data = {
"data": remoteData
}
return jsonify(response_data), 200
except Exception as e:
# 構建執行錯誤資訊並返回
response_data = {
"data": f"An error occurred: {e}"
}
return jsonify(response_data), 500
# 定義一個路由 /ablout觸發此函數
@app.route('/about')
def about():
return app.config['Project_title']
'''
# Vercel環境下不用加入以下程式碼
if __name__ == '__main__':
app.run(debug=True)
'''