文章目录
- 前言
- 一、运行环境
- 二、使用步骤
- 1.引入库
- 2.根据文本内容自动生成回复
- 3.接收消息的回调函数
- 4.启动客户端
- 5.程序入口
- 三、代码全文
- 总结
前言
微信自动回复、聊天机器人应该是一个很多人迫切需要的功能(如时间管理大师),网上能搜到的大多解决方案是采用2018年之前的基于Web版微信的itchat或wxpy第三方库,但现在申请注册比较晚的微信号无法登录Web版微信,故上述两个库均已失效。还有一些需要注入dll手段的,操作比较麻烦不适合新手。
本文用python提供一种解决方案初代版本,只需调包,无需对系统进行其他操作,可根据自身需要定制内容。
温馨提示:仅供娱乐,请谨慎使用,由自身使用不当引起家庭矛盾、跟上级领导关系不和等各种不良后果,本文作者概不负责。
该机器人支持天气查询、成语接龙、彩虹屁等功能,可在天行控制台进行定制。
效果展示:
提示:以下是本篇文章正文内容,下面案例可供参考
一、运行环境
Windows10+python 3.7.4+PC端微信V2.7.1.82版本+PyCharm/VS2017
提示:python版本一定要是3.7及以后;微信版本目前仅支持V2.7.1.82版本
PC端微信V2.7.1.82版本安装包百度网盘下载
链接:https://pan.baidu.com/s/1yADEwqht8hcTTjxpkW8DXw
提取码:rneo
二、使用步骤
1.引入库
代码如下(示例):
from WechatPCAPI import WechatPCAPI
import time
import http.client, urllib
所用库的说明和下载地址:
https://github.com/terrywangt/WeChatBot
https://www.tianapi.com/apiview/47
第二个网址为天行公司的网址,免费申请注册可以获得接口,有示例代码
2.根据文本内容自动生成回复
代码如下(示例):
# #生成回复内容的函数,传入的是接收到的字符串,返回值为回复str
def send_msg_producer(content):conn = http.client.HTTPSConnection('api.tianapi.com') # 接口域名params = urllib.parse.urlencode({'key': '你在天行网站上申请获得的APIKEY', 'question': content})headers = {'Content-type': 'application/x-www-form-urlencoded'}conn.request('POST', '/robot/index', params, headers)res = conn.getresponse()data = res.read()str_data = data.decode('utf-8') # 报文解码返回值为str,转为dict再操作dict_data = eval(str_data)out_content = dict_data['newslist'][0]['reply'] #将要回复消息读取出来,作为返回值return out_content
该函数传入的参数content为你对机器人的提问,str类型(也就是微信收到的新消息字符串);返回值为机器人根据上文自动生成的回复,str类型。
注意:代码中的key需要填上你在天行网站上申请到的key
3.接收消息的回调函数
代码如下(示例):
# 接收消息的回调函数,可自行定义
def on_message(message):print(message)msg_obj = messageprint(msg_obj['type'])# #----------------------------------------------------------------------个人聊天if msg_obj['type'] == 'msg::single':name_id = msg_obj['data']['from_wxid']send_or_recv=msg_obj['data']['send_or_recv'][0]content = msg_obj['data']['msg']# #---------------------------------------# #打印输出测试print(name_id)print(send_or_recv)print(content)if (send_or_recv == '0') and (name_id == '你想启用自动回复的目标1' or name_id == '你想启用自动回复的目标2' or name_id == '你想启用自动回复的目标3'):# #判定通过print('该个人节点已通过')# #封装的生成输出内容的函数out_content = send_msg_producer(content)# ---------------------------------------------------------发送输出wx_inst.send_text(to_user=name_id, msg= '主人让我对你说:\n' + str(out_content) )# #-------------------------------------------------------------------------------------群聊设置elif msg_obj['type'] == 'msg::chatroom':chatroom_id = msg_obj['data']['from_chatroom_wxid']send_or_recv = msg_obj['data']['send_or_recv'][0]content = msg_obj['data']['msg']# ---------------------------------------# 打印输出测试print(chatroom_id)print(send_or_recv)print(content)if (send_or_recv == '0') and (chatroom_id == '你想启用自动回复的目标1' or chatroom_id == '你想启用自动回复的目标2'): # #判定通过print('该群聊节点已通过')# #调用内容生成函数out_content = send_msg_producer(content)# ---------------------------------------------------------发送输出wx_inst.send_text(to_user=chatroom_id, msg='主人让我对你说:\n' + str(out_content))return None
每当收到新消息时,就会触发回调函数。示例中的回调函数内容为个人和群聊两部分,需要在if判定条件里填入你想进行自动回复的目标。注意:填入的目标id一定要为原始id,比如个人的微信号格式为wxid_1122334455asdf,微信号更改后的那个id不可以,群聊的微信号格式为1122334455@chatroom,如何才能知道某个人的原始微信号,可以百度,也可以直接看WechatPCAPI接受到信息的报文,不赘述。
代码中部分用于测试输出的语句我没有注释掉,不影响运行结果,同时可以让你可以很清楚的看到,当微信收到新消息时,你的程序都进行了哪些操作
4.启动客户端
def main():# 启动微信 目前仅支持微信V2.7.1.82wx_inst.start_wechat(block=True)# 等待登陆成功,此时需要人为扫码登录微信while not wx_inst.get_myself():time.sleep(5)# 登录成功了print(wx_inst.get_myself())time.sleep(10)# 更新所有好友信息,数据会通过上面的回调函数返回wx_inst.update_frinds()
5.程序入口
wx_inst = WechatPCAPI(on_message=on_message)
main()
程序从此处开始执行,也可以写为if__name__== ’ __main __’:的方式来执行
三、代码全文
from WechatPCAPI import WechatPCAPI
import time
import http.client, urllibdef send_msg_producer(content):conn = http.client.HTTPSConnection('api.tianapi.com') # 接口域名params = urllib.parse.urlencode({'key': '你在天行网站上申请获得的APIKEY', 'question': content})headers = {'Content-type': 'application/x-www-form-urlencoded'}conn.request('POST', '/robot/index', params, headers)res = conn.getresponse()data = res.read()str_data = data.decode('utf-8') # 报文解码返回值为str,转为dict再操作dict_data = eval(str_data)out_content = dict_data['newslist'][0]['reply'] #将要回复消息读取出来,作为返回值return out_contentdef on_message(message):print(message)msg_obj = messageprint(msg_obj['type'])# #----------------------------------------------------------------------个人聊天if msg_obj['type'] == 'msg::single':name_id = msg_obj['data']['from_wxid']send_or_recv=msg_obj['data']['send_or_recv'][0]content = msg_obj['data']['msg']# #---------------------------------------# #打印输出测试print(name_id)print(send_or_recv)print(content)if (send_or_recv == '0') and (name_id == '你想启用自动回复的目标1' or name_id == '你想启用自动回复的目标2' or name_id == '你想启用自动回复的目标3'):# #判定通过print('该个人节点已通过')# #封装的生成输出内容的函数out_content = send_msg_producer(content)# ---------------------------------------------------------发送输出wx_inst.send_text(to_user=name_id, msg= '主人让我对你说:\n' + str(out_content) )# #-------------------------------------------------------------------------------------群聊设置elif msg_obj['type'] == 'msg::chatroom':chatroom_id = msg_obj['data']['from_chatroom_wxid']send_or_recv = msg_obj['data']['send_or_recv'][0]content = msg_obj['data']['msg']# ---------------------------------------# 打印输出测试print(chatroom_id)print(send_or_recv)print(content)if (send_or_recv == '0') and (chatroom_id == '你想启用自动回复的目标1' or chatroom_id == '你想启用自动回复的目标2'): # #判定通过print('该群聊节点已通过')# #调用内容生成函数out_content = send_msg_producer(content)# ---------------------------------------------------------发送输出wx_inst.send_text(to_user=chatroom_id, msg='主人让我对你说:\n' + str(out_content))return Nonedef main():# 启动微信 目前仅支持微信V2.7.1.82wx_inst.start_wechat(block=True)# 等待登陆成功,此时需要人为扫码登录微信while not wx_inst.get_myself():time.sleep(5)# 登录成功了print(wx_inst.get_myself())time.sleep(10)# 更新所有好友信息,数据会通过上面的回调函数返回wx_inst.update_frinds()wx_inst = WechatPCAPI(on_message=on_message)
main()
总结
所提供的代码只是一个最简单的示例,还有很多改进的空间。比如创建一个dict来存储需要自动回复的对象的微信id,然后通过创建一个简单的UI窗口来实现对该dict的增删。采用跟本文一致的环境的话应该不会产生额外的环境问题,如有问题请参照本文2.1节给出的两个链接。机器人回复的效果也可以提升,本文采用的是天行提供的免费试用版库,普通用户每天可以免费调用接口100次,也可以自行购买别的库来使用,如腾讯云。回复中“主人让我对你说:”是额外添加的标志词,从而来区分机器人发的消息和本人发的消息,想要以假乱真可将该提示去掉。
感谢免费提供库的作者和公司。