概述 ntwork 开源框架

ItChat 是一个基于 Python 的微信个人号接口库。它通过封装微信 API,使得开发者可以使用 Python 来方便地与微信进行交互,实现一系列微信相关的功能。这些功能包括但不限于发送和接收消息、获取好友列表和详细信息、以及进行群聊操作等。ItChat 提供了一套简洁而强大的 API,让开发者能够轻松地在 Python 中执行微信相关的操作。

ItChat 支持 Python 2.x 和 3.x 版本,并且可以在多个操作系统平台上运行,包括 Windows、Mac 和 Linux 等。这使得开发者可以根据自己的需求和环境选择适合的 Python 版本和操作系统。

ItCha t的入门使用相对简单。首先,你需要通过 pip 命令安装 ItChat 库。安装完成后,你可以通过引入 ItChat 模块,并调用其提供的函数来实现所需的功能。例如,你可以使用 ItChat 的 login() 函数来扫码登录微信,然后使用 get_friends() 函数来获取好友列表和详细信息。此外 ItChat 还提供了发送消息、注册消息回复等功能,使开发者能够根据自己的需求定制微信机器人的行为。

ItChat 不仅是一个功能强大的工具,也是一个开源项目,这意味着开发者可以根据自己的需求对其进行扩展和定制。通过 ItChat,你可以开发出各种有趣的微信应用,如自动回复消息、数据采集、搭建微信聊天机器人等。

框架 API 文档:https://itchat.readthedocs.io/zh/latest/api/

下载安装 itchat 库

使用 pip 进行安装下载 itchat 库

pip install itchat

清华大学开源软件镜像站

使用如下命令配置 pip 使用清华大学的镜像源:

pip install itchat -i https://pypi.tuna.tsinghua.edu.cn/simple

如果永久设置这个镜像源,可以创建一个 pip 配置文件(例如:~/.pip/pip.conf)并添加如下内容:

[global]  
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

itchat 登录异常解决方案

import itchat

itchat.auto_login()

运行测试结果

Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Traceback (most recent call last):
······
xml.parsers.expat.ExpatError: mismatched tag: line 64, column 4

异常解决方案:更新 itchat 库

itchat 库 zip 压缩包链接 https://download.csdn.net/download/qq_47452807/89129949?spm=1001.2014.3001.5503

点击 立即下载 下载新的 itchat 库 zip 压缩包

在这里插入图片描述
解压缩 > itchat 文件夹

在这里插入图片描述
进行 site-packages 替换 itchat 原库文件夹

在这里插入图片描述

重新运行测试

Ready to login.
Getting uuid of QR code.
Downloading QR code.
Please press confirm on your phone.
Loading the contact, this may take a little while.
Login successfully as 一语中的
Start auto replying.

itchat 协议说明

特别注意:使用itchat或其他类似工具进行微信操作需要遵守微信的使用协议和相关法律法规,不得用于非法或恶意目的。同时,由于微信的协议和接口可能随时变化,使用 itchat 等第三方工具时需要注意及时更新和适配。

现在注册的微信已经禁止网页版登陆了,itchat 是基于 web 协议,如果你的微信是 2017 年之后的,或者未进行实名认证的微信号,可能会遇到登录失败的报错。请选择合理的微信号进行登录。

给文件传输助手发信息

import itchat

itchat.auto_login()
itchat.send('Hello, filehelper', toUserName='filehelper')

运行结果:

在这里插入图片描述

自动回复文本消息

自动回复文本消息

import itchat
from itchat.content import *

@itchat.msg_register(TEXT)
def text_reply(msg):
    return msg.text

itchat.auto_login()
itchat.run()

函数说明:

开启一个消息注册器监听来自用户私信的文本类型消息,自动回复用户私信发送消息的内容(文本消息)

测试结果

在这里插入图片描述

自动回复群消息

开启一个消息注册器监听来自群的文本类型消息。当收到一个来自微信群的文本消息时,请调用定义的处理函数,实现自动回复。

import itchat
from itchat.content import *

@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
    if msg.isAt:
        msg.user.send(u'@%s I received: %s' % (msg.actualNickName, msg.text))

itchat.auto_login()
itchat.run()

itchat.msg_register 这是 itchat 库中的一个函数,用于注册消息处理函数。当你收到微信消息时,itchat会根据你的注册情况调用相应的处理函数。

TEXT 这是一个常量,代表文本消息类型。当itchat收到一个文本消息时,它会检查是否有为这个类型注册的处理函数。

isGroupChat=True 这是一个参数,用于指定这个函数只处理来自微信群的文本消息,而不是来自好友或公众号等其他来源的消息。

运行结果:

在这里插入图片描述

itchat 消息类型

消息注册器消息类型:itchat.content

TEXT       = 'Text'
MAP        = 'Map'
CARD       = 'Card'
NOTE       = 'Note'
SHARING    = 'Sharing'
PICTURE    = 'Picture'
RECORDING  = VOICE = 'Recording'
ATTACHMENT = 'Attachment'
VIDEO      = 'Video'
FRIENDS    = 'Friends'
SYSTEM     = 'System'

获取 uuid 账号标识

如何要进行登录你需要先得到一个 uuid,当下载 QRcode 需要传递 uuid 生成二维码,为了检查登录状态,还需要 uuid 判断当前用户。

import itchat

uuid = itchat.get_QRuuid()

控制台登录二维码显示

通过以下命令可以在登陆的时候使用命令行显示二维码:

itchat.auto_login(enableCmdQR=True)

部分系统可能字幅宽度有不同,可以通过将enableCmdQR赋值为特定的倍数进行调整:

itchat.auto_login(enableCmdQR=2)

注意:部分 linux 系统,块字符的宽度为一个字符(正常应为两字符)故赋值为 2

默认控制台背景色是暗色(黑色)。若背景色是浅色(白色)将 enableCmdQR 赋值为负值:

itchat.auto_login(enableCmdQR=-1)

二维码图片显示

itchat 库提供了 get_QR 函数用于下载显示二维码。

def get_QR(self, uuid=None, enableCmdQR=False, picDir=None, qrCallback=None):
    ''' download and show qrcode

获取登录二维码并且显示

import itchat

uuid = itchat.get_QRuuid()
itchat.get_QR(uuid)

注意:执行 itchat.auto_login() 自动登录功能生成二维码进行预览显示。

检测登录状态

输出当前微信登陆状态的状态码

import itchat

uuid = itchat.get_QRuuid()
status_code = itchat.check_login(uuid)
print(status_code)

如果未设置 uuid 则将使用您获取的最新 uuid:

import itchat

status_code = itchat.check_login()
print(status_code)

状态码说明

- 200: 登陆成功
- 201: 等待客户端确认登陆
- 408: uuid 超时
- 0  : 异常报错

主动退出登陆

import itchat

itchat.auto_login()

time.sleep(10)

item

退出程序暂存登陆状态

通过如下命令登陆,即使程序关闭,一定时间内重新开启也可以不用重新扫码。

import itchat

itchat.auto_login(hotReload=True)

保存登陆数据 itchat.pkl

pickle 数据格式说明

pkl 是 Python 编程语言中的一种数据序列化文件格式,其全称是 pickle。这种格式可以将 Python 中的任意对象转换为一种可以保存到磁盘上或通过网络传输的格式,然后再将这些对象从磁盘上读取出来或者从网络上接收过来,重新还原为原来的 Python 对象。这种能力使得 pkl 格式文件在 Python 编程中非常有用,尤其是在需要保存和加载复杂数据结构或自定义对象时。

具体来说 pkl 文件是以二进制格式保存的,它包含了对象的状态信息,包括对象的数据和方法。这种存储方式可以将Python项目过程中用到的一些暂时变量、或者需要提取、暂存的字符串、列表、字典等数据保存起来,然后在需要使用的时候再进行加载。

在 Python 中 pickle 模块提供了 dump()load() 函数,用于将 Python 对象保存到 pkl 文件和从 pkl 文件加载对象到内存中。使用这些函数,可以方便地实现 Python 对象的序列化和反序列化,从而实现数据的持久化存储和传输。

需要注意的是,由于pkl文件是以二进制格式保存的,因此在不同的操作系统或Python版本之间可能会出现兼容性问题。此外,在处理来自不可信来源的pkl文件时也需要格外小心,因为加载恶意构造的pkl文件可能会导致安全问题。

存储登陆数据

import itchat
itchat.auto_login(hotReload=True)


itchat.dump_login_status("itchat.pkl")

加载登陆数据

import itchat

itchat.load_login_status("itchat.pkl")

注意:itchat.pkl 存储了例如联系人数据、群组数据、个人信息数据······

获取联系人数据

获取当前登陆微信下全部联系人数据(本地数据 / 实时数据)

get_friends 函数

def get_friends(self, update=False):

特别注意:如果不设置 update 获取是本地 local 数据(itchat.pkl 数据)

读取实时数据:读取当前登陆态数据

import itchat
itchat.auto_login(hotReload=True)

friendList = itchat.get_friends(update=True)

for friend in friendList:
    print(friend)

读取本地数据:不登录也同样可以读取数据(itchat.pkl 数据加载)

import itchat

itchat.load_login_status("itchat.pkl")
friendList = itchat.get_friends(update=False)

for friend in friendList:
    print(friend)

我们没有进行 itchat 扫描登陆操作,通过加载 itchat.pkl 登陆数据,同样查询到联系人数据。

查询联系人用户数据

使用 search_friends 方法可以搜索用户

1. 仅获取自己的用户信息。
2. 获取特定 UserName 的用户信息。
3. 获取备注、微信号、昵称中的任何一项等于 name 键值的用户。
4. 获取备注、微信号、昵称分别等于相应键值的用户。
5. ······

函数体说明

def search_friends(self, name=None, userName=None, remarkName=None, nickName=None, wechatAccount=None):

案例说明

获取自己的用户信息,返回自己的属性字典

itchat.search_friends()

获取特定 UserName 的用户信息

itchat.search_friends(userName='@abcdefg1234567')

获取任何一项等于 name 键值的用户

itchat.search_friends(name='littlecodersh')

获取分别对应相应键值的用户

itchat.search_friends(wechatAccount='littlecodersh')

组合查询

itchat.search_friends(name='LittleCoder机器人', wechatAccount='littlecodersh')

wechatAccount 安全性特别说明

由于腾讯考虑安全性问题,更新了 web 端安全信息保护机制。目前来说,微信网页端已经无法获取用户微信账号 wechatAccount 属性。所以 itchat.search_friends(wechatAccount=‘littlecodersh’) 查询都是为 [] 空。

用户属性案例说明

查询指定 userName 用户信息

import itchat
itchat.auto_login(hotReload=True)

friends = itchat.search_friends(userName='@16b071aa1a7c5b67b0c7911ede8cc53db5bd0c4d63f059142be7a5d6168ff074')
print(friends[0])

查询昵称 ‘番茄土豆’ 用户信息(相较于 userName 来说 nickName 更方便使用)

import itchat
itchat.auto_login(hotReload=True)

friends = itchat.search_friends(nickName='番茄土豆')
print(friends[0])

数据格式说明

'MemberList': '<ContactList: []>',  
'Uin': 0,  
'UserName': '@16b071aa1a7c5b67b0c7911ede8cc53db5bd0c4d63f059142be7a5d6168ff074',  
'NickName': '番茄土豆',  
'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=768678887&username=@16b071aa1a7c5b67b0c7911ede8cc53db5bd0c4d63f059142be7a5d6168ff074&skey=@crypt_13d84e54_651a5a10883168912a00eb384261832c',  
'ContactFlag': 3,  
'MemberCount': 0,  
'RemarkName': '',  
'HideInputBarFlag': 0,  
'Sex': 0,  
'Signature': '',  
'VerifyFlag': 0,  
'OwnerUin': 0,  
'PYInitial': 'PJTD',  
'PYQuanPin': 'panjiatudou',  
'RemarkPYInitial': '',  
'RemarkPYQuanPin': '',  
'StarFriend': 0,  
'AppAccountFlag': 0,  
'Statues': 0,  
'AttrStatus': 102437,  
'Province': '',  
'City': '',  
'Alias': '',  
'SnsFlag': 1,  
'UniFriend': 0,  
'DisplayName': '',  
'ChatRoomId': 0,  
'KeyWord': '',  
'EncryChatRoomId': '',  
'IsOwner': 0  

设置联系人置顶

在 itchat 的早期版本中,set_pinned 方法用来设置某个微信好友为置顶好友的。但是,由于微信官方接口的变化,这个方法现在可能已经无法使用了。

查询昵称:番茄土豆的联系人设置置顶操作

import itchat
itchat.auto_login(hotReload=True)


friend_list = itchat.search_friends(nickName='番茄土豆')

if friend_list:
    contact = friend_list[0]
    userName = contact.UserName
    baseResponse = itchat.set_pinned(userName=userName, isPinned=True)
    if baseResponse['BaseResponse']['Ret'] == 0:
        print("success")
    else:
        print("fail")

baseResponse 属性

{'BaseResponse': {'Ret': 0, 'ErrMsg': '请求成功', 'RawMsg': '请求成功'}}

资源上传案例

进行资源文件上传微信服务器获取媒体 ID 即 MediaId。

def upload_file(self, fileDir, isPicture=False, isVideo=False, toUserName='filehelper', file_=None, preparedFile=None):

上传图片资源类型案例

import itchat  
  
itchat.auto_login(hotReload=True)  
  
baseResponse = itchat.upload_file('image.jpg', isPicture=True)

if baseResponse['BaseResponse']['Ret'] == 0:
    MediaId = baseResponse['MediaId']
    print("success")
else:
    print("fail")

baseResponse

{'BaseResponse': {'Ret': 0, 'ErrMsg': '请求成功', 'RawMsg': '请求成功'}, 'MediaId': '@crypt_e4c0786c_eb0f1099f841e1f83929986d0cf72492fce0876379a21067dc3b8f5fcbcb2bde100a639cf8abb8e6b54b74305187c3bf9ef4dfa1a71d5e255c114b90f27b44aa7c32d4770a79308c1c562a562872afec89d2ed2ce6762de846161b1f3958bdd0681477e152e1f49bcd32c1d36bcabf85b43b5a5ba641d78ccd7bd3aef24a045763d8015b7c980a65663f190b4787f50c2230f67064e9e1ac62382e0a69e91693f347643103e9283742a0ffe9ca4cf3bc080da5c9dd9d5acda2eb4874c56960c6837380e27968593474be01ddc1a633326d8e74c09651b3255026fe665084a5dbca8e29bacc70e84d08e5dec6e74f95fc224251d55ae7f832fe25580d3fa086c1b099d0c2d180fa6615b478eb0e09af6e91cc8b0ff4571f928593c0d68e6be951', 'StartPos': 54082, 'CDNThumbImgHeight': 100, 'CDNThumbImgWidth': 100, 'EncryFileName': 'image%2Ejpg'}

上传视频资源类型案例

import itchat  
  
itchat.auto_login(hotReload=True)  
  
baseResponse = itchat.upload_file('video.mp4', isVideo=True)

print(baseResponse)

if baseResponse['BaseResponse']['Ret'] == 0:
    MediaId = baseResponse['MediaId']
    print("success")
else:
    print("fail")

发送图片类型消息

send_image 函数:发送指定用户指定图片类型

def send_image(self, fileDir=None, toUserName=None, mediaId=None, file_=None):

函数说明:

属性 toUserName:指定所需要发送给他(她)图片的用户。

属性 fileDir:	文件地址,默认情况下 send_image 会先把本地图片资源上传到微信服务器,然后进行发送图片。

属性 mediaId:	媒体 Id,通过 itchat.upload_file 获取,若配置了,就不会重复加载本地资源,先上传微信服务器,然后再进行发送,而是直接从微信服务器进行读取,然后进行发送图片。
 
属性 file_:		指定file 对象。配置打开状态下 file 对象(with open ··· 打开)。

查询昵称 番茄土豆 联系人发送 image.jpg 图片

import itchat
itchat.auto_login(hotReload=True)


itchat.dump_login_status("itchat.pkl")

friend_list = itchat.search_friends(nickName='番茄土豆')
if friend_list:
    friend = friend_list[0]
    baseResponse = itchat.send_image(fileDir="image.jpg", toUserName=friend.UserName)
    if baseResponse['BaseResponse']['Ret'] == 0:
        print("success")
    else:
        print("fail")

运行结果

在这里插入图片描述

文件错误 baseResponse 常见报错

{‘BaseResponse’: {‘ErrMsg’: ‘文件位置错误’, ‘Ret’: -1002, ‘RawMsg’: ‘No file found in specific dir’}}

配置 MediaId 进行发送图片(案例实验)

准备两张相同大小、相同分辨率、相同文件类型的图片 image1.jpg、image2.jpg(可以随便找张图片复制一个副本进行实验)

import time
import itchat

itchat.auto_login(hotReload=True)


itchat.dump_login_status("itchat.pkl")

friend_list = itchat.search_friends(nickName='夜雨星空')
if friend_list:
    friend = friend_list[0]

    start_time = time.time()
    print("第 1 次开始时间:", start_time)
    baseResponse = itchat.send_image(fileDir="image1.jpg", toUserName=friend.UserName)
    if baseResponse['BaseResponse']['Ret'] == 0:
        print("success")
    else:
        print("fail")
    end_time = time.time()
    print("第 1 次结束时间:", end_time)
    print("第 1 次花费时间:", end_time - start_time)

    MediaId = None
    baseResponse = itchat.upload_file('image2.jpg', isPicture=True)
    if baseResponse['BaseResponse']['Ret'] == 0:
        MediaId = baseResponse['MediaId']
        print("success")
    else:
        print("fail")

    time.sleep(5)

    if MediaId:
        start_time = time.time()
        print("第 2 次开始时间:", start_time)
        baseResponse = itchat.send_image(fileDir="image2.jpg", toUserName=friend.UserName, mediaId=MediaId)
        if baseResponse['BaseResponse']['Ret'] == 0:
            print("success")
        else:
            print(baseResponse)
            print("fail")
        end_time = time.time()
        print("第 2 次结束时间:", end_time)
        print("第 2 次花费时间:", end_time - start_time)

	time.sleep(5)

    with open("image.jpg", 'rb') as image:

        start_time = time.time()
        print("第 3 次开始时间:", start_time)
        baseResponse = itchat.send_image(toUserName=friend.UserName, file_=image)
        if baseResponse['BaseResponse']['Ret'] == 0:
            print("success")
        else:
            print(baseResponse)
            print("fail")
        end_time = time.time()
        print("第 3 次结束时间:", end_time)
        print("第 3 次花费时间:", end_time - start_time)

实验结果:

1 次开始时间: 1713025956.1631649
success
第 1 次结束时间: 1713025957.15521981 次花费时间: 0.9920549392700195
success
第 2 次开始时间: 1713025962.2728899
success
第 2 次结束时间: 1713025962.71136122 次花费时间: 0.438471317291259773 次开始时间: 1713025967.712695
success
第 3 次结束时间: 1713025968.52312873 次花费时间: 0.8104338645935059

实验数据表明:第一次的时间是 0.90 秒,第二次的时间是 0.33 秒,第三次的时间是 0.81 秒。说明提前把图片资源数据上传到微信服务器,都要比每次本地读取图片资源上传的时间开销要短。

常见问题

{‘BaseResponse’: {‘ErrMsg’: ‘参数错误’, ‘Ret’: -1005, ‘RawMsg’: ‘Either fileDir or file_ should be specific’}} 文件路径 fileDir 和 file_ 必须要指定一个。

发送视频类型消息

查询昵称 夜雨星空 联系人发送 video.mp4 视频

import itchat
itchat.auto_login(hotReload=True)


itchat.dump_login_status("itchat.pkl")

friend_list = itchat.search_friends(nickName='夜雨星空')
if friend_list:
    friend = friend_list[0]
    baseResponse = itchat.send_video(fileDir="video.mp4", toUserName=friend.UserName)
    if baseResponse['BaseResponse']['Ret'] == 0:
        print("success")
    else:
        print("fail")

测试结果
在这里插入图片描述

接收语音类型消息

开启一个私聊监听语音消息的消息注册器,存储私信的语音数据。

import itchat
from itchat.content import *
import time

itchat.auto_login(hotReload=True)


@itchat.msg_register(VOICE)
def download_voice(msg):
	print(msg)
    get_download_fn = msg['Text']
    with open(f"voice_{str(time.time())}.mp3", 'wb') as file:
        file.write(get_download_fn())
        print("success")

itchat.run()

msg 消息体

{'MsgId': '5692830849988916957', 'FromUserName': '@c0fe14053c62806a81dddb991a99310762a24834c5659209e734b4a8f28e9cf4', 'ToUserName': '@1c36f5debae32a8091e98b867bd3942b880c025866707bc030759313a59616bf', 'MsgType': 34, 'Content': '@f775c6e5de55b0355b2898694e8b33290adce345777eaecf27f83af03663a376d7069003478ce56bdfb935976a0856e53f61ed2a6e50a66803a7b83a6b305cb820617d71ffb4db4064b0a7a08ad04afdf32e6f2f3e1a97694c12ebe9f289dc331f8cda876b8bf0bef46c023917ed48d3843596068fe6950ee111ec729e7209aebc9ee29a0030a5d8711a22a469dbc4c38386c9c455aeb04ddaf3b37d052508b1598ad1a40e12deb2c4c789608c09552e94a18b77d82239992d54a3341d69e466a1bc2fb06909ae69b72d9ddf6a6f962e702e49bb26247bcd7f82a9f3b2d5c4891a060c0c54c812c8c17b046dd3a951fabab83e378690594084913f9d3d3a5afaf02379dcae8d106c7f934ab4303c08f18a0ccabb899cd93e6be0eba2d0b0207a249af537a729cd84e839f833c5b1f3832d6c53250a97c73822481f89eb4ea94bb80b3d4598ad6063b0d5f07b3b00f4ca7477ac22de031f78627d4e6176cbdfa721d039167e61f502baccc6c803ca3b347e7777715686e7ab90d79e86747c453693fcca3e424dcd4c1db4d5635d75cd3d47e059b81dbfb6f1a2e943a5dd3f154c55575827e5c52531139862df8a7f2d3a41d272077655e98b4c9ab75f127caff484269a0120b2f89297756259e732b2ff5b4d073be1a0336ef8ac52a2504e5fd6', 'Status': 3, 'ImgStatus': 1, 'CreateTime': 1713029115, 'VoiceLength': 1648, 'PlayLength': 0, 'FileName': '240414-012516.mp3', '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': 5692830849988916957, 'OriContent': '', 'EncryFileName': '', 'User': <User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@c0fe14053c62806a81dddb991a99310762a24834c5659209e734b4a8f28e9cf4', 'NickName': '王牌哥哥', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=768687014&username=@c0fe14053c62806a81dddb991a99310762a24834c5659209e734b4a8f28e9cf4&skey=@crypt_13d84e54_0eb12882a8a3a1f04047afebf03db315', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '糯米宝宝', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'WPGG', 'PYQuanPin': 'wangpaigege', 'RemarkPYInitial': 'NMBB', 'RemarkPYQuanPin': 'nuomibaobao', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 4135, 'Province': '', 'City': '', 'Alias': '', 'SnsFlag': 256, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Recording', 'Text': <function get_download_fn.<locals>.download_fn at 0x000002D7F7C763E0>}

get_download_fn:<function get_download_fn..download_fn at 0x0000020E7E2B63E0>

存储语音数据

在这里插入图片描述

发送文件类型消息

send_file:发送文件函数(指定群 / 用户发送文件)

def send_file(self, fileDir, toUserName=None, mediaId=None, file_=None):

函数说明:

属性 toUserName:指定所需要发送给他(她)文件资源的用户。

属性 fileDir:	文件地址,默认情况下 send_file 会先把本地文件资源上传到微信服务器,然后进行发送文件资源。

属性 mediaId:	媒体 Id,通过 itchat.upload_file 获取,若配置了,就不会重复加载本地资源,先上传微信服务器,然后再进行发送,而是直接从微信服务器进行读取,然后进行发送图片。
 
属性 file_:		指定 file 对象。配置打开状态下 file 对象(with open ··· 打开)。

查询昵称 夜雨星空 联系人发送 helloworld.docx 文档

import itchat
itchat.auto_login(hotReload=True)


itchat.dump_login_status("itchat.pkl")

friend_list = itchat.search_friends(nickName='夜雨星空')
if friend_list:
    friend = friend_list[0]
    baseResponse = itchat.send_file(fileDir="./helloworld.docx", toUserName=friend.UserName)
    if baseResponse['BaseResponse']['Ret'] == 0:
        print("success")
    else:
        print("fail")

测试结果

在这里插入图片描述

获取微信群数据

获取当前登陆微信下全部微信群数据(本地数据 / 实时数据)

get_chatrooms 函数

def get_chatrooms(self, update=False, contactOnly=False):

特别注意:如果不设置 update 获取是本地 local 数据(itchat.pkl 数据)。属性 contactOnly 如果配置了 True,则仅返回 starred 标记了的微信群。

读取实时数据:读取当前登陆态数据

import itchat
itchat.auto_login(hotReload=True)

chatroom_list = itchat.get_chatrooms(update=True)

for room in chatroom_list:
    print(room)

读取本地数据:不登录也同样可以读取数据(itchat.pkl 数据加载)

import itchat

itchat.dump_login_status("itchat.pkl")
chatroom_list = itchat.get_chatrooms(update=False)

for room in chatroom_list:
    print(room)

我们没有进行 itchat 扫描登陆操作,通过加载 itchat.pkl 登陆数据,同样查询到微信群数据。

设置微信群名称

查询 “唤醒手腕测试群” 微信群设置新的群名称:唤醒手腕新群

import itchat
itchat.auto_login(hotReload=True)


itchat.dump_login_status("itchat.pkl")
chatroom_list = itchat.get_chatrooms(update=True)

for room in chatroom_list:
    if room.NickName == "唤醒手腕测试群":
        baseResponse = itchat.set_chatroom_name(chatroomUserName=room.UserName, name="唤醒手腕新群")
        if baseResponse['BaseResponse']['Ret'] == 0:
            print("success")
        else:
            print("fail")

特别注意:由于微信 web 协议限制(设置群名称功能可能已经失效了)

查询微信群发送消息

通过 get_friends 方法可以轻松获取所有的好友(好友首位是自己)。进行判断群名匹配,从而获取群的 UserName 属性进行发送指定群消息。

.env 配置文件

SEND_ROOM_NAME=唤醒手腕测试群

实现源码

import itchat
from itchat.content import *

import dotenv
dotenv.load_dotenv('.env')

itchat.auto_login()

chatroom_list = itchat.get_chatrooms(update=True)
for room in chatroom_list:
    if room.NickName == os.getenv("SEND_ROOM_NAME"):
        GROUP_USERNAME = room.UserName

message = "唤醒手腕"        
itchat.send_msg(msg=message, toUserName=GROUP_USERNAME)

itchat.run()

实现消息群发助手

通过 get_friends 方法可以轻松获取所有的好友(好友首位是自己)。基于不同的好友可以发送不同的消息。这条程序运行后是真的会发消息出去,如果只是演示目的,把 itchat.send 改为 print 即可。

import itchat
import time
itchat.auto_login(True)

SINCERE_WISH = u'祝%s新年快乐!'

friendList = itchat.get_friends(update=True)[1:]
for friend in friendList:
    itchat.send(SINCERE_WISH % (friend['DisplayName'] or friend['NickName']), friend['UserName'])
    time.sleep(.5)

登陆稳定性常见问题

命令行登录一段时间后无法与服务器正常交互,这是因为微信网页端存在心跳机制,一段时间不交互将会断开连接。另外,每次获取数据时(webwxsync)记得更新 SyncKey。

待更新······

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐