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

一、引言

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

二、功能

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

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

三、准备工作

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

  • 注意事项

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

  • itchat:用于与微信进行交互的库。可以使用以下命令进行安装:
pip install itchat
  • requests:用于发送HTTP请求和接收响应的库。可以使用以下命令进行安装:
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
  • 注册一个图灵机器人(现在是要收费的),注册好后,会有一个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_msg
    def 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]: # 部分标题1
                self.variety_config_info['new_zixun_title'].append(tit1)
            for tit2 in title_2[2:5]: # 部分标题2
                self.variety_config_info['new_zixun_title'].append(tit2)
            for tit3 in title_2[6:10]: # 部分标题3
                self.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_title
            self.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_msg
    def 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).text
        xiaolin_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 = True
                self.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)
                    return
                if 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 = False
                            return
                    else:
                        # 传入消息到小林机器人,返回得到小林机器人实时回复的消息
                        at_msg = self.xiaolin_return_data(msg_text,fromuser,self.variety_config_info['g_user'])# 用api得到回复内容 
                        self.itchat.send(at_msg,fromuser) # 向群聊成员发送消息
                        return
            except 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 # 标记置为False
            return
        # 收到对方群聊的文本消息必须是来自开发者指定的群聊,才得以回复消息操作
        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_login
        self.itchat.auto_login(hotReload=True)
        # self.auto_send_msg_group(self.p_q,self.variety_config_info['gname'])
        # 运行并保持在线状态
        self.itchat.run()

运行效果 

回复好友

指定群聊回复

 

结论

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

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

参考具体代码

链接:https://pan.baidu.com/s/15ojmtxIctC5rWde32gsuJA 
提取码:aaaa

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值