本项目目前默认分支为微信3.9.8.15版本,使用前请先检查自己电脑微信是否为该版本,版本不同可能由于UI问题导致某些功能无法正常调用。
注:如果你的微信版本可以用的话,也不需要过多纠结这个,本文测试的微信版本为3.9.12.17。
pip install wxauto
等待安装完成即可。
# 导入
>>>from wxauto import WeChat
# 获取微信窗口对象
>>> wx = WeChat()
初始化成功,获取到已登录窗口:xxxx
上面定义了wx
变量,下述文档不再重复定义和解释wx
变量。
wx.GetFriendDetails
>>> DetailsList = wx.GetFriendDetails(n=None, timeout=0xFFFFF)
方法说明: 获取所有好友详情信息列表。
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
n | int | None | 获取前n个好友详情信息。 |
timeout | int | 0xFFFFF | 获取超时时间(秒),超过该时间则直接返回结果。 |
注:1. 该方法运行时间较长,约0.5~1秒一个好友的速度,好友多的话可将n设置为一个较小的值,先测试一下;
2. 如果遇到企业微信的好友且为已离职状态,可能导致微信卡死,需重启(此为微信客户端BUG);
3. 该方法未经过大量测试,可能存在未知问题。
wx.GetSessionAmont
>>> sessionname, amount = wx.GetSessionAmont(SessionItem)
>>> print(f"会话名称: {session_name}, 新消息条数: {amount}")
>>> print(sessionname) # 聊天对象名
>>> print(amount) # 新消息条数
方法说明: 获取当前聊天窗口名,即聊天窗口最上方的那个名字。
参数: SessionItem (uiautomation.ListItemControl),聊天对象控件
wx.CheckNewMessage
>>> wx.CheckNewMessage()
有,则返回True;没有,则返回False。
wx.GetNextNewMessage
>>> msgs = wx.GetNextNewMessage(savepic=False, savefile=False, savevoice=False, timeout=10)
>>> msgs
{'张三': [['张三', '哈哈哈', '42373591784181']]}
方法说明: 只获取一个未读消息内容,这样多个聊天对象有新消息时,可以逐一获取消息内容并进行回复。
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
savepic | bool | False | 是否保存聊天图片 |
savefile | bool | False | 是否保存聊天文件 |
savevoice | bool | False | 是否保存聊天语音 |
timeout | int | 10 | 延时 |
注:该方法暂时只能读取未开启消息免打扰的好友的未读消息,开启消息免打扰的聊天无法获取。
wx.GetAllNewMessage
>>> msgs = wx.GetAllNewMessage(max_round=10)
方法说明: 获取所有未读消息的内容,即存在未读数量小圆点的聊天窗。
参数: max_round (int):最大获取次数 。这里是为了避免某几个窗口一直有新消息,导致无法停止。
注:该方法暂时只能读取未开启消息免打扰的好友的未读消息,开启消息免打扰的聊天无法获取。
wx.GetSessionList
>>> SessionDict = wx.GetSessionList(reset=False, newmessage=False)
方法说明: 聊天对象字典,键为聊天对象名,值为新消息条数。
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
reset | bool | False | 是否重置SessionItemList |
newmessage (bool) | bool | False | 是否只获取有新消息的聊天对象 |
wx.GetSession
>>> SessionElement = wx.GetSession()
方法说明: 获取聊天对象列表。
wx.ChatWith
# 打开“文件传输助手”聊天窗口
>>> who = '文件传输助手'
>>> wx.ChatWith(who)
方法说明: 打开指定好友(群组)聊天窗口。
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
who | str | / | 要打开的聊天框好友名或群名 |
wx.AtAll
>>> wx.AtAll(msg=None, who=None)
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
msg | str | None | 要发送的文本消息 |
who | str | None | 要发送给谁,如果为None,则发送到当前聊天页面。 *最好完整匹配,优先使用备注 |
wx.SendMsg
# 给“文件传输助手”发送消息
>>> who = '文件传输助手'
>>> msg = '''这是一条消息
这是第二行
这是第三行
'''
>>> wx.SendMsg(msg, who=who)
方法说明: 给指定人员(群组)发送消息。
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
msg | str | / | 要发送的文字内容 |
who | str | None | 要发送给谁,默认则发送给当前打开的页面 |
clear | bool | True | 是否清除原本聊天编辑框的内容 |
wx.SendFiles
# 给“文件传输助手”发送文件(图片同理)
>>> who = '文件传输助手'
# 指定文件路径(绝对路径)
>>> files = ['D:/test/test1.txt', 'D:/test/test2.txt', 'D:/test/test3.txt']
>>> wx.SendFiles(self, files, who=who)
方法说明: 给指定人员(群组)发送文件或者图片。
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
filepath | str | list | / | 指定文件路径,单个文件str,多个文件list |
who | str | None | 要发送给谁,默认则发送给当前打开的页面 |
wx.GetAllMessage
# 获取当前窗口聊天记录,并自动保存聊天图片
>>> msgs = wx.GetAllMessage(savepic=True, savefile=False, savevoice=False)
方法说明: 获取当前窗口中加载的所有聊天记录。
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
savepic | bool | False | 是否自动保存聊天图片 |
savefile | bool | False | 是否保存聊天文件 |
savevoice | bool | False | 是否保存聊天语音 |
wx.LoadMoreMessage
>>> isload = wx.LoadMoreMessage()
成功加载,返回True;否则返回False。
方法说明: 利用鼠标滚动加载当前聊天页面更多聊天信息。
参数: bool:是否成功加载更多聊天信息。
wx.CurrentChat
>>> currentname = wx.CurrentChat()
wx.GetNewFriends
>>> new = wx.GetNewFriends()
>>> new
[<wxauto New Friends Element at 0x1e95fced080 (张三: 你好,我是xxx群的张三)>,
<wxauto New Friends Element at 0x1e95fced081 (李四: 你好,我是xxx群的李四)>]
方法说明: 获取好友申请列表中,状态为可接受的好友申请对象。
通过好友申请对象接受好友请求
# 获取第一个可接受的新好友对象
>>> new_friend1 = new[0]
>>> print(new_friend1.name) # 获取好友申请昵称
张三
>>> print(new_friend1.msg) # 获取好友申请信息
你好,我是xxx群的张三
# 接受好友请求,并且添加备注“备注张三”、添加标签wxauto
>>> new_friend1.Accept(remark='备注张三', tags=['wxauto'])
注:该方法接受好友请求后,并不会自动切换回聊天页面,需要配合调用19、切换到聊天页面,否则其他有关聊天页面的方法不可使用。
wx.AddListenChat
>>> wx.AddListenChat(who='张三', savepic=True, savefile=False, savevoice=False)
方法说明: 将指定聊天对象独立出来,并且加入监听列表中。
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
who | str | / | 好友名/群名 |
savepic | bool | False | 是否保存聊天图片 |
savefile | bool | False | 是否保存聊天文件 |
savevoice | bool | False | 是否保存聊天语音 |
wx.GetListenMessage
>>> msgs = wx.GetListenMessage(who=None)
>>> msgs
{'张三': [['张三', '哈哈哈', '42373591784181']],'李四': [['李四', '哈哈哈', '42373591784256']],'李白': []}
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
who | str | None | 好友名/群名 |
wx.SwitchToContact
>>> wx.SwitchToContact()
wx.SwitchToChat
>>> wx.SwitchToChat()
wx.GetGroupMembers
>>> wx.GetGroupMembers()
['张三', '李四', '王五'...]
注:该方法获取到的为好友昵称或备注,有备注为备注,没备注为昵称。
wx.GetAllFriends
>>> friends_list = wx.GetAllFriends(keywords=None)
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
keywords | str | None | 搜索关键词,只返回包含关键词的好友列表。 |
注:
(1)该方法运行时间取决于好友数量,约每秒6~8个好友的速度;
(2)该方法未经过大量测试,可能存在未知问题。
wx.GetAllListenChat
>>> wx.GetAllListenChat()
wx.RemoveListenChat
>>> wx.RemoveListenChat(who)
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
who | str | None | 好友名/群名 |
wx.AddNewFriend
>>> keywords = '13800000000' # 微信号、手机号、QQ号
>>> addmsg = '你好,我是xxxx' # 添加好友的消息
>>> remark = '备注名字' # 备注名
>>> tags = ['朋友', '同事'] # 标签列表
>>> wx.AddNewFriend(keywords, addmsg=addmsg, remark=remark, tags=tags)
# wx.AddNewFriend(keywords, addmsg=None, remark=None, tags=None)
参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
keywords | str | / | 搜索关键词,微信号、手机号、QQ号 |
addmsg | str | None | 添加好友的消息 |
remark | str | None | 备注名 |
tags | list | None | 标签列表 |
from wxauto import WeChat
import time
# 实例化微信对象
wx = WeChat()
# 指定监听目标
listen_list = [
'张三',
'李四',
'工作群A',
'工作群B'
]
for i in listen_list:
wx.AddListenChat(who=i, savepic=True) # 添加监听对象并且自动保存新消息图片
# 持续监听消息,并且收到消息后回复“收到”
wait = 10 # 设置10秒查看一次是否有新消息
while True:
msgs = wx.GetListenMessage()
for chat in msgs:
msg = msgs.get(chat) # 获取消息内容
# ===================================================
# 处理消息逻辑
#
# 处理消息内容的逻辑每个人都不同,按自己想法写就好了,这里不写了
#
# ===================================================
# 回复收到
chat.SendMsg('收到') # 回复收到
time.sleep(wait)
或
import time
from wxauto import *
def auto_reply():
wx = WeChat()
while True:
msgs = wx.GetAllMessage()
if msgs:
last_msg = msgs[-1] # 获取最新消息
if "在吗" in last_msg:
wx.SendMsg("不在")
time.sleep(1) # 等一秒再检查
if __name__ == '__main__':
auto_reply()
from wxauto import WeChat
import time
# 实例化微信对象
wx = WeChat()
# 持续监听消息,并且收到消息后回复“收到”
wait = 10 # 设置10秒查看一次是否有新消息
while True:
msg = wx.GetNextNewMessage(savepic=True)
# 如果获取到新消息了,则回复收到
if msg:
# ===================================================
# 处理消息逻辑
#
# 处理消息内容的逻辑每个人都不同,按自己想法写就好了,这里不写了
#
# ===================================================
wx.SendMsg(msg='收到', who=list(msg)[0]) # 回复收到
time.sleep(wait)
from wxauto import *
# 初始化微信客户端连接
wx = WeChat()
# 持续监听新消息
while True:
new_message = wx.GetNextNewMessage()
# 提取消息详情
if new_message:
sender = new_message.keys()
content = new_message.values()
sender_list = list(sender)[0]
content_list = list(content)[0]
print(f"收到来自 {sender_list} 的消息:{content_list}")
print(list(list(content)[0])[0])
print(type(sender_list), type(content_list))
"""按“esc”键退出"""
from wxauto import WeChat
from pynput import keyboard
import threading
# 全局标志,用于指示是否应该退出程序
exit_flag = False
# 定义当键盘事件发生时调用的回调函数
def on_press(key):
try:
if key == keyboard.Key.esc:
global exit_flag
exit_flag = True
return False # 停止监听
except AttributeError:
pass # 忽略非按键事件
# 创建键盘监听器
listener = keyboard.Listener(on_press=on_press)
# 在单独的线程中启动监听器
listener_thread = threading.Thread(target=listener.start)
listener_thread.start()
# 初始化微信客户端连接
wx = WeChat()
# 注意:这里我们没有使用 WeChatFiles 类,因为它可能不是用于控制微信主功能的
# 如果您确实需要使用 WeChatFiles 类,请确保您了解其用途并正确实例化它
try:
# 持续监听新消息
while not exit_flag:
new_message = wx.GetNextNewMessage() # 假设这是获取新消息的正确方法
if new_message:
# 提取并打印消息详情(这里的代码取决于新消息的结构)
sender = list(new_message.keys())[0]
content = list(new_message.values())[0]
# 注意:下面的打印语句可能是多余的或错误的,取决于 content 的结构
# print(list(list(content)[0])[0]) # 这行代码可能是错误的,需要修正
print(f"收到来自 {sender} 的消息:{content}")
print(type(sender), type(content))
# 可能需要在这里添加一些延迟,以避免循环过于紧密
# time.sleep(0.1) # 如果需要,可以取消注释这行代码
finally:
# 确保在退出前停止键盘监听器
listener.stop()
listener_thread.join() # 等待监听器线程结束
1. 购买云服务器
选个便宜的新用户大概60一年的就可以部署了 【腾讯云】 【阿里云】;
内存:2G+;
系统:WindowsServer2016、2019、2022版本。
没试过1G的内存,我最小测试过2G的所以推荐至少2G。
2. 远程控制
由于windows系统自带的远程控制RDP(MSTSC)在结束远程时会自动锁屏,导致该项目无法正常运行,所以要更换其他远程控制软件。
有很多远程方案,这里推荐使用VNC:
1、登录服务器,安装RealVNC server,设置登录密码和服务端口,默认为5900端口,但是最好改一下;
2、登录云服务器服务商控制台,在防火墙打开上一步设置的vnc端口的访问权限;
3、自己电脑安装RealVNC viewer,输入云服务器ip:端口进行连接,断开连接不会锁屏;
4、服务器安装微信,部署代码即可运行。
注:1. 远程方案有很多,没有必须是VNC,只要不锁屏用什么都可以,向日葵也可以。
2. 云服务器最好买你所在城市或临近城市的,因为有几率触发微信异地登录风控。
文章:wxauto调用文档,作者:Cluic
代码仅供交流学习使用,请勿用于非法用途和商业用途!如因此产生任何法律纠纷,均与作者无关!