前言
微信自动回复、聊天机器人应该是一个很多人迫切需要的功能(如时间管理大师),网上能搜到的大多解决方案是采用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 = message
print(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.82
wx_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, urllib
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
def on_message(message):
print(message)
msg_obj = message
print(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
def main():
# 启动微信 目前仅支持微信V2.7.1.82
wx_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次,也可以自行购买别的库来使用,如腾讯云。回复中“主人让我对你说:”是额外添加的标志词,从而来区分机器人发的消息和本人发的消息,想要以假乱真可将该提示去掉。
感谢免费提供库的作者和公司。