技术探索:利用Python库wxauto实现Windows微信客户端的全面自动化管理

项目地址:github-wxauto 点击即可访问

项目官网:wxauto 点击即可访问

😂什么是wxauto?

wxauto 是作者在2020年开发的一个基于 UIAutomation 的开源 Python 微信自动化库,最初只是一个简单的脚本,只能获取消息和发送消息,经历了2年多的停滞,期间很多网友留言说需要更多的功能,所以在2023年针对新版微信重新开发了 wxauto,增加了更多的功能,即使 Python 初学者也可以简单上手自动化微信操作。目前已实现很多日常的微信操作的自动化,如自动发送消息、自动添加好友、自动回复、自动获取聊天记录、图片、文件等功能,后续还会根据反馈更新更多功能。

📌wxauto 的主要功能

  • 消息发送:支持发送文字、图片、文件、@群好友、引用消息等功能
  • 聊天记录:可获取好友的聊天记录内容
  • 监听消息:实时获取指定监听好友(群)的新消息
  • 其他定制功能:根据需求定制自动化流程,满足各种特殊需求。

🎧为什么选择 wxauto?

  • 开源免费:完全开源,你可以自由使用和修改,帮助更多人实现微信自动化。
  • 简单易用:界面简洁,操作简单,编程小白也能快速上手。
  • 灵活强大:支持多种操作和定制,满足各种自动化需求。

💡 未来展望

作者我们将持续优化 wxauto,增加更多实用功能,帮助更多用户实现微信自动化。

一、环境配置

Windows版本微信客户端自动化,可实现简单的发送、接收微信消息、保存聊天图片

3.9.11.17版本微信安装包下载: 123云盘 提取码:seqA

环境版本
OS`windows 10
微信`微信
Python`Python

获取wxauto

CMD窗口:

pip install wxauto

Python窗口:

>>> import wxauto
>>> wxauto.VERSION
'3.9.11.17'
>>> wx = wxauto.WeChat()
初始化成功,获取到已登录窗口:xxx

二、快速入门

1. 获取微信对象

# 导入
from wxauto import WeChat

# 获取微信窗口对象
wx = WeChat()
# 输出 > 初始化成功,获取到已登录窗口:xxxx

🚨注意

请先登录PC微信客户端,再运行上述代码

🚨注意

上面定义了wx变量,后续文档不再重复定义和解释wx变量

2. 一个简单的收到机器人

首先设置一个监听列表,列表元素为指定好友(或群聊)的昵称

listen_list = [
    '张三',
    '李四',
    '工作群A',
    '工作群B'
]

然后调用AddListenChat方法添加监听对象,其中可选参数savepic为是否保存新消息图片

for i in listen_list:
    wx.AddListenChat(who=i, savepic=True)

最后调用GetListenMessage方法,实现消息监听,收到消息类型为friend的消息之后,调用SendMsg方法回复消息

# 持续监听消息,并且收到消息后回复“收到”
wait = 1  # 设置1秒查看一次是否有新消息
while True:
    msgs = wx.GetListenMessage()
    for chat in msgs:
        who = chat.who              # 获取聊天窗口名(人或群名)
        one_msgs = msgs.get(chat)   # 获取消息内容
        # 回复收到
        for msg in one_msgs:
            msgtype = msg.type       # 获取消息类型
            content = msg.content    # 获取消息内容,字符串类型的消息内容
            print(f'【{who}】:{content}')
        # ===================================================
        # 处理消息逻辑(如果有)
        # 
        # 处理消息内容的逻辑每个人都不同,按自己想法写就好了,这里不写了
        # 
        # ===================================================
        
            # 如果是好友发来的消息(即非系统消息等),则回复收到
            if msgtype == 'friend':
                chat.SendMsg('收到')  # 回复收到
    time.sleep(wait)

👌SUCCESS

恭喜你,你已经实现了一个简单的微信机器人,可以自动回复消息了!

完整代码

# 导入
from wxauto import WeChat

# 获取微信窗口对象
wx = WeChat()
# 输出 > 初始化成功,获取到已登录窗口:xxxx

# 设置监听列表
listen_list = [
    '张三',
    '李四',
    '工作群A',
    '工作群B'
]
# 循环添加监听对象
for i in listen_list:
    wx.AddListenChat(who=i, savepic=True)

# 持续监听消息,并且收到消息后回复“收到”
wait = 1  # 设置1秒查看一次是否有新消息
while True:
    msgs = wx.GetListenMessage()
    for chat in msgs:
        who = chat.who              # 获取聊天窗口名(人或群名)
        one_msgs = msgs.get(chat)   # 获取消息内容
        # 回复收到
        for msg in one_msgs:
            msgtype = msg.type       # 获取消息类型
            content = msg.content    # 获取消息内容,字符串类型的消息内容
            print(f'【{who}】:{content}')
        # ===================================================
        # 处理消息逻辑(如果有)
        # 
        # 处理消息内容的逻辑每个人都不同,按自己想法写就好了,这里不写了
        # 
        # ===================================================
        
            # 如果是好友发来的消息(即非系统消息等),则回复收到
            if msgtype == 'friend':
                chat.SendMsg('收到')  # 回复收到
    time.sleep(wait)

三、方法说明

发送消息

1. 发送文字消息SendMsg

参数说明:

参数类型默认值说明
msgstr/要发送的文字内容
whostrNone要发送给谁,默认则发送给当前打开的页面
clearboolTrue是否清除原本聊天编辑框的内容
atlist,strNone要@的人,可以是一个人或多个人,格式为str或list,例如:"张三"或[“张三”, “李四”]
1.1简单的发送文字信息
from wxauto import WeChat

wx = WeChat()

# 发送消息给文件传输助手
msg = 'hello, wxauto!'
who = '文件传输助手'
wx.SendMsg(msg=msg, who=who)
1.2 附带@群好友的消息
from wxauto import WeChat

wx = WeChat()

msg = 'xxxxxxx,收到请回复!'
who = '工作群A'
at = ['张三', '李四']   # 要@的人
wx.SendMsg(msg=msg, who=who, at=at)
2. 发送图片/视频/文件消息 SendFiles参数说明:
参数名类型默认值说明
filepathstr | list/指定文件路径,单个文件str,多个文件list
whostrNone要发送给谁,默认则发送给当前打开的页面
2.1 发送图片/视频/文件消息
from wxauto import WeChat

wx = WeChat()

# 发送图片
files = [
    r'C:\Users\user\Desktop\1.jpg',   # 图片
    r'C:\Users\user\Desktop\2.txt',   # 文件
    r'C:\Users\user\Desktop\3.mp4'    # 视频
]

who = '文件传输助手'
wx.SendFiles(filepath=files, who=who)

获取消息

1. 获取当前聊天窗口消息

GetAllMessage方法用于获取微信主窗口当前聊天窗口的所有消息,返回消息对象列表

参数说明:

参数名类型默认值说明
savepicboolFalse是否自动保存聊天图片
savefileboolFalse是否自动保存聊天文件
savevoiceboolFalse是否自动保存聊天语音转文字内容
1.1 仅获取文字消息

无需参数,直接调用GetAllMessage方法即可获取当前聊天窗口的所有消息

from wxauto import WeChat

wx = WeChat()

# 获取当前聊天窗口消息
msgs = wx.GetAllMessage()

# 输出消息内容
for msg in msgs:
    if msg.type == 'sys':
        print(f'【系统消息】{msg.content}')
    
    elif msg.type == 'friend':
        sender = msg.sender # 这里可以将msg.sender改为msg.sender_remark,获取备注名
        print(f'{sender.rjust(20)}{msg.content}')

    elif msg.type == 'self':
        print(f'{msg.sender.ljust(20)}{msg.content}')
    
    elif msg.type == 'time':
        print(f'\n【时间消息】{msg.time}')

    elif msg.type == 'recall':
        print(f'【撤回消息】{msg.content}')
1.2 获取文字信息以及保存图片、文件、语音转文字内容

可使用以下三个参数自定义指定是否保存图片、文件、语音转文字内容

  • savepic:是否保存聊天图片,默认为False
  • savefile:是否保存聊天文件,默认为False
  • savevoice:是否保存聊天语音转文字内容,默认为False
from wxauto import WeChat

wx = WeChat()

# 获取当前聊天窗口消息
msgs = wx.GetAllMessage(
    savepic   = True,   # 保存图片
    savefile  = True,   # 保存文件
    savevoice = True    # 保存语音转文字内容
)

# 输出消息内容
for msg in msgs:
    if msg.type == 'sys':
        print(f'【系统消息】{msg.content}')
    
    elif msg.type == 'friend':
        sender = msg.sender # 这里可以将msg.sender改为msg.sender_remark,获取备注名
        print(f'{sender.rjust(20)}{msg.content}')

    elif msg.type == 'self':
        print(f'{msg.sender.ljust(20)}{msg.content}')
    
    elif msg.type == 'time':
        print(f'\n【时间消息】{msg.time}')

    elif msg.type == 'recall':
        print(f'【撤回消息】{msg.content}')
1.3 加载更多历史消息

LoadMoreMessage方法用于加载更多历史消息,配合GetAllMessage方法使用,实现获取更多历史消息

from wxauto import WeChat

wx = WeChat()

# 加载更多历史消息
wx.LoadMoreMessage()

# 获取当前聊天窗口消息
msgs = wx.GetAllMessage()
... # 自行构建消息处理逻辑

💡提示

LoadMoreMessage方法加载更多历史消息时,需要保证当前聊天窗口有历史消息,否则没有效果,即触发一次“查看更多消息”

2. 获取新消息
2.1 获取主窗口新消息

GetAllNewMessageGetNextNewMessage方法用于获取微信主窗口的新消息,返回消息对象列表

  • GetAllNewMessage方法获取所有新消息

    from wxauto import WeChat
    
    wx = WeChat()
    
    # 获取所有新消息
    msgs = wx.GetAllNewMessage()
    
  • GetNextNewMessage方法获取下一条新消息

    from wxauto import WeChat
    
    wx = WeChat()
    
    # 获取下一条新消息
    msgs = wx.GetNextNewMessage()
    

这两种方法获取到的msgs数据类型均为dict,结构如下:

消息格式

{
    '张三': [msg1, msg2, ...],
    '李四': [msg1, msg2, ...],
    ...
}
2.2 监听消息

GetListenMessage方法用于获取监听消息,调用该方法之前,需要先调用AddListenChat方法添加监听对象,然后调用GetListenMessage方法实现消息监听

from wxauto import WeChat

wx = WeChat()

# 首先设置一个监听列表,列表元素为指定好友(或群聊)的昵称
listen_list = [
    '张三',
    '李四',
    '工作群A',
    '工作群B'
]

# 然后调用`AddListenChat`方法添加监听对象,其中可选参数`savepic`为是否保存新消息图片
for i in listen_list:
    wx.AddListenChat(who=i)

msgs = wx.GetListenMessage()
for chat in msgs:
    one_msgs = msgs.get(chat)   # 获取消息内容
    
    # 回复收到
    for msg in one_msgs:
        if msg.type == 'sys':
            print(f'【系统消息】{msg.content}')
        
        elif msg.type == 'friend':`
            sender = msg.sender # 这里可以将msg.sender改为msg.sender_remark,获取备注名
            print(f'{sender.rjust(20)}{msg.content}')
            
            # !!! 回复收到,此处为`chat`而不是`wx` !!!
            chat.SendMsg('收到')  
            # 此处将msg.content传递给大模型,再由大模型返回的消息回复即可实现ai聊天

        elif msg.type == 'self':
            print(f'{msg.sender.ljust(20)}{msg.content}')
        
        elif msg.type == 'time':
            print(f'\n【时间消息】{msg.time}')

        elif msg.type == 'recall':
            print(f'【撤回消息】{msg.content}')

💣提示

  1. GetListenMessage方法获取到的msgs是一个字典,键为监听对象,值为消息对象列表;值的列表与GetAllMessage方法获取到的消息对象列表一样

添加好友

1. 发起好友申请

ddNewFriend方法用于发起好友申请

参数说明:

参数类型默认值说明
keywordsstr/微信号、手机号、QQ号
addmsgstr‘你好,我是xxxx’添加好友的消息
remarkstrNone备注名

♨️注意

注:微信有一定的限制,如果频繁添加好友,可能会被限制添加好友的权限,请谨慎使用,切勿滥用!!!

from wxauto import WeChat

wx = WeChat()

keywords = '13800000000'      # 微信号、手机号、QQ号
addmsg = '你好,我是xxxx'      # 添加好友的消息
remark = '备注名字'            # 备注名,没有则不用设置
tags = ['朋友', '同事']        # 标签列表

# 发起好友申请
wx.AddNewFriend(keywords, addmsg=addmsg, remark=remark, tags=tags)
2. 接受好友请求
2.1 获取新的好友申请对象列表

GetNewFriends方法用于获取新的好友申请对象列表

Python – 获取新的好友申请对象列表示例代码

from wxauto import WeChat

wx = WeChat()

new = wx.GetNewFriends()
# [<wxauto New Friends Element at 0x1e95fced080 (张三: 你好,我是xxx群的张三)>,
# <wxauto New Friends Element at 0x1e95fced081 (李四: 你好,我是xxx群的李四)>]
2.2 通过好友申请对象接受好友请求
...  # 接2.1代码

# 获取第一个可接受的新好友对象
new_friend1 = new[0]

print(new_friend1.name)  # 获取好友申请昵称
# 张三

print(new_friend1.msg)  # 获取好友申请信息
# 你好,我是xxx群的张三

# 接受好友请求,并且添加备注“备注张三”、添加标签wxauto
new_friend1.Accept(remark='备注张三', tags=['wxauto'])

# 切换回聊天页面
wx.SwitchToChat()

🚧提示

该方法接受好友请求后,并不会自动切换回聊天页面,需要配合调用SwitchToChat方法切换至聊天页面,否则其他有关聊天页面的方法不可使用

切换聊天窗口

1. 切换到指定好友聊天框

ChatWith方法用于切换到指定好友聊天框

参数说明:

参数名类型默认值说明
whostr/要打开的聊天框好友名或群名
from wxauto import WeChat

wx = WeChat()

# 切换到指定好友聊天框
who = '张三'
wx.ChatWith(who=who)
2. 切换微信主页面

此部分原理为点击微信左侧黑色侧边栏的相应图标按钮,切换至相应的页面。

2.1 切换到聊天页面
from wxauto import WeChat

wx = WeChat()

# 切换到聊天页面
wx.SwitchToChat()
2.2 切换到通讯录页面
from wxauto import WeChat

wx = WeChat()

# 切换到通讯录页面
wx.SwitchToContact()

获取好友信息

1. 获取粗略信息

参数说明:

参数名类型默认值说明
keywordsstrNone搜索关键词
from wxauto import WeChat

wx = WeChat()

friend_infos = wx.GetAllFriends()
# [{'nickname': '张三', 'remark': '张总', 'tags': None},
#  {'nickname': '李四', 'remark': None, 'tags': ['同事', '初中同学']},
#  {'nickname': '王五', 'remark': None, 'tags': None},
# ...]

🚨注意

  1. 该方法运行时间取决于好友数量,约每秒6~8个好友的速度
2. 获取详细信息

参数说明:

参数名类型默认值说明
nintNone获取前n个好友详情信息, 默认为None,获取所有好友详情信息
timeoutint0xFFFFF获取好友详情信息的超时时间,单位为秒
from wxauto import WeChat

wx = WeChat()

friend_details = wx.GetAllFriendsDetail()
# [{'微信号:': 'abc123456',
#   '地区:': '上海 浦东新区',
#   '备注': '',
#   '标签': 'wxauto',
#   '共同群聊': '1个',
#   '来源': '通过扫一扫添加',
#   '昵称': '张三'},
# {'备注': '',
#  '企业': '广州融创文旅城',
#  '实名': '***',
#  '官方商城': '🎫购滑雪票入口🎫',
#  '通知': '回复时间为工作日9点-18点',
#  '会员商城': '🏂热雪值兑换雪票🏂',
#  '冰箱赞滑': '👬申请冰箱主理人👭',
#  '全民滑雪': '购票赢黄金会籍',
#  '共同群聊': '1个',
#  '昵称': '广州大冰箱'},...]

🚡注意

  1. 该方法运行时间较长,约0.5~1秒一个好友的速度,好友多的话可将n或者timeout参数设置为一个较小的值,先测试一下
  2. 如果遇到企业微信的好友且为已离职状态,可能导致微信卡死,需重启(此为微信客户端BUG)

四、对象说明

消息对象

消息对象指的是调用GetAllMessage、GetListenMessage等方法后返回的消息对象,分为物种消息类型,分别是系统消息 时间消息 撤回消息 好友消息 自己的消息,消息对象包含了消息的所有信息,包括消息类型、消息内容、消息发送者等。

1. 系统消息

支持属性:

属性名类型说明
typestr消息类型,固定为sys
contentstr消息内容
senderstr发送者,固定为SYS
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息id
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'sys':
        print(f'【系统消息】{msg.content}')
2. 时间消息

支持属性:

属性名类型说明
typestr消息类型,固定为time
contentstr消息内容
senderstr发送者,固定为Time
timestr时间消息内容,格式为%Y-%m-%d %H:%M
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息id
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'time':
        print(f'【时间消息】{msg.time}')
3. 撤回消息

支持属性:

属性名类型说明
typestr消息类型,固定为recall
contentstr消息内容
senderstr发送者,固定为Recall
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息id
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'recall':
        print(f'【撤回消息】{msg.content}')
4. 好友消息

支持属性:

属性名类型说明
typestr消息类型,固定为friend
contentstr消息内容
senderstr发送者
sender_remarkstr发送者备注名
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息id
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'friend':
        sender = msg.sender # 这里可以将msg.sender改为msg.sender_remark,获取备注名
        print(f'{sender}{msg.content}')

支持方法

方法名说明
quote引用消息进行回复,唯一参数msg,str类型
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'friend':
        msg.quote('回复消息')  # 引用消息进行回复
        break
5. 自己的消息

支持属性:

属性名类型说明
typestr消息类型,固定为self
contentstr消息内容
senderstr发送者
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息id
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'self':
        print(f'{msg.sender}{msg.content}')

支持方法

方法名说明
quote引用消息进行回复,唯一参数msg,str类型
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'self':
        msg.quote('回复消息')  # 引用消息进行回复
        break

聊天窗口对象

聊天窗口对象指的是监听消息模式下打开的独立聊天窗口,这个对象用于对该独立窗口的管理,包括获取聊天窗口的消息、发送消息等。

支持属性:

属性名类型说明
whostr当前聊天窗口的对象名
UiaAPIuiautomation.Control当前聊天窗口的uiautomation控件
editboxuiautomation.Control当前聊天窗口输入框的uiautomation控件

支持方法:

方法名说明
AtAll@所有人
SendMsg发送消息
SendFiles发送文件
GetAllMessage获取消息
GetNewMessage获取新消息
LoadMoreMessage加载更多消息
GetGroupMembers获取群成员

会话列表对象

会话列表对象即微信左侧的会话列表,可利用该对象获取看到的信息

支持属性:

属性名类型说明
namestr会话对象名
timestr最后一条消息的时间
contentstr最后一条消息的内容
isnewbool是否有新消息
from wxauto import WeChat

wx = WeChat()

sessions = wx.GetSession()

for session in sessions:
    print(f"============== 【{session.name}】 ==============")
    print(f"最后一条消息时间: {session.time}")
    print(f"最后一条消息内容: {session.content}")
    print(f"是否有新消息: {session.isnew}")

示例:

请先登录PC微信客户端

from wxauto import *


# 获取当前微信客户端
wx = WeChat()


# 获取会话列表
wx.GetSessionList()

# 向某人发送消息(以`文件传输助手`为例)
msg = '你好~'
who = '文件传输助手'
wx.SendMsg(msg, who)  # 向`文件传输助手`发送消息:你好~


# 向某人发送文件(以`文件传输助手`为例,发送三个不同类型文件)
files = [
    'D:/Desktop/Tests/wxauto.py',
    'D:/Desktop/Tests/wxauto.png',
    'D:/Desktop/Tests/files.zip'
]
who = '文件传输助手'
wx.SendFiles(filepath=files, who=who)  # 向`文件传输助手`发送上述三个文件


# 下载当前聊天窗口的聊天记录及图片
msgs = wx.GetAllMessage(savepic=True)   # 获取聊天记录,及自动下载图片

他会打开你的微信窗口,然后搜索文件传输助手,将你好发送出去,也会将文件发送出去,同时将本窗口聊天记录里的图片下载下来。
你会在你项目列表里发现新建了一个名为wxauto文件的文件夹,里面就保存了下载下来的图片。。

免责声明

代码仅供交流学习使用,请勿用于非法用途和商业用途!如因此产生任何法律纠纷,均与作者无关!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/772531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

argparse大坑之parser

parser.add_argument(--rate,help"--rate 0.5 means that there is a 50% probability;",typefloat,default0.5)此时用-h输出usage会报错如下&#xff1a; 最后发现是因为parser的help里面出现了%&#xff0c;改了之后就好了。真坑啊&#xff01;

centos7安装mqtt服务端

下载emqx centos7安装包 https://download.csdn.net/download/qq32933432/89515118 安装 cd /opt/ mkdir emqx # 把文件上传进去 rpm -ivh emqx-centos7-4.2.7-x86_64.rpm # 运行 emqx start确保防火墙将1883和18083这两端口开启&#xff0c;可视化界面&#xff1a;http://主…

腾讯云函数部署环境[使用函数URL]

使用函数URL 之前使用的是网关API,最近腾讯云的网关API说要关闭了,所以没有办法这里改成函数URL,使用后发现只要不是在浏览器直接访问的情况,函数URL都可以满足! 这里结合腾讯云函数node.js返回自动带反斜杠这篇文章来做说明,比如这里的URL如下: 结合文章腾讯云函数node.js返…

科东软件精彩亮相华南工博会,展现未来工业前沿技术

近日&#xff0c;华南国际工业博览会在深圳成功举办。科东软件携众多前沿技术、解决方案及最新应用案例精彩亮相&#xff0c;为参展观众带来了一场工业智能的科技盛宴。 鸿道操作系统&#xff08;Intewell&#xff09; 科东软件重点展示了鸿道操作系统&#xff08;Intewell&…

幻兽帕鲁卡顿严重、延迟高怎么办?幻兽帕鲁卡顿问题处理

幻兽帕鲁更是一款支持多人游戏模式的生存制作游戏。玩家们可以邀请好友一同加入这个充满奇幻与冒险的世界&#xff0c;共同挑战强大的敌人&#xff0c;分享胜利的喜悦。在多人模式中&#xff0c;玩家之间的合作与竞争将成为游戏的一大看点。玩家们需要充分发挥自己的智慧和策略…

小白 | 华为云docker设置镜像加速器

一、操作场景 通过docker pull命令下载镜像中心的公有镜像时&#xff0c;往往会因为网络原因而需要很长时间&#xff0c;甚至可能因超时而下载失败。为此&#xff0c;容器镜像服务提供了镜像下载加速功能&#xff0c;帮助您获得更快的下载体验。 二、约束与限制 构建镜像的客…

软件开发中常用的11款bug记录、跟踪、管理系统对比【2024更新】

软件开发项目的复杂性不断增加&#xff0c;有效的bug管理变得尤为关键。对开发团队而言&#xff0c;没有什么比选择一款合适的Bug跟踪工具更重要的了。工具的功能、界面友好度、整合能力及成本都是决策的关键因素。 1、PingCode 推荐指数&#xff1a;五星 简介&#xff1a;P…

采用B/S模式 可跨平台使用的数据采集监控平台!

数据采集监控平台是一款专注于工业企业生产设备管理、数据采集、数据分析、数据管理、数据存储、数据传输等的软件系统。系统具备丰富的接口&#xff0c;配置灵活&#xff0c;方便部署&#xff0c;通过采集企业生产设备的数据集中处理&#xff0c;将各个信息孤岛有机连接&#…

【图像分割】mask2former:通用的图像分割模型详解

最近看到几个项目都用mask2former做图像分割&#xff0c;虽然是1年前的论文&#xff0c;但是其attention的设计还是很有借鉴意义&#xff0c;同时&#xff0c;mask2former参考了detr的query设计&#xff0c;实现了语义和实例分割任务的统一。 1.背景 1.1 detr简介 detr算是第…

.NET发布成单个文件后获取不到程序所在路径的问题

.net程序不发布成单个文件&#xff0c;所以运行都是正常的&#xff0c;但是发布成单个文件后发现使用&#xff1a; var basePath Path.GetDirectoryName((System.Reflection.Assembly.GetExecutingAssembly().Location)); 获取不到应用程序所在的路径了。 找一下几个获取本程…

Flutter集成高德导航SDK(Android篇)(JAVA语法)

先上flutter doctor&#xff1a; flutter sdk版本为&#xff1a;3.19.4 引入依赖&#xff1a; 在app的build.gradle下&#xff0c;添加如下依赖&#xff1a; implementation com.amap.api:navi-3dmap:10.0.700_3dmap10.0.700navi-3dmap里面包含了定位功能&#xff0c;地图功能…

Cloudflare 推出一款免费对抗 AI 机器人的可防止抓取数据工具

上市云服务提供商Cloudflare推出了一种新的免费工具&#xff0c;可防止机器人抓取其平台上托管的网站以获取数据以训练AI模型。 一些人工智能供应商&#xff0c;包括谷歌、OpenAI 和苹果&#xff0c;允许网站所有者通过修改他们网站的robots.txt来阻止他们用于数据抓取和模型训…

系统架构设计师教程(清华第2版)<第1章 绪论>解读

系统架构设计师教程 第一章 绪论 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.3 如何成…

Unity中TimeLine的一些用法

Unity中TimeLine的一些用法 概念其他 概念 无Track模式&#xff08;PlayableAsset、PlayableBehaviour&#xff09; 1. 两者关系 运行在PlayableTrack中作用 PlayableBehaviour 实际执行的脚本字段并不会显示在timeline面板上 PlayableAsset PlayableBehaviour的包装器&#x…

电脑彻底删除的文件还能恢复吗怎么弄 电脑删除的文件怎么恢复 回收站也删了

实测可行的文件恢复方法&#xff0c;无论是彻底删除的文件&#xff0c;还是被清空的回收站文件&#xff0c;使用该方法都可以轻松找回。整个恢复过程操作简单&#xff0c;并且绝不会损伤电脑硬件。这意味着&#xff0c;您再也不用为误删文件而焦虑了。有关电脑彻底删除的文件还…

【Windows】Bootstrap Studio(网页设计)软件介绍及安装步骤

软件介绍 Bootstrap Studio 是一款专为前端开发者设计的强大工具&#xff0c;主要用于快速创建现代化的响应式网页和网站。以下是它的主要特点和功能&#xff1a; 直观的界面设计 Bootstrap Studio 提供了直观的用户界面&#xff0c;使用户能够轻松拖放元素来构建网页。界面…

audo dl上使用tensorrt llm,baichuan7B为例

1. 在社区镜像搜索 nvidia 找一个tensorrt llm 0.10 以上的版本&#xff0c;系统盘30g安装软件应该够用&#xff0c;免费的数据盘50G用来存放模型。baichuan7B原始模型应该会占用14G&#xff0c;转换为fp16的 ckpt后再占用14G&#xff0c;build后占用14G。总共需要占用42G&…

视频太大发不出去怎么处理,视频太大发不了邮件怎么办

在数字化时代&#xff0c;视频已成为我们分享生活、传递信息的重要方式。然而&#xff0c;当遇到视频文件过大&#xff0c;无法发送或分享时&#xff0c;你是否感到困扰&#xff1f;别担心&#xff0c;本文将为你揭秘轻松解决视频太大发不了的问题。 电脑频编辑器可以用于简单的…

工业智能网关的作用有哪些?工业智能网关与传统网关的主要区别-天拓四方

工业智能网关是一种专为工业环境设计的网络设备&#xff0c;具备数据采集、传输、协议转换以及边缘计算等功能。它作为连接工业设备与互联网的关键枢纽&#xff0c;不仅实现了工业设备的互联互通&#xff0c;还通过对采集到的数据进行实时分析&#xff0c;为工业生产的智能化管…

第一百四十三节 Java数据类型教程 - Java Boolean包装类

Java数据类型教程 - Java Boolean包装类 布尔类的对象包装一个布尔值。 Boolean.TRUE和Boolean.FALSE是布尔类型的两个常量&#xff0c;用于表示布尔值true和false值。 我们可以使用构造函数或valueOf()工厂方法创建一个布尔对象。 当解析字符串时&#xff0c;此类将处理“t…