提醒报备小助手:关于做了一个微信群机器人这件事

文中内容过于老旧,目前已不再适用[2023.02.26]

提醒报备小助手:关于做了一个微信群机器人这件事

废话

张XX,你XXX

因为期末甫毕,鄙人无心上工,做作业也踟蹰难进,索性研究了如何做wechat的群聊bot来自动化通知报备。个人认为,相比微信群通知,有更好的解决方案,诸如:

  • 公众号自动提醒报备/网页登陆报备
  • 使用更好的软件,内地则企业微信、qq,长城以外则TG、Discord之类

但懂得都懂,基层组织建设,生产水平还有待提高。既然是基层工作,那还是得配合大家的使用习惯,还是得用微信来通知。

可恨的是微信还换了API还搞反bot设计,老的库比如itchat和wxpy是肯定用不了了,打补丁也不是一个好的选择。wechaty虽然可以linux部署但200元一个月让非企业用户难以承担。综上所述,我最后选择了近期新出现的wxauto来提供Python API。虽然不保证长期维护,但能稳定用到开学对我来说就足够了。

顺便一提,TG的bot大概30 min就能入门,相比之下wechat,我只能说不愧是你。

安全,安全,还是你要的安全!(笑)

方案

  • 做一个小号来当Bot
    • P.S. 现在手机退出微信电脑也会自动退出。微信,不愧是你。
    • P.P.S. 所以现在手机都给微信专门准备了双开克隆功能。微信,不愧是你。
  • 用wxauto定期爬群聊内容,根据内容对发送者进行分类
    • 这一步不严格,没有对发送者发送垃圾消息和表情包进行过滤
    • 考虑到是没有人水群的通知群,也无所谓了
  • 用wxauto监视聊天中有没有出现命令指令,如果出现了,就立刻执行相关指令
  • 定时发送报备提示和群内未签到人员名单
    • 可以做@功能,但必须一一@(而且不知道为什么末尾必须加“\r”,虽然不输入但会影响是否能实际让@起效),对一个群来说每个人单独发一条消息@有些难以忍受
    • 可以做聊天功能,但没必要。没人会寂寞到和BOT聊天吧,不会吧不会吧

实现

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from wxauto import *
import schedule
import time
import os

os.environ["http_proxy"] = "http://127.0.0.1:7890"
os.environ["https_proxy"] = "http://127.0.0.1:7890"

# Init
# 获取当前微信客户端
wx = WeChat()

# 获取会话列表
wx.GetSessionList()

# Def
name_list = [

]

msg_auto = "------" + """大家好,我是本群的“提醒报备小助手”。您今天报备了吗?您汇报异动情况了吗?小助手提醒您:实验千万条,报备第一条;出门不报备,禁闭两行泪。""" + "------"

msg_functions = "目前实现的功能:自动化定时发放通知;自动化提醒未报备人员(需要完善);功能查询;"

self_intro = "0w0蔻你吉瓦~这是一个自用报备提醒Bot,每天提醒四次报备及出入京情况确认,随开发者的心情迭代,并且可能会随着某一次的更新去世qaq"

msg_end = "##########"

# 建立统计函数
def Count_call():
name_unsign = name_list
mem_stat = {}
wx.LoadMoreMessage()

msgs = wx.GetAllMessage
msgs = msgs[::-1]
for msg in msgs:
print(msg)
if msg[0] == "DFMaster" and msg[1] == "$$$Start Here$$$":
break
elif msg[0] == """SYS""" or msg[0] == """DFMaster""" or msg[
0] == """江意达""":
continue
else:

try:
name_unsign.remove(msg[0])
except:
print("Name not find:" + msg[0])
else:
try:
mem_stat[msg[1]] = mem_stat[msg[1]] + "," + msg[0]
print(mem_stat)
except:
mem_stat[msg[1]] = msg[0]
print(mem_stat)
msg_sign_situation = ""
for type in mem_stat:
msg_sign_situation += str(type) + ": " + str(mem_stat[type]) + ";;;"
print(str(type) + ": " + str(mem_stat[type]))
print(msg_sign_situation)
print(name_list)
wx.SendMsg(msg_sign_situation)
wx.SendMsg("未报备人员:" + " ".join(name_unsign))

def Sign_Helper():

# 向某人发送消息
who = '【通知】第二小组'

wx.ChatWith(who)
wx.SendMsg(msg_auto)
Count_call()

def Start_Count():
msg_block = "$$$Start Here$$$"
wx.SendMsg(msg_auto)
wx.SendMsg(msg_block)

def Listen_Order():
msgs = wx.GetAllMessage

for msg in msgs[::-1]:
if msg[1] == msg_end:
break
elif msg[1] == "ID":
wx.SendMsg(" ".join(name_list))
wx.SendMsg(msg_end)
elif msg[1] == "功能":
wx.SendMsg(msg_functions)
wx.SendMsg(msg_end)
elif msg[1] == "介绍":
wx.SendMsg(self_intro)
wx.SendMsg(msg_end)
elif msg[1] == "提醒":
Count_call()
wx.SendMsg(msg_end)
else:
continue

if __name__ == '__main__':
# 获取当前微信客户端
wx = WeChat()

# 获取会话列表
wx.GetSessionList()

Count_call()
schedule.every().day.at("00:00").do(Start_Count)

schedule.every().day.at("09:30").do(Sign_Helper)
schedule.every().day.at("12:00").do(Sign_Helper)
schedule.every().day.at("16:50").do(Sign_Helper)
schedule.every(1).minutes.do(Listen_Order)

while True:
schedule.run_pending() # 运行所有可以运行的任务
time.sleep(1)

效果

效果图

感想

暂时还没有开始实际用,希望明天开始可以一直用到开学吧,大概。

希望它活得久一点。受此启发以后可能会考虑用python + telegram的接口做些数据汇报,这样子远程挂机会方便一些(比如把terminal事实推送之类的,或者用TG+python抓取某些网页的更新)

但是这不是一个具有推广性的案例,有以下缺点:

  • 只能部署在windows上
  • 无法主动提示收到新消息
  • 需要管理的群一旦增多会很复杂
  • 输入类似打字输入,不知道是否是为了绕过微信的反bot设计,但没法换行之类的操作
  • 图片/文件管理起来不太方便,没有很好的思路

只能说大家都赶快别用微信了吧。只要用的人减少,绝望就不会容易传递。

微信难道不是小程序集合体/公众号推送装置吗?不会有人用微信聊天吧,不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧不会吧。

打赏
  • Copyrights © 2021-2024 Yida Jiang
  • 访问人数: | 浏览次数:

请我喝杯奶茶吧~

支付宝
微信