|
1 | 1 | import os, hashlib, time, base64, requests |
2 | 2 | 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 |
5 | 4 |
|
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', '') |
9 | 10 | IMGBB_KEY = os.environ.get('IMGBB_API_KEY', '') |
10 | 11 |
|
11 | 12 | def check_sig(sig, ts, nonce): |
@@ -49,75 +50,52 @@ def xml_reply(to, frm, content): |
49 | 50 | <Content><![CDATA[{content}]]></Content> |
50 | 51 | </xml>''' |
51 | 52 |
|
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 | + ) |
108 | 94 | else: |
109 | 95 | content = '发送图片给我,我来帮你生成下载链接 😊' |
| 96 | + else: |
| 97 | + content = '发送图片给我,我来帮你生成下载链接 😊' |
110 | 98 |
|
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 |
0 commit comments