使用Itchat模块和图灵机器人API实现个人微信的自动回复
一、引言
在现代社交媒体的时代,自动化回复和发送消息的机器人变得越来越流行。这些机器人可以节省时间和精力,帮助我们管理和处理大量的信息。基于+图灵机器人编写一个命名为“小林机器人”程序,接入微信托管,自动回复好友指定群聊的消息。
二、功能
1、实现回复好友和指定群聊的消息,可以发送表情包和图灵api返回的文本内容信息。
2、实现推送早报网、360资讯、科技日报的热点新闻信息。
三、准备工作
在开始编写代码之前,我们需要安装所需的库。请确保您已经安装了以下库:
项目有个缺陷是只有老的微信号(2017之前注册)才能登陆,新的微信号则不能登录;确保本人微信号能登上网页版才能使用库。
pip install itchat
pip install requests
import requests,re,time,json,os,random
import itchat
from bs4 import BeautifulSoup as bs
from itchat.content import *
from apscheduler.schedulers.blocking import BlockingScheduler
from queue import Queue
from datetime import datetime
import time
四、 定义一个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):# 运行小林机器人
@sg是一个装饰器,用来处理群聊和好友发送消息
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请求早报网网页源代码,用解析字符串,并生成解析结果对象,调用(),使用CSS类选择器''查找所有具有该类的元素,提取页面每一条的标题以及对应的url,保存到self.['']字典里
'''解析早报网网页数据'''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'', str(data))if get_url_title != []: # 排除为空列表的数据self.variety_config_info['mrzb_title'][get_url_title[0][1]] = get_url_title[0][0]
因为推送的消息是今日的,所以在self.['']查找今日的标题和url,再次发送get请求,拿到今日标题的全部热点信息。
取self.['']第一个键值
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'(.*?)', 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资讯简报网页源代码,用解析字符串,并生成解析结果对象,调用(),使用CSS类选择器''查找所有具有该类的
元素,遍历所提取到的元素,进一步用re正则表达式的方法提取热点新闻标题对应的文本数据,添加到self.['']列表中。
'''热点新闻'''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'查找所有具有该类的元素very_new = par_data_result.find_all('div', {'class': {'post_body'}})# 遍历资讯最新所有的热点标题for new in very_new:# 使用正则表达式提取热点新闻标题对应的文本数据title_1 = re.findall(r'(.*?)
.*?
', str(new))title_2 = re.findall(r'
(.*?)
', 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请求网页源代码,使用CSS类选择器''查找所有具有该类的元素,遍历提取到所有元素的数据,将每一条热点新闻标题添加到elf.[''],处理标题格式,用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'(.*?)', str(find_chi_cale))year = re.findall(r'(.*?)', 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 # 返回科技日报信息
其他相关