Python库:itchat的⽤法详解
在论坛上看到了⽤Python登录并实现⾃动签到,才了解到⼀个新的Python库: itchat
库⽂档说明链接在这:
我存个档在我⽹站(主要是我打开很慢),以便以后阅读。
0x01 Start
最简单的回复
通过如下代码,可以完成回复所有⽂本信息(包括聊)。
import itchat
t import TEXT
@itchat.msg_register
def simple_reply(msg):
if msg['Type'] == TEXT:
return 'I received: %s' % msg['Content']
itchat.auto_login()
itchat.run()
常⽤消息的配置
itchat⽀持所有的消息类型与聊,下⾯的⽰例中演⽰了对于这些消息类型简单的配置。
#coding=utf8
import itchat
t import *
@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])
# 以下四类的消息的Text键下存放了⽤于下载消息内容的⽅法,传⼊⽂件地址即可
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
msg['Text'](msg['FileName'])
return '@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName'])
# 收到好友邀请⾃动添加好友
@itchat.msg_register(FRIENDS)
def add_friend(msg):
itchat.add_friend(**msg['Text']) # 该操作会⾃动将新好友的消息录⼊,不需要重载通讯录
itchat.send_msg('Nice to meet you!', msg['RecommendInfo']['UserName'])
# 在注册时增加isGroupChat=True将判定为聊回复
@itchat.msg_register(TEXT, isGroupChat = True)
def groupchat_reply(msg):
if msg['isAt']:
itchat.send(u'@%s\u2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName'])
itchat.auto_login(True)
itchat.run()
当然这⾥不需要深究为什么这些东西可以这么写,我在这⾥放出了⽰例程序只是为了给你⼀个该sdk相关代码⼤概样⼦的概念。
有了⼤概的模式的了解之后我们就可以进⼊下⼀部分的介绍。
0x02 Login
在上⼀部分中你看到了基本的注册与登陆,⽽显然登陆使⽤的是itchat提供了auto_login⽅法,调⽤即可完成登录。
⼀般⽽⾔,我们都会在完成消息的注册后登陆。
当然这⾥需要特别强调的是三点,分别是短时间关闭重连、命令⾏⼆维码与⾃定义登陆内容。 itchat提供了登陆状态暂存,关闭程序后⼀定时间内不需要扫码即可登录。为了⽅便在⽆图形界⾯使⽤itchat,程序内置了命令⾏⼆维码的显⽰。 * 如果你需
要就登录状态就⼀些修改(例如更改提⽰语、⼆维码出现后邮件发送等)。
**0x01-1 短时间关闭程序后重连**
这样即使程序关闭,⼀定时间内重新开启也可以不⽤重新扫码。
最简单的⽤法就是给 auto_login ⽅法传⼊值为真的 hotReload 。
该⽅法会⽣成⼀个静态⽂件 itchat.pkl ,⽤于存储登陆的状态。
import itchat
t import TEXT
@itchat.msg_register(TEXT)
def simple_reply(msg):
print(msg['Text'])
itchat.auto_login(hotReload=True)
itchat.run()
itchat.dump_login_status()
通过设置statusStorageDir可以将静态⽂件指定为其他的值。
这⼀内置选项其实就相当于使⽤了以下两个函数的这⼀段程序:
import itchat
t import TEXT
if itchat.load_login_status():
@itchat.msg_register(TEXT)
def simple_reply(msg):
print(msg['Text'])
itchat.run()
itchat.dump_login_status()
else:
itchat.auto_login()
itchat.dump_login_status()
print('Config stored, so exit.')
其中load_login_status与dump_login_status分别对应读取与导出设置。
通过设置传⼊的fileDir的值可以设定导⼊导出的⽂件。
**0x01-2 命令⾏⼆维码显⽰**
通过以下命令可以在登陆的时候使⽤命令⾏显⽰⼆维码:
itchat.auto_login(enableCmdQR=True)
部分系统可能字幅宽度有出⼊,可以通过将enableCmdQR赋值为特定的倍数进⾏调整:
# 如部分的linux系统,块字符的宽度为⼀个字符(正常应为两字符),故赋值为2
itchat.auto_login(enableCmdQR=2)
默认控制台背景⾊为暗⾊(⿊⾊),若背景⾊为浅⾊(⽩⾊),可以将enableCmdQR赋值为负值:
itchat.auto_login(enableCmdQR=-1)
**0x01-2 ⾃定义登录过程**
如果需要控制登录的过程,可以阅读下⾯的内容。
同时itchat也提供了登陆所需的每⼀步的⽅法,登陆的过程按顺序为:获取⼆维码uuid->获取⼆维码->判断是否已经登陆成功->获取初始化数据->更新相关信息(通讯录、⼿机登陆状态)->循环扫描新信息(开启⼼跳)
获取⼆维码uuid
获取⽣成⼆维码所需的uuid,并返回。
⽅法名称: get_QRuuid
所需值:⽆
返回值:成功->uuid,失败->None
获取⼆维码
根据uuid获取⼆维码并打开,返回是否成功。
⽅法名称: get_QR
所需值:uuid
返回值:成功->True,失败->False
判断是否已经登陆成功
判断是否已经登陆成功,返回扫描的状态码。
⽅法名称: check_login
所需值:uuid
返回值:登陆成功->'200',已扫描⼆维码->'201',⼆维码失效->'408',未获取到信息->'0'获取初始化数据
获取⽤户信息以及⼼跳所需要的数据。
⽅法名称: web_init
所需值:⽆
返回值:存储登录⽤户信息的字典
获取通讯录
获取的所有好友信息并更新。
⽅法名称: get_contract
所需值:⽆
返回值:存储好友信息的列表
更新⼿机登陆状态
在⼿机上显⽰登录状态。
⽅法名称: show_mobile_login
所需值:⽆
返回值:⽆
循环扫描新信息(开启⼼跳)
循环扫描是否有新的消息,开启⼼跳包。
⽅法名称: start_receiving
所需值:⽆
返回值:⽆
EG:
⼀个登录例⼦:
import itchat, time, sys
def output_info(msg):
print('[INFO] %s' % msg)
def open_QR():
for get_count in range(10):
output_info('Getting uuid')
uuid = _QRuuid()
while uuid is None: uuid = _QRuuid();time.sleep(1)
output_info('Getting QR Code')
_QR(uuid): break
elif get_count >= 9:
output_info('Failed to get QR Code, please restart the program')
output_info('Please scan the QR Code')
return uuid
uuid = open_QR()
waitForConfirm = False
while 1:
status = itchat.check_login(uuid)
if status == '200':
break
elif status == '201':
if waitForConfirm:
output_info('Please press confirm')
waitForConfirm = True
elif status == '408':
output_info('Reloading QR Code')
uuid = open_QR()
waitForConfirm = False
userInfo = itchat.web_init()
状态背景图更改itchat.show_mobile_login()
<_contract()
output_info('Login successfully as %s'%userInfo['NickName'])
itchat.start_receiving()
# Start auto-replying
@itchat.msg_register
def simple_reply(msg):
if msg['Type'] == 'Text':
return 'I received: %s' % msg['Content']
itchat.run()
0x03 Register
注册消息⽅法
itchat将根据接收到的消息类型寻对应的已经注册的⽅法。如果⼀个消息类型没有对应的注册⽅法,该消息将会被舍弃。在运⾏过程当中也可以动态注册⽅法,注册⽅式与结果不变。注册
你可以通过两种⽅式注册消息⽅法
import itchat
t import *
# 不带参数注册,所有消息类型都将调⽤该⽅法(包括消息)
@itchat.msg_register
def simple_reply(msg):
if msg['Type'] == 'Text':
return 'I received: %s' % msg['Text']
# 带参数注册,该类消息类型将调⽤该⽅法
@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])消息类型
向注册⽅法传⼊的msg包含返回的字典的所有内容。
本api增加Text、Type(也就是参数)键值,⽅便操作。t中包含所有的消息类型参数,内容如下表所⽰:
⽐如你需要存储发送给你的附件:
@itchat.msg_register(ATTACHMENT)
def download_files(msg):
msg['Text'](msg['FileName'])
值得注意的是,消息增加了三个键值: isAt: 判断是否@本号 ActualNickName: 实际NickName * Content: 实际Content 可以通过本程序测试:
import itchat
t import TEXT
@itchat.msg_register(TEXT, isGroupChat = True)
def text_reply(msg):
print(msg['isAt'])
print(msg['ActualNickName'])
print(msg['Content'])
itchat.auto_login()
itchat.run()
注册消息的优先级
优先级分别为:后注册消息先于先注册消息,带参数消息先于不带参数消息。
以下⾯的两个程序为例:
import itchat
t import *
itchat.auto_login()
@itchat.msg_register(TEXT)
def text_reply(msg):
return 'This is the old register'
@itchat.msg_register(TEXT)
def text_reply(msg):
return 'This is a new one'
itchat.run()
在私聊发送⽂本时将会回复This is a new one。
import itchat
t import *
itchat.auto_login()