采用python编写微信自动回复程序(基于图灵机器人)
写在开头,注册CSDN这么久,第一次发博客,难免有写得不明白的地方,请读者们谅解!
一、要实现微信自动回复,需要如下准备:
1.注册一个图灵机器人(现在是要收费的,不过一个月的费用也不是很贵),注册好后,会有一个apikey,这个是以后连接图灵机器人需要到的;
2.安装python(本人是采用python3.7.4进行代码的编写),python安装教程很多,这里不多说了;
3.安装python的itchat和re两个安装包,安装包的教程也很多,这里也不多说了;
4.一个使用年限比较久的微信号(本人的微信号使用了7年),貌似注册一年的微信号是登录不了微信的网页版。因为本程序时基于网页版微信的自动回复。
二、程序中主要的函数解析
1.@itchat.msg_register([‘Text’,‘Map’, ‘Card’, ‘Note’, ‘Sharing’, ‘Picture’, ‘Video’])
def tuling_reply(msg):
该函数主要是连接微信和图灵机器人,在两者之间传递消息。使用该函数,先要注册消息的类型。
使用itchat模块读取微信消息的内容时,消息的格式如下:
{
‘MsgId’: ‘204068301817265407’,
‘FromUserName’: ‘@b61d******************************8572f9f’,
‘ToUserName’: ‘filehelper’,
‘MsgType’: 1,
‘Content’: ‘你好’,
‘Status’: 3,
‘ImgStatus’: 1,
‘CreateTime’: 1612185614,
‘VoiceLength’: 0,
‘PlayLength’: 0,
‘FileName’: ‘’,
‘FileSize’: ‘’,
‘MediaId’: ‘’,
‘Url’: ‘’,
‘AppMsgType’: 0,
‘StatusNotifyCode’: 0,
‘StatusNotifyUserName’: ‘’,
‘RecommendInfo’:
{‘UserName’: ‘’,
‘NickName’: ‘’,
‘QQNum’: 0,
‘Province’: ‘’,
‘City’: ‘’,
‘Content’: ‘’,
‘Signature’: ‘’,
‘Alias’: ‘’,
‘Scene’: 0,
‘VerifyFlag’: 0,
‘AttrStatus’: 0,
‘Sex’: 0,
‘Ticket’: ‘’,
‘OpCode’: 0},
‘ForwardFlag’: 0,
‘AppInfo’:
{‘AppID’: ‘’, ‘Type’: 0},
‘HasProductId’: 0,
‘Ticket’: ‘’,
‘ImgHeight’: 0,
‘ImgWidth’: 0,
‘SubMsgType’: 0,
‘NewMsgId’: 204068301817265407,
‘OriContent’: ‘’,
‘EncryFileName’: ‘’,
‘Type’: ‘Text’,
‘Text’: ‘你好’
}
2.def is_right_id(targe_char, string): #在字符串string中,查找单个字符targe_char。
targe_char一般是字符’@‘因为使用itchat模块读取微信消息的内容时,FromUserName对应的值是以’@‘开头的,通过判断是否存在’@'来区别发送的消息是不是FromUserName或ToUserName类型。
可能是因为微信的保密原因,FromUserName或ToUserName是以字符串形式给出,不是明文形式。每一次重新扫码登录网页版微信时,同一个朋友的UserName都是不一样的,但是登录后是保持不变的。
3.def get_response(msg): #将微信的消息发给图灵机器人
函数中的KEY就是注册图灵机器人是的apikey。
三、功能讲解
1.通过微信的文件传输助手(filehelper)获取需要自动回复的小伙伴的FromUserName,一般是"@b61d******************************8572f9f"这种格式,再将这个数据发给文件传输助手,文件传输助手将会提示”更新聊天小伙伴成功“。
2.如果需要更换聊天小伙伴,发送“更新”或“更新聊天小伙伴"到文件传输助手,文件传输助手将会提示”更新设置已开启,等待设置新的聊天小伙伴“,这是讲收到的FromUserName(@b61d******************************8572f9f)发给文件传输助手,文件传输助手将提示”更新聊天小伙伴成功“。
3.选择好聊天小伙伴,就可以实现自动回复了
四、程序的测试
本人使用python3.7.4,32位,电脑系统是win10,64位。程序测试有效。
1.开启程序时,第一次选择聊天小伙伴
2. 更新聊天小伙伴
3.和聊天小伙伴的聊天内容,就不截图了,哈哈哈!
五、完整代码如下
#-*- coding:utf-8 -*-
import requests
import itchat
import re
KEY = '850***************2f' #可以到图灵机器人官网申请一个apikey,现在要收费,一个月的费用不高
Target_user = "filehander"
flag = 1
def is_right_id(targe_char, string): # 在字符串string中,查找单个字符targe_char
a = re.search(targe_char, string) # 采用正则表达式查找,如果找到返回True,否则返回False
if a:
return True
else:
return False
def get_response(msg):
apiUrl = 'http://www.tuling123.com/openapi/api'
data = {
'key' : KEY,
'info' : msg,
'userid' : 'wechat-robot',
}
try:
r = requests.post(apiUrl, data=data).json() # 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常
return r.get('text') # 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常
except: # 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
return # 将会返回一个None
@itchat.msg_register(['Text','Map', 'Card', 'Note', 'Sharing', 'Picture', 'Video'])
def tuling_reply(msg):
global Target_user, flag
if flag == 1:
itchat.send("收到的消息:" + msg['Text'] + '\n' + "消息来自:" + msg["FromUserName"], toUserName='filehelper')
if msg["FromUserName"] == Target_user or msg["ToUserName"] == "filehelper":
if is_right_id('@', msg['Content']):
Target_user = msg['Content']
flag = 0
itchat.send("更新聊天小伙伴成功", toUserName='filehelper')
if msg["ToUserName"] == "filehelper" and msg['Content'] == "更新聊天小伙伴" or msg['Content'] == "更新":
flag = 1
itchat.send("更新设置已开启,等待设置新的聊天小伙伴", toUserName='filehelper')
if msg["FromUserName"] == Target_user:
reply = get_response(msg['Text'])
itchat.send(reply, toUserName=Target_user)
itchat.auto_login(hotReload=True)
itchat.run()
六、参考资料
1.itchat——使用python登录网页版微信 2.微信的自动回复&接入聊天机器人