第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 使用Itchat模块和图灵机器人API实现个人微信的自动回复

使用Itchat模块和图灵机器人API实现个人微信的自动回复

时间:2023-06-03 14:49:55

相关推荐

使用Itchat模块和图灵机器人API实现个人微信的自动回复

一、引言

在现代社交媒体的时代,自动化回复和发送消息的机器人变得越来越流行。这些机器人可以节省时间和精力,帮助我们管理和处理大量的信息。基于itchat+图灵机器人编写一个命名为“小林机器人”程序,接入微信托管,自动回复好友指定群聊的消息。

二、功能

1、实现回复好友和指定群聊的消息,可以发送表情包和图灵api返回的文本内容信息。

2、实现推送早报网、360资讯、科技日报的热点新闻信息。

三、准备工作

在开始编写代码之前,我们需要安装所需的Python库。请确保您已经安装了以下库:

注意事项

itchat项目有个缺陷是只有老的微信号(之前注册)才能登陆,新的微信号则不能登录;确保本人微信号能登上网页版才能使用itchat库。

itchat:用于与微信进行交互的库。可以使用以下命令进行安装:

pip install itchat

requests:用于发送HTTP请求和接收响应的库。可以使用以下命令进行安装:

pip install requests

导入全部需要的库:

import requests,re,time,json,os,randomimport itchatfrom bs4 import BeautifulSoup as bsfrom itchat.content import *from apscheduler.schedulers.blocking import BlockingSchedulerfrom queue import Queuefrom datetime import datetimeimport time

注册一个图灵机器人(现在是要收费的),注册好后,会有一个apikey,这个是以后连接图灵机器人需要到的;

四、 定义一个Boot类

主要作用是管理小林机器人的功能。在这个类中,我们将实现自动登录、消息处理和定时任务等功能。以下是"Boot"类的基本结构:

#小林机器人向群里/好友返回的数据def reply_group_friend_msg(func):# 装饰器class Boot:def __init__(self):# 初始化配置信息def response_url(self, url, verify=True):# 发送get请求网页数据def put_emj(self):# 将表情包目录文件全部放进队列def grab_mrzb_data(self):# 获取到早报网最新热点消息def parse_cale(self):# 解析时间日期格式def grab_weiyu(self):# 抓取精美语录信息def grab_readhub_data(self):# 获取到科技日报消息def grab_zixun_data(self):# 获取到360资讯最新热点消息@reply_group_friend_msgdef xiaolin_return_data(self, text, user, f_g_list):# 小林机器人实时返回数据def group_text_reply(self, msg):# 处理群聊文本/表情包消息def friend_text_reply(self, msg):# 处理好友文本/表情包消息def clear_itchat_pkl(self):# 登录时检查默认删除itchat.pkl文件(小林机器人缓存的数据)def run(self):# 运行小林机器人

@reply_group_friend_msg是一个装饰器,用来处理群聊和好友发送消息

def reply_group_friend_msg(func):# 接受调用语句的实参,在下面传递给被装饰函数(原函数)def make_decorater(*args,**kwargs): # 如果在这里return,则下面的代码无法执行,所以引用并在下面返回test_func = func(*args,**kwargs) '''因为被装饰函数里有return,所以需要给调用语句(test(2))一个返回,又因为test_func = func(*args,**kwargs)已经调用了被装饰函数,这里就不用带()调用了,区别在于运行顺序的不同。'''return test_func return make_decorater

推送早报网最新热点消息功能

发送get请求早报网网页源代码,用BeautifulSoup解析字符串,并生成解析结果对象,调用find_all(),使用CSS类选择器'_blank'查找所有具有该类的target元素,提取页面每一条的标题以及对应的url,保存到self.variety_config_info['mrzb_title']字典里

'''解析早报网网页数据'''def parse_mrzb(self):# 发送GET请求并获取响应对象parse_result = self.response_url(self.variety_config_info['url'][4],False)# 使用CSS类选择器'_blank'查找所有具有该类的target元素content = parse_result.find_all('a', {'target': {'_blank'}})for data in content: # 遍历提取到的早报数据# 使用正则表达式提取早报的标题和对应的url的数据get_url_title = re.findall(r'<a href="(.*?)" target="_blank" title="(.*?)">', str(data))if get_url_title != []: # 排除为空列表的数据self.variety_config_info['mrzb_title'][get_url_title[0][1]] = get_url_title[0][0]

因为推送的消息是今日的,所以在self.variety_config_info['mrzb_title']查找今日的标题和url,再次发送get请求,拿到今日标题的全部热点信息。

取self.variety_config_info['mrzb_title']第一个键值

list(self.variety_config_info['mrzb_title'].values())[0]

拿到全部热点消息,并处理格式,再将标头消息(时间日期+祝福语),热点消息拼接成一串新的字符串。

标头消息格式

self.variety_config_info['field'][2] + get_date + self.variety_config_info['field'][1]'''每天一分 知晓天下事!6月27日,农历五月初十,星期二,工作愉快,幸福生活!'''

'''早上报网今日最新热点新闻'''def grab_mrzb_data(self):self.parse_mrzb()today_new = self.response_url(list(self.variety_config_info['mrzb_title'].values())[0], False)get_text = today_new.find_all('article', {'class': {'article-content'}})get_date = today_new.find_all('meta', {'name': {'description'}})get_date = str(get_date[0])[15:31] + ','for title in get_text:result = re.findall(r'<span style=".*?">(.*?)</span>', str(title))get_title = '\n'.join(result)tmp_flag = get_title.index('【')if '【' in get_title:get_title = get_title[:tmp_flag] + '\n' + get_title[tmp_flag:]new_data_pack = self.variety_config_info['field'][2] + get_date + self.variety_config_info['field'][1] + get_title return new_data_pack

推送360资讯最新热点消息功能

发送get请求360资讯简报网页源代码,用BeautifulSoup解析字符串,并生成解析结果对象,调用find_all(),使用CSS类选择器'post_body'查找所有具有该类的<div>元素,遍历所提取到的元素,进一步用re正则表达式的findall方法提取热点新闻标题对应的文本数据,添加到self.variety_config_info['new_zixun_title']列表中。

'''热点新闻'''def grab_zixun_data(self):self.paser_zixun_title() # 得到资讯网页上的标题和url# 发送请求并获取响应对象par_data_result = self.response_url(list(self.variety_config_info['get_zixun_title'].values())[0])# 使用CSS类选择器'post_body'查找所有具有该类的<div>元素very_new = par_data_result.find_all('div', {'class': {'post_body'}})# 遍历资讯最新所有的热点标题for new in very_new:# 使用正则表达式提取热点新闻标题对应的文本数据title_1 = re.findall(r'(.*?)<br/>.*?<br/>', str(new))title_2 = re.findall(r'<br/>(.*?)<br/>', str(new))for tit1 in title_1[3:11]: # 部分标题1self.variety_config_info['new_zixun_title'].append(tit1)for tit2 in title_2[2:5]: # 部分标题2self.variety_config_info['new_zixun_title'].append(tit2)for tit3 in title_2[6:10]: # 部分标题3self.variety_config_info['new_zixun_title'].append(tit3)get_zixun_all_title = self.handle_zixun_title(self.variety_config_info['new_zixun_title'], title_1)return get_zixun_all_title # 返回资讯今日所有的最新标题

推送科技日报消息功能

先构建完整的URL,指定要访问每日早报的网页,发送get请求readhub网页源代码,使用CSS类选择器'Daily_item__RWo9q'查找所有具有该类的<a>元素,遍历提取到所有元素的数据,将每一条热点新闻标题添加到elf.variety_config_info['new_readhub_title'],处理标题格式,用jion方法拼接成一串新的字符串。

处理标头格式

'''得到新历/农历格式信息'''def parse_cale(self):# 获取当前日期并格式化为指定的格式report_time = time.strftime("%m月%d日", time.localtime())week = self.variety_config_info['week'].get(datetime.today().isoweekday())par_data_result = self.response_url(self.variety_config_info['url'][2]) # 发送请求并获取响应对象# 使用CSS类选择器'wnrl_k_you_id_7'查找所有具有该类的id元素find_chi_cale = par_data_result.find_all('div', {'id': {'wnrl_k_you_id_7'}})# 使用正则表达式提取农历格式的文本数据month = re.findall(r'<div class="wnrl_k_you_id_wnrl_nongli">(.*?)</div>', str(find_chi_cale))year = re.findall(r'<div class="wnrl_k_you_id_wnrl_nongli_ganzhi">(.*?)</div>', str(find_chi_cale))chi_cale = ''.join(month) + ''.join(year) # 五月初七癸卯年 【兔年】 戊午月 癸丑日get_format = chi_cale[4:7] + chi_cale[:4] # 癸卯年五月初七# 标头信息head_info = '{0},{1},{2},{3},{4}'.format(self.variety_config_info['field'][0],str(report_time),get_format,str(week),self.variety_config_info['field'][1])return head_info # 返回标头信息

自定义微语,随机提取一条微语

num = random.randint(0,len(self.variety_config_info['get_weiyu']))print(len(self.variety_config_info['get_weiyu']))ana = '\n【微语】' + self.variety_config_info['get_weiyu'][num]

'''每日科技早报'''def grab_readhub_data(self):self.get_readhub_title() # 得到readhub网页的每日早报所有标题信息head_info = self.parse_cale() # 得到日历格式# 遍历每日早报最新标题for index,title in enumerate(self.variety_config_info['get_readhub_title'],1):new = '{0}、{1};\n'.format(index,title) # 每一条标题格式# 将每一条标题格式添加到new_readhub_titleself.variety_config_info['new_readhub_title'].append(new) # 将self.variety_config_info['new_readhub_title']拼接成一个新字符串technology_new = ''.join(self.variety_config_info['new_readhub_title'])num = random.randint(0,len(self.variety_config_info['get_weiyu']))print(len(self.variety_config_info['get_weiyu']))ana = '\n【微语】' + self.variety_config_info['get_weiyu'][num]new_data_pack = str(head_info) + technology_new + ana # 标题信息+科技日报 return new_data_pack # 返回科技日报信息

回复好友消息功能

小林机器人实时返回消息,在xiaolin_return_data()方法中,我们将根据收到的消息内容进行处理,并返回相应的回复。

'''小林机器人实时回复消息'''@reply_group_friend_msgdef xiaolin_return_data(self, text, user, f_g_list):# 好友/群聊向小林机器人发送的文本数据self.xiaolin_config_info['perception']['inputText']['text'] = text user_send_msg = self.xiaolin_config_info['perception']['inputText']['text']# 发送请求并获取响应对象,得到小林机器人回复的消息req = json.dumps(self.xiaolin_config_info).encode('utf8')res_data = requests.post(self.variety_config_info['url'][3], data=req).textxiaolin_data_pack=json.loads(res_data)['results']for resutl in xiaolin_data_pack: # 好友/群聊成员第一次发送消息,将好友/群聊成员id保存f_g_list,并发送欢迎提示语,if user not in f_g_list: f_g_list.append(user)self.f_msg_pack = self.key_word['welcome']# 关键字回复elif user_send_msg in self.key_word['ask_keyword']:self.f_msg_pack = self.key_word['welcome']# 看新闻热点elif user_send_msg == '1':self.f_msg_pack = self.zixun_new# 看科技日报elif user_send_msg == '2':self.f_msg_pack = self.technology_new# 玩斗图elif user_send_msg == '3':self.f_picture_flag = Trueself.f_msg_pack = self.f_picture_flag# 聊天elif user_send_msg == '4':self.f_msg_pack = self.key_word['chat'][0]# 返回小林机器人实时回复的消息else:self.f_msg_pack = resutl['values']['text']return self.f_msg_pack # 向好友/群聊返回消息

回复指定群聊消息功能

小林机器人还可以回复指定的群聊消息。我们使用group_text_reply()方法来实现这个功能。在这个方法中,我们遍历所有的群聊,找到指定的群聊,并向其发送指定的消息。

'''回复指定的群聊消息'''def group_text_reply(self, msg):content = msg['Content']# 对方发来的内容type = msg['Type']# 对方发来的图片或表情包fromuser = msg['FromUserName']# 对方的名字g_name = msg['User']['NickName']if msg['isAt']: # 群聊有人艾特,返回True# 捕获异常try:# 提取群聊的成员艾特后面的文本消息,如:@群聊名称 '消息'msg_text = str(content)[str(content).index(' ')+1:]if len(msg_text) == 0: # 艾特后面没有文本消息self.itchat.send(self.key_word['welcome'],fromuser)returnif len(msg_text) != 0: # 艾特后面有文本消息if msg_text == '3':# 传入消息到小林机器人,返回得到小林机器人实时回复表情包/图片at_msg = self.xiaolin_return_data(msg_text,fromuser,self.variety_config_info['g_user'])# 用api得到回复内容 if at_msg:for i in range(3):self.itchat.send_image(self.p_q.get(),fromuser)time.sleep(1)self.g_picture_flag = Falsereturnelse:# 传入消息到小林机器人,返回得到小林机器人实时回复的消息at_msg = self.xiaolin_return_data(msg_text,fromuser,self.variety_config_info['g_user'])# 用api得到回复内容 self.itchat.send(at_msg,fromuser) # 向群聊成员发送消息returnexcept Exception:pass# 没有人艾特,返回得到小林机器人实时回复的消息g_msg = self.xiaolin_return_data(content,fromuser,self.variety_config_info['g_user'])# 用api得到回复内容 if self.g_picture_flag: # 群聊成员发送文本消息为'3'self.itchat.send_image(self.p_q.get(),fromuser) # 向群聊发送表情包print('0')time.sleep(1)self.g_picture_flag = False # 标记置为Falsereturn# 收到对方群聊的文本消息必须是来自开发者指定的群聊,才得以回复消息操作if 'Text' == type and g_name in self.variety_config_info['gname']:self.itchat.send_msg(g_msg, fromuser) # 向群聊发送消息return# 收到对方群聊的表情包/图片消息必须是来自开发者指定的群聊,才得以回复消息操作if 'Picture' == type and g_name in self.variety_config_info['gname']:self.itchat.send_image(self.p_q.get(),fromuser) # 向群聊发送图片/表情包time.sleep(1)return

启动小林机器人

# 启动机器人 def run(self):# 通过如下命令登陆,即使程序关闭,一定时间内重新开启也可以不用重新扫码。# loginCallback=self.after_login, exitCallback=self.after_loginself.itchat.auto_login(hotReload=True)# self.auto_send_msg_group(self.p_q,self.variety_config_info['gname'])# 运行并保持在线状态self.itchat.run()

运行效果

回复好友

指定群聊回复

结论

通过本文的指导和示例代码,您已经学会了使用Python编写小林机器人的基本功能,包括自动回复、发送消息和定时任务等。您可以根据实际需求,进一步完善和定制机器人的功能,以满足个人或团体的需求。

希望本文能够帮助您理解和掌握Python编写小林机器人的方法,并为您在自动化消息处理方面提供有用的参考。谢谢阅读!

参考具体代码

链接:/s/15ojmtxIctC5rWde32gsuJA

提取码:aaaa

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。