Skip to content

Commit a20a708

Browse files
committed
Rewrite to Flask, add pyproject.toml entrypoint for Vercel
1 parent e351124 commit a20a708

3 files changed

Lines changed: 55 additions & 74 deletions

File tree

api/wx.py

Lines changed: 52 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import os, hashlib, time, base64, requests
22
import xml.etree.ElementTree as ET
3-
from urllib.parse import parse_qs, urlparse
4-
from http.server import BaseHTTPRequestHandler
3+
from flask import Flask, request, Response
54

6-
TOKEN = os.environ.get('WX_TOKEN', '')
7-
APPID = os.environ.get('WX_APPID', '')
8-
SECRET = os.environ.get('WX_APPSECRET', '')
5+
app = Flask(__name__)
6+
7+
TOKEN = os.environ.get('WX_TOKEN', '')
8+
APPID = os.environ.get('WX_APPID', '')
9+
SECRET = os.environ.get('WX_APPSECRET', '')
910
IMGBB_KEY = os.environ.get('IMGBB_API_KEY', '')
1011

1112
def check_sig(sig, ts, nonce):
@@ -49,75 +50,52 @@ def xml_reply(to, frm, content):
4950
<Content><![CDATA[{content}]]></Content>
5051
</xml>'''
5152

52-
class handler(BaseHTTPRequestHandler):
53-
54-
def do_GET(self):
55-
qs = parse_qs(urlparse(self.path).query)
56-
sig = qs.get('signature', [''])[0]
57-
ts = qs.get('timestamp', [''])[0]
58-
nonce = qs.get('nonce', [''])[0]
59-
echo = qs.get('echostr', [''])[0]
60-
61-
if check_sig(sig, ts, nonce):
62-
self.send_response(200)
63-
self.end_headers()
64-
self.wfile.write(echo.encode())
65-
else:
66-
self.send_response(403)
67-
self.end_headers()
68-
69-
def do_POST(self):
70-
length = int(self.headers.get('Content-Length', 0))
71-
body = self.rfile.read(length)
72-
try:
73-
root = ET.fromstring(body)
74-
to = root.findtext('ToUserName')
75-
frm = root.findtext('FromUserName')
76-
mtype = root.findtext('MsgType')
77-
78-
if mtype == 'image':
79-
media_id = root.findtext('MediaId')
80-
token = get_access_token()
81-
img_data = download_media(token, media_id)
82-
83-
if img_data:
84-
url = upload_to_imgbb(img_data)
85-
if url:
86-
content = (
87-
f'表情处理完成:🔗 点击下载\n{url}\n\n'
88-
'保存出现问题?回复「帮助」获取教程'
89-
)
90-
else:
91-
content = '图片上传失败,请稍后重试'
92-
else:
93-
content = '图片获取失败,请稍后重试'
94-
95-
elif mtype == 'text':
96-
text = root.findtext('Content', '').strip()
97-
if '帮助' in text or 'help' in text.lower():
98-
content = (
99-
'📖 使用教程\n\n'
100-
'1. 直接发送图片或表情给我\n'
101-
'2. 我会返回一个下载链接\n'
102-
'3. 点击链接,长按图片保存即可\n\n'
103-
'支持:普通图片、表情包、截图等'
104-
)
105-
else:
106-
content = '发送图片给我,我来帮你生成下载链接 😊'
107-
53+
@app.route('/api/wx', methods=['GET'])
54+
def wx_verify():
55+
sig = request.args.get('signature', '')
56+
ts = request.args.get('timestamp', '')
57+
nonce = request.args.get('nonce', '')
58+
echo = request.args.get('echostr', '')
59+
if check_sig(sig, ts, nonce):
60+
return echo
61+
return 'Forbidden', 403
62+
63+
@app.route('/api/wx', methods=['POST'])
64+
def wx_message():
65+
try:
66+
root = ET.fromstring(request.data)
67+
to = root.findtext('ToUserName')
68+
frm = root.findtext('FromUserName')
69+
mtype = root.findtext('MsgType')
70+
71+
if mtype == 'image':
72+
media_id = root.findtext('MediaId')
73+
token = get_access_token()
74+
img_data = download_media(token, media_id)
75+
if img_data:
76+
url = upload_to_imgbb(img_data)
77+
content = (
78+
f'表情处理完成:🔗 点击下载\n{url}\n\n保存出现问题?回复「帮助」获取教程'
79+
if url else '图片上传失败,请稍后重试'
80+
)
81+
else:
82+
content = '图片获取失败,请稍后重试'
83+
84+
elif mtype == 'text':
85+
text = root.findtext('Content', '').strip()
86+
if '帮助' in text or 'help' in text.lower():
87+
content = (
88+
'📖 使用教程\n\n'
89+
'1. 直接发送图片或表情给我\n'
90+
'2. 我会返回一个下载链接\n'
91+
'3. 点击链接,长按图片保存即可\n\n'
92+
'支持:普通图片、表情包、截图等'
93+
)
10894
else:
10995
content = '发送图片给我,我来帮你生成下载链接 😊'
96+
else:
97+
content = '发送图片给我,我来帮你生成下载链接 😊'
11098

111-
reply = xml_reply(frm, to, content)
112-
self.send_response(200)
113-
self.send_header('Content-Type', 'text/xml; charset=utf-8')
114-
self.end_headers()
115-
self.wfile.write(reply.encode('utf-8'))
116-
117-
except Exception:
118-
self.send_response(200)
119-
self.end_headers()
120-
self.wfile.write(b'success')
121-
122-
def log_message(self, *args):
123-
pass
99+
return Response(xml_reply(frm, to, content), mimetype='text/xml')
100+
except Exception:
101+
return 'success', 200

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[tool.vercel]
2+
entrypoint = "api/wx:app"

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
requests==2.31.0
2+
flask==3.0.3

0 commit comments

Comments
 (0)