前几天有人问我,你的微信是不是背盗号了,其实我是在测试聊天机器人
今天讲一下如何使用itchat来写一个机器人
python3.x
我这里使用了 PyCharm 进行开发和测试
tchat是一个开源的微信个人号接口,使用python调用微信从未如此简单
使用它可以方便的完成 回复消息、搜索好友、被添加自动回复、获取好友信息等功能,当然功能不止于这些,这里我们用到了回复信息功能
官网:https://itchat.readthedocs.io/zh/latest/
首先你需要安装
pip install itchat
来看个例子
给文件传输助手发一条信息
import itchat
itchat.auto_login()
itchat.send('Hello, filehelper', toUserName='filehelper')
当你运行这段代码的时候,会弹出一个二维码,需要手机微信进行扫码登录,登录成功之后,下一句会向文件助手发送一条消息,同时你的手机上方应该会显示“网页微信已经登录”
这样我们就可以给指定用户发送消息了
退出程序后暂存登陆状态通过如下命令登陆,即使程序关闭,一定时间内重新开启也可以不用重新扫码。
itchat.auto_login(hotReload=True)
添加自动回复
import itchat
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
return msg.text
itchat.auto_login()
itchat.run()
通过装饰器,可以提供消息注册的功能,如果接收到消息会运行 text_reply
方法,其中 itchat.content.TEXT
表示是文本类型,该方法会将发送者消息原样发给原发送者,这样就可以完成自动回复的功能,但是这时我们回复的相同文本,能不能差异化呢?
智能回复
在上面我们已经可以将消息原样发给发送者,那么想自动回复应该怎么做呢?
官网:http://www.tuling123.com/
进入官网注册用户并添加一个机器人
添加之后,下面会显示 apikey 同时把密钥关闭
安装 requests
pip install requests
tuling.py
import requests
default_api_key = '6f4056d2eaef43sdr889aa3e157f228e1'
def send(user_id, input_text, api_key=None):
if not api_key:
api_key = default_api_key
msg = {
"reqType": 0,
"perception": {
"inputText": {
"text": input_text
},
"selfInfo": {
"location": {
"city": "北京",
"province": "北京",
}
}
},
"userInfo": {
"apiKey": api_key,
"userId": user_id
}
}
return requests.post('http://openapi.tuling123.com/openapi/api/v2',json=msg).json()
其中使用 http 请求发送请求内容到图灵,其中 user_id 是传给为了区别不同的用户,最大长度为32位, selfInfo
是添加用户的一下个人信息,比如地点,这样可以为你搜索一下周边信息,例如美食、酒店 userInfo
需要传入一下授权,里面包含 apiKey
具体参数见:https://www.kancloud.cn/turing/www-tuling123-com/718218
安装 redis
pip install redis
redism.py
import redis
pool = None
def get_connection():
global pool
if not pool:
pool = redis.ConnectionPool(host=host,
port=port,
password=password,
max_connections=10,
decode_responses=True)
return redis.Redis(connection_pool=pool)
wechat.py
import itchat
import tuling
import time
import redism
from itchat.content import TEXT, MAP, CARD, NOTE, SHARING, ATTACHMENT, VIDEO, RECORDING, PICTURE, FRIENDS
__author__ = '张瑀楠'
__mail__ = 'zyndev@gmail.com'
@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
'''
用户消息回复
使用机器人回复用户信息,并将用户信息添加到redis进行缓存
:param msg: 消息体
'''
api_key = None
if msg.user.get('RemarkName', None):
# 判断下这个用户是否在你需要忽略的人中,比如你的老板
if msg.user.RemarkName in redism.get_connection().smembers('wechat:ignore'):
return None
# 你可以为不同的人指定不同的api_key,因为图灵机器人是可以设置年龄的,这样可以做到为她专属一个机器人
if msg.user.RemarkName == '她':
api_key = 'f271e04ffa5c44c0ae4f0e'
# 将消息内容保存下来,方便做统计分析使用
redism.get_connection().set(f'wechat:user:{msg.get("ToUserName")}', msg.user.get('RemarkName', 'unknow'))
# 因为图灵的user_id 为32位,而微信的 userName 很长,这里截取一下
req = tuling.send(msg.FromUserName[1: 32], msg.text, api_key)
redism.get_connection().set(f'wechat:msg:{msg.get("ToUserName")}:{msg.MsgId}', msg.text)
print(req.get('results'))
# 发送文本内容
for result in req.get('results'):
msg.user.send(result.get('values').get(result.get('resultType')))
redism.get_connection().set(f'wechat:msgr:{msg.get("ToUserName")}:{msg.MsgId}:',
result.get('values').get(result.get('resultType')))
@itchat.msg_register([PICTURE])
def download_files(msg):
msg.download(msg.fileName)
typeSymbol = {
PICTURE: 'img',
VIDEO: 'vid', }.get(msg.type, 'fil')
return '@%s@%s' % (typeSymbol, msg.fileName)
@itchat.msg_register(FRIENDS)
def add_friend(msg):
'''
用户添加
:param msg: 消息体
'''
msg.user.verify()
msg.user.send('Nice to meet you!')
@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
'''
群组消息回复
:param msg: 消息参数
'''
if msg.user.NickName in redism.get_connection().smembers('wechat:group'):
req = tuling.send(msg.FromUserName[2: 32], msg.text)
print(req.get('results'))
for result in req.get('results'):
msg.user.send(result.get('values').get('text'))
def main():
time.sleep(2)
itchat.auto_login(hotReload=True, exitCallback=main)
itchat.run(True)
pass
if '__main__' == __name__:
main()