前言:
如今微信已经成为了个人社交的很大一部分,无论生活,学习,还是工作,我们的社交已经离开不了微信~~ 接下来来了解itchat~~
itchat是一个开源的微信个人号api接口,通过使用python调用微信实现简单的微信机器人。
使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。
当然,该api的使用远不止一个机器人,更多的功能等着你来探索…
原理
通过微信的Python接口itchat获取微信消息。
将微信消息传输到机器人接口,获取机器人的返回消息。
将返回消息返回给微信消息的发送人。
实现将微信个人号变为聊天机器人的目的。
安装
方式一:可以通过pip安装itchat:
pip install itchat
方式二: 用pycharm 在"setting"里安装:
判断是否安装成功:
python3 -c "import itchat"
如果没有报错信息说明已经将环境安装完成。
登陆
要通过 itchat 操作微信接收、发送信息等,第一步需要先登陆微信网页版,为此 itchat 提供了 auto_login 方法,调用这个方法就能实现微信登陆
import itchat
from itchat.content import TEXT
@itchat.msg_register(itchat.content.TEXT) # 注册处理文本信息
def print_content(msg): # 通过装饰符将print_content注册为处理文本消息的函数。
print(msg['Text'])
itchat.auto_login() # hotReload=True表示短时间关闭程序后可重连
itchat.run()
微信有各种类型的数据,例如图片、语音、名片、分享等,也对应不同的注册参数:
- 图片对应: itchat.content.PICTURE
- 语音对应: itchat.content.RECORDING
- 名片对应: itchat.content.CARD
- …
执行成功后开始登陆微信,这时会生成一个名为 QR.png 的二维码图片文件,通过扫描这个二维码就可以登陆微信网页版了,这时将会显示如下信息:
Login successfully as 你登陆账号的微信昵称
Start auto replying.
关于登陆:
- itchat提供了登陆状态暂存,关闭程序后一定时间内不需要扫码即可登录。只需要在
auto_login
方法中传入hotReload=True
即可。 - 为了方便在无图形界面使用itchat,程序内置了命令行二维码的显示。只需要在 auto_login 方法中传入
enableCmdQR=True
即可。 - 可以自定义登陆,比如更改提示语、二维码出现后邮件发送等。
自定义登陆所需要的方法,登陆顺序为
- 获取二维码uuid,方法名称:
get_QRuuid
- 获取二维码,方法名称:
get_QR
- 判断是否已经登陆成功,方法名称:
check_login
- 获取初始化数据,方法名称:
web_init
- 更新微信相关信息(通讯录、手机登陆状态),方法名称:
get_friends
、show_mobile_login
- 循环扫描新信息(开启心跳),方法名称:
start_receiving
注册消息方法
itchat 将根据接收到的消息类型寻找对应的已经注册的方法,如果一个消息类型没有对应的注册方法,该消息将会被舍弃,就像我们上面代码只注册了TEXT
类型的消息才会被打印出来。当然在运行过程当中也可以动态注册方法,注册方式与结果不变。
各类型消息的注册
注册消息有两种方法:
- 不带具体对象注册,将注册为普通消息的回复方法
- 带对象参数注册,对应消息对象将调用该方法
实例1:
import itchat
from itchat.content import TEXT
# 不带具体对象注册,将注册为普通消息的回复方法
@itchat.msg_register(TEXT)
def simple_reply(msg):
return 'I received: %s' % msg['Text']
# 带对象参数注册,对应消息对象将调用该方法
@itchat.msg_register(TEXT, isFriendChat=True, isGroupChat=True, isMpChat=False)
def text_reply(msg):
msg.user.send('%s: %s' % (msg.type, msg.text))
itchat.auto_login(hotReload=True)
itchat.run()
实例2:
import itchat, time
from itchat.content import *
@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
msg.user.send('%s: %s' % (msg.type, msg.text))
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
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):
msg.user.verify()
msg.user.send('Nice to meet you!')
@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
if msg.isAt:
msg.user.send(u'@%s\u2005I received: %s' % (
msg.actualNickName, msg.text))
itchat.auto_login(True)
itchat.run(True)
注册消息优先级
多次注册同一类型消息时,遵循以下规则:
- 后注册消息先于先注册消息
- 带参数消息先于不带参数消息
依据这两个规则,上例1代码只执行第二个带参数注册的方法就很正常了,另外 itchat 还支持动态注册消息,一种方法是生成一个守护线程动态注册消息,另一种是使用 configured_reply 方法
消息内容
itchat 支持微信回复的以下几种类型的消息,包括:微信初始化消息、文本消息、图片消息、小视频消息、地理位置消息、名片消息、 语音消息、动画表情、普通链接和应用分享、音乐链接、群消息、红包消息、系统消息。
文本消息
文本消息是最常见的消息,基本格式如下:
MsgType: 1 # 消息类型
FromUserName: 发送方ID
ToUserName: 接收方ID
Content: 消息内容
图片消息
MsgType: 3 # 消息类型
FromUserName: 发送方ID
ToUserName: 接收方ID
MsgId: 用于获取图片
Content:
<msg>
<img length="6503" hdlength="0" />
<commenturl></commenturl>
</msg>
小视频消息
MsgType: 62 # 小视频消息
FromUserName: 发送方ID
ToUserName: 接收方ID
MsgId: 用于获取小视频
Content:
<msg>
<img length="6503" hdlength="0" />
<commenturl></commenturl>
</msg>
…
消息回复
itchat 提供了五种消息回复的方法:
- send方法
import itchat
# 可发送多种类型消息
itchat.send(msg='文本消息', toUserName=None)
itchat.send('@img@%s' % '表情图片.gif')
itchat.send('@fil@%s' % '文件.docx')
itchat.send('@vid@%s' % '测试.mp4')
参数说明:
- msg:消息内容。’@fil@文件地址’将会被识别为传送文件,’@img@图片地址’将会被识别为传送图片,’@vid@视频地址’将会被识别为小视频。
- toUserName:发送对象,如果留空将会发送给自己。
返回值:
- 发送成功:True
- 失败:False
- send_msg方法
send_msg(msg='文本消息', toUserName=None)
参数说明:
- msg:消息内容,仅文本
- toUserName:发送对象,如果留空将会发送给自己
返回值:
- 发送成功:True
- 失败:False
- send_file、send_img、send_video方法
send_file(fileDir, toUserName=None)
send_img(fileDir, toUserName=None)
send_video(fileDir, toUserName=None)
参数说明:
- fileDir:文件路径(不存在该文件时将打印无此文件的提醒)
- toUserName:发送对象,如果留空将会发送给自己
返回值:
- 发送成功:True
- 失败:False
用户搜索 & 账号类型
主要好友、公众号、群聊。itchat 为这三种类型的账号分别提供了整体获取和根据条件搜索的方法
好友
1、好友的获取方法为 get_friends,将会返回完整的好友列表:
- 其中每个好友为一个字典
- 列表的第一项为本人的账号信息
-传入 update 键为 True 将可以更新好友列表并返回
2、好友的搜索方法为 search_friends,目前有如下四种搜索方式:
- 仅获取自己的用户信息
- 获取特定UserName的用户信息
- 获取备注、微信号、昵称中的任何一项等于name键值的用户
- 获取备注、微信号、昵称分别等于相应键值的用户
其中3、4项可以一同使用,示例程序:
# 获取自己的用户信息,返回自己的属性字典
itchat.search_friends()
# 获取特定UserName的用户信息
itchat.search_friends(userName='@abcdefg1234567')
# 获取任何一项等于name键值的用户
itchat.search_friends(name='littlecodersh')
# 获取分别对应相应键值的用户
itchat.search_friends(wechatAccount='littlecodersh')
# 3、4项功能可以一同使用
itchat.search_friends(name='LittleCoder机器人', wechatAccount='littlecodersh')
3、更新用户信息的方法为 update_friend
,该方法需要传入用户的 UserName,返回指定用户的最新信息。当然也可以传入 UserName 组成的列表,那么相应的也会返回指定用户的最新信息组成的列表。
公众号
1、公众号的获取方法为 get_mps,将会返回完整的公众号列表:
- 其中每个公众号为一个字典
- 传入 update 键为 True 将可以更新公众号列表并返回
2、公众号的搜索方法为 search_mps,有两种搜索方法:
- 获取特定 UserName 的公众号:search_mps(userName=‘公众号名’)
- 获取名字中含有特定字符的公众号,返回值为一个字典的列表:search_mps(name=‘littleboy’)
群聊
1、群聊的获取方法为 get_chatrooms,将会返回完整的群聊列表:
- 其中每个群聊为一个字典
- 传入 update 键为 True 将可以更新群聊列表并返回通讯录中保存的群聊列表
- 群聊列表为后台自动更新,如果中途意外退出存在极小的概率产生本地群聊消息与后台不同步
- 为了保证群聊信息在热启动中可以被正确的加载,即使不需要持续在线的程序也需要运行 itchat.run()
- 如果不想要运行上述命令,请在退出程序前调用 itchat.dump_login_status(),更新热拔插需要的信息
2、群聊的搜索方法为 search_chatrooms,有两种搜索方法,分别是通过传参 userName 和 name 进行搜索,方式同公众号搜索相似。
3、群聊用户列表的获取方法为 update_chatroom,同时需要关注以下几点:
- 如果想要更新该群聊的其他信息也可以用该方法
- 群聊在首次获取中不会获取群聊的用户列表,所以需要调用该命令才能获取群聊的成员
- 该方法需要传入群聊的 UserName,返回特定群聊的详细信息
- 同样也可以传入 UserName 组成的列表,那么相应的也会返回指定用户的最新信息组成的列表
4、创建、增加、删除群聊用户的方法:
memberList = itchat.get_friends()[1:]
# 创建群聊,topic键值为群聊名
chatroomName = itchat.create_chatroom(memberList, '测试群聊')
# 删除群聊内的群友
itchat.delete_member_from_chatroom(chatroomName, memberList[0])
# 增加好友进入群聊
itchat.add_member_into_chatroom(chatroomName, memberList[0], useInvitation=False)
命令行二维码
通过以下命令可以在登陆的时候使用命令行显示二维码:
itchat.auto_login(enableCmdQR=True)
可以通过将enableCmdQR赋值为特定的倍数进行调整:
itchat.auto_login(enableCmdQR=2)
默认控制台背景色为暗色(黑色),若背景色为浅色(白色),可以将enableCmdQR
赋值为负值:
itchat.auto_login(enableCmdQR=-1)
退出程序后暂存登陆状态
过如下命令登陆,即使程序关闭,一定时间内重新开启也可以不用重新扫码。类似于休眠
通
itchat.auto_login(hotReload=True)
附件的下载与发送
itchat的附件下载方法存储在msg的Text键中。
发送的文件的文件名(图片给出的默认文件名)都存储在msg的FileName键中。
下载方法接受一个可用的位置参数(包括文件名),并将文件相应的存储。
如下:
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
msg.download(msg.fileName)
itchat.send('@%s@%s' % (
'img' if msg['Type'] == 'Picture' else 'fil', msg['FileName']),
msg['FromUserName'])
return '%s received' % msg['Type']
#如果你不需要下载到本地,仅想要读取二进制串进行进一步处理可以不传入参数,方法将会返回图片的二进制串。
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
with open(msg.fileName, 'wb') as f:
f.write(msg.download())
用户多开
可以完成类似于微信多开的操作:
import itchat
newInstance = itchat.new_instance()
newInstance.auto_login(hotReload=True, statusStorageDir='newInstance.pkl')
@newInstance.msg_register(TEXT)
def reply(msg):
return msg.text
newInstance.run()
退出及登陆完成后调用特定方法
登陆完成后的方法需要赋值在loginCallback
中。而退出后的方法需要赋值在exitCallback
中。
import time
import itchat
def lc():
print('finish login')
def ec():
print('exit')
itchat.auto_login(loginCallback=lc, exitCallback=ec) #若不设置loginCallback的值,则将会自动删除二维码图片并清空命令行显示
time.sleep(3)
itchat.logout()
itchat实现与图灵机器人的交互
实现原理: 使用他人提供的接口实现
具体: 图灵机器人就是以一定的规则给图灵的服务器发送数据包(包含你对他说的话),图灵的服务器会以一定的规则给你返回数据包(包含他回复你的话),而你需要一个Tuling Key来告诉图灵服务器你有权和他对话,这里是官方免费提供的一些:
8edce3ce905a4c1dbb965e6b35c3834d
eb720a8970964f3f855d863d24406576
1107d5601866433dba9599fac1bc0083
71f28bf79c820df10d39b4074345ef8c
关于图灵机器人
图灵机器人API是在人工智能的核心能力(包括语义理解、智能问答、场景交互、知识管理等)的基础上,为广大开发者、合作伙伴和企业提供的一系列基于云计算和大数据平台的在线服务和开发接口。
开发者可以利用图灵机器人的API创建各种在线服务,灵活定义机器人的属性、编辑机器人的智能问答内容,打造个人专属智能交互机器人,也支持多渠道(微信公众平台、QQ聊天)的快速接入。
使用介绍:图灵机器人 回归正题
配置图灵机器人的简单介绍
发送的规则如下实例:
{
'key' : 'TULING_KEY',
'info' : 'YOUR_MSG',
'userid' : 'USERID',
}
其中userId
是用户的标志,让机器人知道你是你,他是他。(也就是说一个Tuling Key可以有多个用户)
而返回的内容基本是这样的:
{
'code': 0,
'text': 'RETURN_MSG',
}
实例:
#coding=utf8
import requests
apiUrl = 'http://www.tuling123.com/openapi/api'
data = {
'key' : '8edce3ce905a4c1dbb965e6b35c3834d', # 如果这个Tuling Key不能用,那就换一个
'info' : 'hello', # 这是我们发出去的消息
'userid' : 'wechat-robot', # 用户id 可以修改
}
# 通过如下命令发送一个post请求
r = requests.post(apiUrl, data=data).json()
# 让我们打印一下返回的值,看一下我们拿到了什么
print(r)
打印结果:
这时候可以看到他回复了:你好
原理步骤
- 接收我们要发送给图灵的消息
- 返回图灵返回给我们的消息。
- 再将与图灵交互并返回图灵返回结果的操作写成函数并在itchat中注册。
完整程序
# coding=utf8
import requests
import itchat
KEY = '8edce3ce905a4c1dbb965e6b35c3834d'
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捕获异常来为了防止服务器没有正常响应导致程序异常退出,
如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
'''
except:
# 将会返回一个None
return
# 注册方法
@itchat.msg_register(itchat.content.TEXT)
def tuling_reply(msg):
# 为了保证在图灵Key出现问题的时候仍旧可以回复,这里设置一个默认回复
defaultReply = 'I received: ' + msg['Text']
# 如果图灵Key出现问题,那么reply将会是None
reply = get_response(msg['Text'])
return reply or defaultReply
# 为了让实验过程不用多次扫码更加方便,使用热启动
itchat.auto_login(hotReload=True)
itchat.run()