Python 打造微信群聊天机器人(带操作界面)
前言
这几天我的一个小伙伴问我能不能给 Ta 做一个配置灵活的微信群聊天机器人,之前了解过 itchat
库的使用,我就爽快的答应了,花了一个晚上,终于做出了雏形。
电脑上运行程序如下:
手机上的信息如下:
其实基于 itchat
的微信机器人早已经烂大街了,但大多数过于简单,相比较而言,我的这个程序有下面几大鲜明的特色:
1、支持打开/关闭指定群聊的自动回复,只需用记事本打开 group.csv
文件,填写想要打开自动回复群聊名称即可,每次输完一个群聊名称,必须换行。
2、支持自定义设置关键词回复,只需用记事本打开 keyword.csv
文件,按照***{关键词,回复}***的格式添加即可,而不需要在代码中做任何修改。输完一个键值对,同样也需要换行,注意输入的是英文逗号。
3、支持定时群发消息,而且时间、消息可以在程序运行中动态修改。
4、有较为良好的 GUI
界面,其中色彩搭配参考了微信的简约设计。
DIY 玩法
1、面向商户
作为商户,维护群的时候可能有这样的需求,定时发送消息。比如
回复 xxx 可获得 yyy
,同时在keyword.csv
文件中事先写好。这样,可以让群成员各取所需,你又不需要打字、复制粘贴,还可以同时处理多个群,省心还高效。
2、面向普通个人
定时向男女朋友,父母亲人发送晚安祝福消息等。
3、部署至阿里云服务器
有个缺陷就是如果想一直自动群发消息的话,你的电脑就必须一直开着,但是部署至云服务器可以解决这个问题。部署流程可以参考我之前的文章,同时给出阿里云服务器优惠购买传送门。
代码的详细设计
1、代码的架构
由于引入了 GUI
,GUI
代码块和负责群发消息的代码块一样,都是阻塞型的,为此,程序就必须引入多线程机制,其中 GUI
界面是主线程,负责群发消息的代码块运行在子线程,线程间的通信我用的是 wxPython
内置的 wx.lib.pubsub
模块,一旦子线程执行了相应的动作,就通过 wx.CallAfter(pub.sendMessage)
接口发送消息给通知 GUI
线程,从而保证 GUI
能够及时刷新并不至于卡顿。
2、代码的流程
首先是加载相应的配置文件,确定要开启哪些群聊的自动回复,以及关键词回复信息。也正因如此,在程序执行过程中,这些信息是不能被动态改变的。
其中加载 keyword
的代码如下:
def load_keyword(self):global keywordswith open('keyword.csv', 'r', encoding='utf-8', newline='') as f:reader = csv.reader(f)for i, line in enumerate(reader):if i == 0:continuekeywords[line[0]] = line[1]
把 keywords
设置为全局变量方便后面使用,避免传参调用,判断 i == 0
是为了去掉 csv
文件的第一行头部信息。
负责群发的主要代码块如下,代码注释较为清晰,不再赘述
@itchat.msg_register(TEXT, isGroupChat=True)
def group_text(msg):global keywordsgroups = itchat.get_chatrooms(update=True)for group in groups:# 群的 NickName 是群名称,UserName 是群id(以两个@开始)# Python/Java 学习交流群if group['NickName'] in group_names: # 从群中找到指定的群聊group_id = msg['FromUserName']# 防止其他群消息的的干扰if not group_id == group['UserName']:break# 准备回复的消息keys = keywords.keys()key = ''for i in keys:if i in msg['Text']:key = ibreakif key == '':returnmessage = keywords.get(key)# 在消息中找到 发送人的idsender_id = msg['ActualUserName']# 有时 group['MemberList'] 为空,改变思路由群 id 获取群聊成员# group_info = itchat.update_chatroom(msg['ToUserName'], detailedMember=True)# if len(group_info) == 0:# toUserName 是自己在群聊发消息时,群 id 在消息里的 key# FromUserName 是别人在群里发时,群 id 在消息里的 keygroup_info = itchat.update_chatroom(group_id, detailedMember=True)memberlist = group_info['MemberList']for member in memberlist:# 找到消息的发送者if member['UserName'] == sender_id:# 如果有备注名,群聊显示的是备注名to_user = member['RemarkName']if len(to_user) == 0:# 否则显示成员自己修改的在群里的昵称to_user = member['DisplayName']if len(to_user) == 0:# 否则显示他微信号的昵称to_user = member['NickName']itchat.send_msg('@{}\n{}'.format(to_user, message), group['UserName'])wx.CallAfter(pub.sendMessage, "update", msg="回复群聊[{}]成员[{}]成功:[{}]".format(group['NickName'],to_user,message))
负责定时群发的代码和上面的代码比较独立,在子线程开始的同时,开始执行定时群发的逻辑
def run(self):global tt = threading.Timer(minutes * 60, self.auto_timer)t.start()self.load_keyword()self.load_group()itchat.auto_login(hotReload=True)itchat.run()
其中主要的函数是 threading.Timer(minutes * 60, self.auto_timer)
,它的意思是在负责执行群发的线程里,再开一个线程,这个线程间隔minutes * 60
秒后去执行回调函数 self.auto_timer
,但是这样只能触发一次,没办法一直轮询,解决办法是在回调函数里面再去执行 threading.Timer(minutes * 60, self.auto_timer)
,有点儿类似于递归调用,和递归不同的是,调用是没有终止条件的,但并不会产生内存溢出,因为定时器的存在,时间一到一触发回调函数,这个线程的生命就到此为止了,因此在整个程序运行期间,活跃线程的数目仅仅只是个位数:
def auto_timer(self):global auto_messagegroups = itchat.get_chatrooms(update=True)for group in groups:if group['NickName'] in group_names:itchat.send_msg('{}'.format(auto_message), group['UserName'])wx.CallAfter(pub.sendMessage, "update",msg="群聊[{}]定时消息:[{}]发送成功".format(group['NickName'], auto_message))global t # 把 t 设置为全局变量t = threading.Timer(minutes * 60, self.auto_timer)t.start()
GUI
部分的代码由于篇幅限制,就不贴出来了。
如何体验
关注公众号月小水长,后台回复微信群机器人即可获得
Python 打造微信群聊天机器人(带操作界面)相关推荐
- python社区微信群_Python 打造微信群聊天机器人(带操作界面)-Go语言中文社区...
前言 这几天我的一个小伙伴问我能不能给 Ta 做一个配置灵活的微信群聊天机器人,之前了解过 itchat 库的使用,我就爽快的答应了,花了一个晚上,终于做出了雏形. 电脑上运行程序如下: 手机上的信息 ...
- python微信聊天机器人_python微信群聊天机器人[python] import curses
python 中,我们使用 curses.wrapper 来创建终端交互window.使用 stdscr 来代表 window 对象. <python微信群聊天机器人[python] impor ...
- 继使命召唤飞机表情雨后,如何在微信群聊天中自带表情雨特效,还有使命召唤红包封面...
小伙伴们注意:公众号的推送机制不再按照时间前后推送了,微信公众号信息流乱序.君哥建议大家把公众号置顶(设为星标★),以便第一时间看到推送,方法如下图: 今天给大家分享两个东西: 1.使命召唤红包封面 ...
- python web微信应用(三) 微信智能聊天机器人
文章目录 前言 一.webwx 模块介绍 二.微信智能聊天 前言 本篇文章作为系列第三篇文章,将实现一个微信智能聊天机器人: 系列其它文章请参考: python web微信应用(一) 微信协议分析 p ...
- 用WeRoBot和Python编写一个不使用网页版微信且能够回复消息微信群聊机器人
要用 WeRoBot 和 Python 编写一个不使用网页版微信且能够回复消息的微信群聊机器人,您需要以下步骤: 安装 WeRoBot 和相关依赖: pipinstall werobot 创建一个 P ...
- 用WeRoBot和Python编写一个不使用网页版微信的微信群聊机器人
要使用 WeRoBot 和 Python 编写一个不使用网页版微信的微信群聊机器人,您需要执行以下步骤: 安装 WeRoBot 库: pipinstall WeRoBot 创建一个 Python 脚本 ...
- python制作聊天机器人原理_用 Python 来做一个聊天机器人吧!(一)
在我的一个回答里,我提到了用 Python 搭建聊天机器人.从今天开始,我就带着大家从0开始搭建一个聊天机器人. (顺便说一句,我喜欢把链接像上面这样加在文字里,如果找不到文中所说的资源,可以看看周围 ...
- 利用微信API将你的微信变为聊天机器人
想想将个人微信变为一个机器人也是很好玩的,这个项目就教你如何把自己的微信变为一个聊天机器人,嗯~对的,和小冰差不多的感觉吧(哈哈哈~). 最终效果图: 效果图 原理: 通过微信的Python接口itc ...
- Python基于AIML智能聊天机器人实战(4)- 机器人自学习能力集成
一.前言 本文是<Python基于AIML智能聊天机器人实战>第四篇:AIML自学习能力集成: AIML是智能对话机器人具有里程碑意义的开源项目,曾斩获多项国际大奖,是基于检索技术的闲聊式 ...
最新文章
- iOS 富文本编辑工厂, 让书写更简便.
- pandas中set_option的常用设置:显示所有行、显示所有列、控制浮点型精度、每个数据元素的显示字符数、对齐形式等
- IE8抢先尝试——色眼窥观版(多图)
- 在图片中选定任意凸多边形制作掩膜程序MATLAB
- P2024 [NOI2001]食物链[扩展域并查集]
- Proxmark3 Easy Gui 4.0 5.0 5.1加强版免费获取啦
- mysql离线安装 window_5分钟完成mysql离线安装
- 洛谷 P3063 [USACO12DEC]牛奶的路由Milk Routing
- linux检测扩容卡,TF内存卡是不是扩容卡准确质量检测
- Excel如何快速对比数据
- Freebase上的SPARQL查询
- 【无标题】IP地址段必须正好可以聚合成1个地址块
- mysql数据库配置_mysql数据库怎么配置
- 麦穗理论,又名“秘书问题”(1/e处为最优分割点)
- 转:新浪给微米定下了哪些要求?
- Ontology × DoraHacks 10万美金黑客松现已启航,在WEB3的世界里添“码”行空
- 知识图谱关系抽取 python_中文知识图谱-基于规则的关系抽取
- 不会做课程大纲?吸人的课纲这样做才值钱
- bat的命令若干用法
- 程序杰杰正式加入博客,与大家一起努力进步,会分享记录一些杰杰觉得有用的代码知识...
热门文章
- 计算机考试ppt应用,职称计算机考试辅导:Powerpoint使用母版
- 使用WGCLOUD来统计用户日活周活月活
- Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)
- 亚马逊(Amazon)新接口SP-API和PII受限信息的开发者申请
- vrchat新手教程_VRChat简易教程2-创建一个最基本的世界(world)
- 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现
- Flutter实践——AndroidStudio环境初体验
- ABAP CDS编写
- 自旋锁以及Java中的自旋锁的实现
- Glide如何加载项目中的图片资源