用Python打造个性化DIY 群聊机器人,打发你那无处安放的时间。

2021-03-06 05:30

阅读:701

标签:with open   text   min   reading   names   bsp   技术   src   form   

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

本文章来自腾讯云 作者:Python进阶者

想要学习Python?有问题得不到第一时间解决?来看看这里“1039649593”满足你的需求,资料都已经上传至文件中,可以自行下载!还有海量最新2020python学习资料。
点击查看
技术图片

前言
这几天我的一个小伙伴问我能不能给 Ta 做一个配置灵活的微信群聊天机器人,之前了解过 itchat 库的使用,我就爽快的答应了,花了一个晚上,终于做出了雏形。

电脑上运行程序如下:

技术图片
手机上的信息如下:
技术图片
技术图片
技术图片
技术图片
2、代码的流程

首先是加载相应的配置文件,确定要开启哪些群聊的自动回复,以及关键词回复信息。也正因如此,在程序执行过程中,这些信息是不能被动态改变的。

其中加载 keyword的代码如下:

1def load_keyword(self):
2    global keywords
3    with open( keyword.csv ,  r , encoding= utf-8 , newline=  ) as f:
4        reader = csv.reader(f)
5        for i, line in enumerate(reader):
6            if i == 0:
7                continue
8            keywords[line[0]] = line[1]

 

把 keywords 设置为全局变量方便后面使用,避免传参调用,判断 i == 0 是为了去掉 csv 文件的第一行头部信息。

负责群发的主要代码块如下,代码注释较为清晰,不再赘述

 1@itchat.msg_register(TEXT, isGroupChat=True)
 2def group_text(msg):
 3    global keywords
 4    groups = itchat.get_chatrooms(update=True)
 5    for group in groups:
 6        # 群的 NickName 是群名称,UserName 是群id(以两个@开始)
 7        # Python/Java 学习交流群
 8        if group[ NickName ] in group_names:  # 从群中找到指定的群聊
 9            group_id = msg[ FromUserName ]
10            # 防止其他群消息的的干扰
11            if not group_id == group[ UserName ]:
12                break
13            # 准备回复的消息
14            keys = keywords.keys()
15            key =   
16            for i in keys:
17                if i in msg[ Text ]:
18                    key = i
19                    break
20            if key ==   :
21                return
22            message = keywords.get(key)
23            # 在消息中找到 发送人的id
24            sender_id = msg[ ActualUserName ]
25            # 有时 group[ MemberList ] 为空,改变思路由群 id 获取群聊成员
26            # group_info = itchat.update_chatroom(msg[ ToUserName ], detailedMember=True)
27            # if len(group_info) == 0:
28            # toUserName 是自己在群聊发消息时,群 id 在消息里的 key
29            # FromUserName 是别人在群里发时,群 id 在消息里的 key
30            group_info = itchat.update_chatroom(group_id, detailedMember=True)
31            memberlist = group_info[ MemberList ]
32            for member in memberlist:
33                # 找到消息的发送者
34                if member[ UserName ] == sender_id:
35                    # 如果有备注名,群聊显示的是备注名
36                    to_user = member[ RemarkName ]
37                    if len(to_user) == 0:
38                        # 否则显示成员自己修改的在群里的昵称
39                        to_user = member[ DisplayName ]
40                    if len(to_user) == 0:
41                        # 否则显示他微信号的昵称
42                        to_user = member[ NickName ]
43                    itchat.send_msg( @{}
{} .format(to_user, message), group[ UserName ])
44                    wx.CallAfter(pub.sendMessage, "update", msg="回复群聊[{}]成员[{}]成功:[{}]".format(group[ NickName ],to_user,message))

 

负责定时群发的代码和上面的代码比较独立,在子线程开始的同时,开始执行定时群发的逻辑

1def run(self):
2    global t
3    t = threading.Timer(minutes * 60, self.auto_timer)
4    t.start()
5    self.load_keyword()
6    self.load_group()
7    itchat.auto_login(hotReload=True)
8    itchat.run()

 

技术图片

 1def auto_timer(self):
 2    global auto_message
 3    groups = itchat.get_chatrooms(update=True)
 4    for group in groups:
 5        if group[ NickName ] in group_names:
 6            itchat.send_msg( {} .format(auto_message), group[ UserName ])
 7            wx.CallAfter(pub.sendMessage, "update",
 8                         msg="群聊[{}]定时消息:[{}]发送成功".format(group[ NickName ], auto_message))
 9
10    global t  # 把 t 设置为全局变量
11    t = threading.Timer(minutes * 60, self.auto_timer)
12    t.start()

 

GUI 部分的代码由于篇幅限制,就不贴出来了。

用Python打造个性化DIY 群聊机器人,打发你那无处安放的时间。

标签:with open   text   min   reading   names   bsp   技术   src   form   

原文地址:https://www.cnblogs.com/aa3935919/p/14307754.html


评论


亲,登录后才可以留言!