Skip to content

Commit e45c67d

Browse files
authored
docker微信推送增加更多消息模式,分摊额度
1 parent 90021a8 commit e45c67d

File tree

6 files changed

+100
-26
lines changed

6 files changed

+100
-26
lines changed

DOCKER.md

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,10 +294,13 @@ services:
294294
}
295295
```
296296
2. 在【接口配置信息】中填入`URL`和第 1 步的`token`![image](https://user-images.githubusercontent.com/91232777/139572541-42184b52-350c-4c49-b646-d763f16b715f.png)
297+
297298
_图中 url 仅为参考,请以文档为准_
299+
298300
URL:`http://你的域名或IP地址:端口号/wechat`
299301
【端口号】是你从 docker 中映射出来的本地端口号,记得在路由器或防火墙中开启端口转发。访问链大概为:`微信--端口A-->路由--端口B-->docker--端口8088-->程序`
300302
这里要填写的就是`端口A`
303+
301304
3. 点【提交】,如果提示`token验证失败`,要么端口不通,要么 docker 没启动监听,就不用往下看了。
302305

303306
#### 微信的使用
@@ -319,14 +322,50 @@ services:
319322

320323
`我的-今日积分` 获取今天学习积分。
321324

322-
其他账号绑定
325+
### 其他账号绑定
323326

324327
1.`用户A`先关注你的公众号。然后点击`账号编码`,并将编码给你。
325328
2. 给你的公众号发送`/add`指令,让`用户A`登录。你可以获得 ta 的数字 ID
326329
3. 给你的公众号发送`/bind 用户A的账号编码 用户A的数字ID`绑定成功后,`用户A`就可以自己学习和查分了。
327330

328331
`\unbind 微信编码` 解绑指定用户。
329332

333+
### 微信模板的使用
334+
335+
由于测试号的额度都有限制,所以将部分信息换方式发送,以降低某个额度用尽
336+
337+
1. 在【模板消息接口】中添加两个模板。
338+
![image](https://user-images.githubusercontent.com/91232777/139628474-0fef3561-dc98-4fbd-b80e-7462bdf9cc6a.png)
339+
340+
标题和内容任意,但是要保留`{{XXXX.DATA}}`
341+
342+
登录模板
343+
344+
`{{name.DATA}} 需要登录, 如果页面不显示,请点击右上角,使用系统默认浏览器打开 `
345+
346+
今日得分模板
347+
348+
`{{score.DATA}}`
349+
350+
2.`模板ID`复制,并添加到配置文件中
351+
352+
```
353+
addition {
354+
wechat{
355+
appid = "第2步中获取的appid"
356+
appsecret = "第2步中获取的appsecret"
357+
openid = "第4步中获取的微信号"
358+
token = "随机字符串"
359+
login_tempid = "登录模板ID"
360+
score_tempid = "得分模板ID"
361+
}
362+
}
363+
```
364+
365+
**注意:** 复制 ID 的时候记得删除前后端的空格!!!删除空格!!!
366+
367+
登录模板配合`Scheme`环境变量 _移动端__Windows11_ 可以直接拉起强国 APP。
368+
330369
## Server 酱
331370

332371
接入参考 https://sct.ftqq.com/

SourcePackages/config/default_template.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ addition {
100100
appsecret = ""
101101
openid = ""
102102
token = "" #互动操作需要,6~16位任意半角字符
103+
login_tempid = "" #登录模板ID
104+
score_tempid = "" #分数模板ID
103105
}
104106
}
105107

SourcePackages/pdlearn/version_info.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
{
2-
"techxuexi_version": "v20211031",
2+
"techxuexi_version": "v20211101",
33
"techxuexi_update_log": [{
4+
"version": "v20211101",
5+
"info": "docker: 1. 部分功能采用及时回复; 2. 微信模板发送; 3. 增加微信模板配置项,增加说明文档 "
6+
},{
47
"version": "v20211031",
58
"info": "docker: 1.增加微信互动功能; 2.微信token改为文件存储,方便主线程和守护线程共享; 3.修改bot消息发送,可以发送给指定用户; 4.增加文档说明; 5.增加默认配置文件的配置项; 6.微信暂时使用nohup启动,方便查阅日志,稳定后改为supervisord; 7.修复文档,get_score异常处理; 8.access_token过期后强制刷新; "
69
},{

SourcePackages/pdlearn/wechat.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from pickle import STRING
12
import requests
23
import json
34
from pdlearn.config import cfg_get
@@ -38,9 +39,17 @@ def get_access_token(self, refresh=False):
3839
file.save_json_data("user/wechat_token.json", self.token)
3940
return self.token
4041

41-
def send_text(self, text, uid=""):
42+
def send_text(self, text: STRING, uid=""):
4243
if not uid:
4344
uid = self.openid
45+
if text.startswith("http") or text.startswith("dtxuexi"):
46+
login_tempid = cfg_get("addition.wechat.login_tempid", "")
47+
if login_tempid:
48+
return self.send_template(login_tempid, {"name": {"value": "用户"}}, uid, text)
49+
if "当前学 xi 总积分" in text:
50+
login_tempid = cfg_get("addition.wechat.score_tempid", "")
51+
if login_tempid:
52+
return self.send_template(login_tempid, {"score": {"value": text}}, uid, "")
4453
token = self.get_access_token()
4554
url_msg = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?'
4655
body = {
@@ -58,6 +67,23 @@ def send_text(self, text, uid=""):
5867
self.get_access_token(True)
5968
self.send_text(text, uid)
6069

70+
def send_template(self, id, temp_data, uid, url):
71+
post_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?"
72+
token = self.get_access_token()
73+
body = {
74+
"touser": uid,
75+
"url": url,
76+
"template_id": id,
77+
"data": temp_data
78+
}
79+
res = requests.post(url=post_url, params={
80+
'access_token': token
81+
}, data=json.dumps(body, ensure_ascii=False).encode('utf-8')).json()
82+
print(res)
83+
if res["errcode"] == 40001:
84+
self.get_access_token(True)
85+
self.send_template(id, temp_data, uid, url)
86+
6187
def get_opendid_by_uid(self, uid):
6288
"""
6389
账号换绑定的openid,没有则返回主账号

SourcePackages/wechatListener.py

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from hashlib import sha1
22
import os
3+
import time
34
from flask import Flask, request
45
import requests
56
import json
@@ -48,6 +49,9 @@ def __init__(self, root):
4849
elif child.tag == 'EventKey':
4950
self.event_key = child.text
5051

52+
def returnXml(self, msg, msg_type="text"):
53+
return f"<xml><ToUserName><![CDATA[{self.from_user_name}]]></ToUserName><FromUserName><![CDATA[{self.to_user_name}]]></FromUserName><CreateTime>{time.time()}</CreateTime><MsgType><![CDATA[{msg_type}]]></MsgType><Content><![CDATA[{msg}]]></Content></xml>"
54+
5155

5256
def get_update(timestamp, nonce):
5357
arguments = ''
@@ -75,7 +79,7 @@ def parse_xml(data):
7579
return MessageInfo(root)
7680

7781

78-
def wechat_init():
82+
def wechat_init(msg: MessageInfo):
7983
"""
8084
初始化订阅号菜单
8185
"""
@@ -109,9 +113,9 @@ def wechat_init():
109113
'access_token': wechat.get_access_token()
110114
}, data=json.dumps(body, ensure_ascii=False).encode('utf-8')).json()
111115
if res.get("errcode") == 0:
112-
wechat.send_text("菜单初始化成功,请重新关注订阅号")
116+
return msg.returnXml("菜单初始化成功,请重新关注订阅号")
113117
else:
114-
wechat.send_text(res.get("errmsg"))
118+
return msg.returnXml(res.get("errmsg"))
115119

116120

117121
def get_uid(oid):
@@ -129,7 +133,7 @@ def wechat_get_openid(msg: MessageInfo):
129133
"""
130134
获取用户的openId
131135
"""
132-
wechat.send_text(msg.from_user_name, msg.from_user_name)
136+
return msg.returnXml(msg.from_user_name)
133137

134138

135139
def wechat_learn(msg: MessageInfo):
@@ -138,7 +142,7 @@ def wechat_learn(msg: MessageInfo):
138142
"""
139143
uid = get_uid(msg.from_user_name)
140144
if not uid:
141-
wechat.send_text("您未绑定账号,请联系管理员绑定", uid=msg.from_user_name)
145+
msg: MessageInfo("您未绑定账号,请联系管理员绑定")
142146
else:
143147
pdl.start(uid)
144148

@@ -157,11 +161,11 @@ def wechat_get_score(msg: MessageInfo):
157161
pdl.add_user(msg.from_user_name)
158162

159163

160-
def wechat_help():
164+
def wechat_help(msg: MessageInfo):
161165
"""
162166
获取帮助菜单
163167
"""
164-
wechat.send_text(
168+
return msg.returnXml(
165169
"/help 显示帮助消息\n/init 初始化订阅号菜单,仅需要执行一次\n/add 添加新账号\n/bind 绑定账号,如:/bind 账号编码 学xi编号\n/unbind 解除绑定 如:/unbind 账号编码")
166170

167171

@@ -188,9 +192,9 @@ def wechat_bind(msg: MessageInfo):
188192
else:
189193
json_obj.append({"openId": args[1], "accountId": args[2]})
190194
file.save_json_data("user/wechat_bind.json", json_obj)
191-
wechat.send_text("绑定成功")
195+
return msg.returnXml("绑定成功")
192196
else:
193-
wechat.send_text("参数格式错误")
197+
return msg.returnXml("参数格式错误")
194198

195199

196200
def wechat_unbind(msg: MessageInfo):
@@ -207,14 +211,14 @@ def wechat_unbind(msg: MessageInfo):
207211
index = json_obj.index(wx_list[0])
208212
json_obj.pop(index)
209213
file.save_json_data("user/wechat_bind.json", json_obj)
210-
wechat.send_text("解绑成功")
214+
return msg.returnXml("解绑成功")
211215
else:
212-
wechat.send_text("账号编码错误或该编码未绑定账号")
216+
return msg.returnXml("账号编码错误或该编码未绑定账号")
213217
else:
214-
wechat.send_text("参数格式错误")
218+
return msg.returnXml("参数格式错误")
215219

216220

217-
@ app.route('/wechat', methods=['GET', 'POST'])
221+
@app.route('/wechat', methods=['GET', 'POST'])
218222
def weixinInterface():
219223
if check_signature:
220224
if request.method == 'GET':
@@ -225,20 +229,20 @@ def weixinInterface():
225229
msg = parse_xml(data)
226230
if msg.msg_type == "event" and msg.event == "CLICK":
227231
if msg.event_key == "MENU_OPENID":
228-
MyThread("get_user_openid", wechat_get_openid, msg).start()
232+
return wechat_get_openid(msg)
229233
if msg.event_key == "MENU_LEARN":
230234
MyThread("wechat_learn", wechat_learn, msg).start()
231235
if msg.event_key == "MENU_SCORE":
232236
MyThread("wechat_get_score", wechat_get_score, msg).start()
233237
if msg.from_user_name == openid:
234238
if msg.content.startswith("/init"):
235-
MyThread("wechat_init", wechat_init).start()
239+
return wechat_init(msg)
236240
if msg.content.startswith("/help"):
237-
MyThread("wechat_help", wechat_help).start()
241+
return wechat_help(msg)
238242
if msg.content.startswith("/bind"):
239-
MyThread("wechat_bind", wechat_bind, msg).start()
243+
return wechat_bind(msg)
240244
if msg.content.startswith("/unbind"):
241-
MyThread("wechat_unbind", wechat_unbind, msg).start()
245+
return wechat_unbind(msg)
242246
if msg.content.startswith("/add"):
243247
MyThread("wechat_add", wechat_add).start()
244248
return "success"

run.sh

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/sh
2-
echo "检查更新"
3-
git -C /xuexi/code/TechXueXi pull $Sourcepath $pullbranche
4-
echo "检查更新完毕"
5-
cp -r /xuexi/code/TechXueXi/SourcePackages/* /xuexi
2+
#echo "检查更新"
3+
#git -C /xuexi/code/TechXueXi pull $Sourcepath $pullbranche
4+
#echo "检查更新完毕"
5+
#cp -r /xuexi/code/TechXueXi/SourcePackages/* /xuexi
66
echo "开始运行"
7-
/usr/local/bin/python /xuexi/pandalearning.py
7+
/usr/local/bin/python /xuexi/pandalearning.py

0 commit comments

Comments
 (0)