E企盈营销工具技术服务商 热线:4006-838-530

微信群机器人,Python打造微信群聊天机器人带操作界面

E企盈直播平台营销卖货系统

前言这几天我的一个小伙伴问我能不能给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的代码如下:defload_keyword(self):globalkeywordswithopen(‘keyword.csv’,’r’,encoding=’utf-8′,newline=”)asf:reader=csv.reader(f)fori,lineinenumerate(reader):ifi==0:continuekeywords[line[0]]=line[1]把keywords设置为全局变量方便后面使用,避免传参调用,判断i==0是为了去掉csv文件的第一行头部信息。负责群发的主要代码块如下,代码注释较为清晰,不再赘述@itchat.msg_register(TEXT,isGroupChat=True)defgroup_text(msg):globalkeywordsgroups=itchat.get_chatrooms(update=True)forgroupingroups:#群的NickName是群名称,UserName是群id(以两个@开始)#Python/Java学习交流群ifgroup[‘NickName’]ingroup_names:#从群中找到指定的群聊group_id=msg[‘FromUserName’]#防止其他群消息的的干扰ifnotgroup_id==group[‘UserName’]:break#准备回复的消息keys=keywords.keys()key=”foriinkeys:ifiinmsg[‘Text’]:key=ibreakifkey==”:returnmessage=keywords.get(key)#在消息中找到发送人的idsender_id=msg[‘ActualUserName’]#有时group[‘MemberList’]为空,改变思路由群id获取群聊成员#group_info=itchat.update_chatroom(msg[‘ToUserName’],detailedMember=True)#iflen(group_info)==0:#toUserName是自己在群聊发消息时,群id在消息里的key#FromUserName是别人在群里发时,群id在消息里的keygroup_info=itchat.update_chatroom(group_id,detailedMember=True)memberlist=group_info[‘MemberList’]formemberinmemberlist:#找到消息的发送者ifmember[‘UserName’]==sender_id:#如果有备注名,群聊显示的是备注名to_user=member[‘RemarkName’]iflen(to_user)==0:#否则显示成员自己修改的在群里的昵称to_user=member[‘DisplayName’]iflen(to_user)==0:#否则显示他E企盈小程序招商代理4006-838-530的昵称to_user=member[‘NickName’]itchat.send_msg(‘@{}{}’.format(to_user,message),group[‘UserName’])wx.CallAfter(pub.sendMessage,”update”,msg=”回复群聊[{}]成员[{}]成功:[{}]”.format(group[‘NickName’],to_user,message))负责定时群发的代码和上面的代码比较独立,在子线程开始的同时,开始执行定时群发的逻辑defrun(self):globaltt=threading.Timer(minutes60,self.auto_timer)t.start()self.load_keyword()self.load_group()itchat.auto_login(hotReload=True)itchat.run()其中主要的函数是threading.Timer(minutes60,self.auto_timer),它的意思是在负责执行群发的线程里,再开一个线程,这个线程间隔minutes60秒后去执行回调函数self.auto_timer,但是这样只能触发一次,没办法一直轮询,解决办法是在回调函数里面再去执行threading.Timer(minutes60,self.auto_timer),有点儿类似于递归调用,和递归不同的是,调用是没有终止条件的,但并不会产生内存溢出,因为定时器的存在,时间一到一触发回调函数,这个线程的生命就到此为止了,因此在整个程序运行期间,活跃线程的数目仅仅只是个位数:defauto_timer(self):globalauto_messagegroups=itchat.get_chatrooms(update=True)forgroupingroups:ifgroup[‘NickName’]ingroup_names:itchat.send_msg(‘{}’.format(auto_message),group[‘UserName’])wx.CallAfter(pub.sendMessage,”update”,msg=”群聊[{}]定时消息:[{}]发送成功”.format(group[‘NickName’],auto_message))globalt#把t设置为全局变量t=threading.Timer(minutes60,self.auto_timer)t.start()GUI部分的代码由于篇幅限制,就不贴出来了。如何体验关注公众号月小水长,后台回复微信群机器人即可获得

赞(0) 打赏
未经允许不得转载:E企盈小程序开发-热线:4006-838-530 » 微信群机器人,Python打造微信群聊天机器人带操作界面
分享到: 更多 (0)
E企盈小程序直播营销卖货系统
E企盈直播平台营销卖货系统

评论 抢沙发

E企盈小程序开发

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏