技术探索:利用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 WeChatwx = WeChat()# 发送消息给文件传输助手
msg = 'hello, wxauto!'
who = '文件传输助手'
wx.SendMsg(msg=msg, who=who)
1.2 附带@群好友的消息
from wxauto import WeChatwx = 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 WeChatwx = 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 WeChatwx = 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 WeChatwx = 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 WeChatwx = WeChat()# 加载更多历史消息
wx.LoadMoreMessage()# 获取当前聊天窗口消息
msgs = wx.GetAllMessage()
... # 自行构建消息处理逻辑

💡提示

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

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

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

  • GetAllNewMessage方法获取所有新消息

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

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

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

消息格式

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

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

from wxauto import WeChatwx = 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 WeChatwx = 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 WeChatwx = 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 WeChatwx = WeChat()# 切换到指定好友聊天框
who = '张三'
wx.ChatWith(who=who)
2. 切换微信主页面

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

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

获取好友信息

1. 获取粗略信息

参数说明:

参数名类型默认值说明
keywordsstrNone搜索关键词
from wxauto import WeChatwx = 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 WeChatwx = 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 WeChatwx = 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文件的文件夹,里面就保存了下载下来的图片。。

免责声明

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握MySQL基础命令:数据更新操作详细操作(数据的增删改)

MySQL数据修改是指使用SQL语句&#xff08;如UPDATE、INSERT、DELETE&#xff09;对数据库表中的数据进行更改、添加或删除的操作&#xff0c;常见的操作包括更新表中的记录、插入新记录以及删除现有记录 。 一、数据插入 1插入完整的数据记录 2插入非完整的数据记录 3插入多…

macOS使用Karabiner-Elements解决罗技鼠标G304连击、单击变双击的故障

记录一下罗技鼠标G304单击变双击的软件解决过程和方案&#xff08;适用于macOS&#xff0c; 如果是Windows&#xff0c;使用AutoHotKey也有类似解决办法、方案&#xff0c;改日提供&#xff09;&#xff1a; 背景&#xff1a;通过罗技Logitech G HUB软件对罗技的游戏鼠标侧键b…

摄像机反求跟踪软件/插件 Mocha Pro 2024 v11.0.2 CE Win

AE/PR/OFX/达芬奇/AVX插件 | 摄像机反求跟踪软件Mocha Pro 2024 v11.0.2 CE Win-PR模板网 Mocha Pro 软件(插件)&#xff0c;用于平面运动跟踪、3D跟踪、动态观察、对象移除、图像稳定和PowerMesh有机扭曲跟踪等功能。整合了SynthEyes核心的3D跟踪算法&#xff0c;能够快速自动…

k8s-第四节-Service

Service Service 通过 label 关联对应的 PodServcie 生命周期不跟 Pod 绑定&#xff0c;不会因为 Pod 重创改变 IP提供了负载均衡功能&#xff0c;自动转发流量到不同 Pod可对集群外部提供访问端口集群内部可通过服务名字访问 创建 Service kubectl apply -f service.yamlkub…

003-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍基础的线性回归方法&#xff0c;包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归&#xff08;Regression&…

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法 0. 引言1. 关于m_track2. 关于m_range_ring3. 关于m_ellipse4. 关于m_windrose5. 结语 0. 引言 本篇介绍下m_map中绘制航迹图函数&#xff08;m_track&#xff09;、绘…

python 发布应用程序包

文章目录 发布python包toml配置文件构建发布python包 官方文档参考 将自己的python项目发布成源码包或者wheel二进制包,供其他开发者使用。 方式: 使用py工具; distutils,该工具的使用已过时;setuptools,常用方式;wheel,在setuptools的基础上添加了 bdist_wheel, …

【BUUCTF-PWN】4-ciscn_2019_n_1

参考&#xff1a;BUUCTF-ciscn_2019_n_1 - 纸鸢asahi - 博客园 (cnblogs.com) buuctf 刷题记录_PWN ciscn_2019_n_1 - MuRKuo - 博客园 (cnblogs.com) 从题海中入门&#xff08;四&#xff09;ciscn_2019_n_1 - FreeBuf网络安全行业门户 ciscn_2019_n_1 ——两种解法_0x4134800…

Generative Modeling by Estimating Gradients of the Data Distribution

Generative Modeling by Estimating Gradients of the Data Distribution 本文介绍宋飏提出的带噪声扰动的基于得分的生成模型。首先介绍基本的基于得分的生成模型的训练方法&#xff08;得分匹配&#xff09;和采样方法&#xff08;朗之万动力学&#xff09;。然后基于流形假…

信号量——Linux并发之魂

欢迎来到 破晓的历程的 博客 引言 今天&#xff0c;我们继续学习Linux线程本分&#xff0c;在Linux条件变量中&#xff0c;我们对条件变量的做了详细的说明&#xff0c;今天我们要利用条件变量来引出我们的另一个话题——信号量内容的学习。 1.复习条件变量 在上一期博客中&…

天润融通分析AI技术助力客户服务,实现满意度三倍增长

如今&#xff0c;客户体验越来越成为影响客户决策的核心要素。 对于企业来讲&#xff0c;客户在不同触点的每一次互动体验&#xff0c;都成为塑造品牌声誉的“Aha时刻”。但同时&#xff0c;随着社会的发展的加速&#xff0c;客户的需求也在日新月异&#xff0c;给企业带来挑战…

刷代码随想录有感(125):动态规划——最长公共子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>>dp(text1.size() 1, vector<int>(text2.size() 1, 0));for(int i 1; i < text1.size(); i){for(int j …

【SQL】已解决:SQL错误(15048): 数据兼容级别有效值为100、110或120

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决SQL错误(15048): 数据兼容级别有效值为100、110或120 在数据库开发和管理过程中&#xff0c;我们经常会遇到各种各样的错误。本文将详细分析SQL错误(15048)的背景、可能原因、…

langchain框架轻松实现本地RAG

一 什么是RAG? RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合了检索和生成模型的方法&#xff0c;主要用于解决序列到序列的任务&#xff0c;如问答、对话系统、文本摘要等。它的核心思想是通过从大量文档中检索相关信息&#xff0c;然后利用这些信息…

vue3-openlayers 图标闪烁、icon闪烁、marker闪烁

本篇介绍一下使用vue3-openlayers 图标闪烁、icon闪烁、marker闪烁 1 需求 图标闪烁、icon闪烁、marker闪烁 2 分析 图标闪烁、icon闪烁、marker闪烁使用ol-animation-fade组件 3 实现 <template><ol-map:loadTilesWhileAnimating"true":loadTilesWh…

读人工智能全传03分治策略

1. 黄金年代 1.1. 图灵在他发表的论文《计算机器与智能》中介绍了图灵测试&#xff0c;为人工智能学科迈出第一步做出了重大贡献 1.2. 美国在第二次世界大战后几十年里计算机技术发展的特色&#xff0c;也是美国在未来60年内确立人工智能领域国际领先地位的核心 1.3. 1955年…

lodash中flush的使用(debounce、throttle)

在项目的配置中&#xff0c;看到了一个请求&#xff0c;类似是这样的 import { throttle } from lodash-es// 请求函数 async function someFetch(){const {data} await xxx.post()return data }// 节流函数 async function throttleFn(someFetch,1000)// 执行拿到数据函数 a…

leetcode--二叉树中的最长交错路径

leetcode地址&#xff1a;二叉树中的最长交错路径 给你一棵以 root 为根的二叉树&#xff0c;二叉树中的交错路径定义如下&#xff1a; 选择二叉树中 任意 节点和一个方向&#xff08;左或者右&#xff09;。 如果前进方向为右&#xff0c;那么移动到当前节点的的右子节点&…

大数据开发中的数据生命周期管理

上班越久&#xff0c;发现有些数据一直放在那里&#xff0c;根本没有流动&#xff0c;完全没有发挥价值&#xff0c;数据是有生命周期的&#xff0c;而且生命周期管理得好&#xff0c;工作就会更轻松。 目录 引言数据创建示例代码 数据存储示例代码 数据使用示例代码 数据维护示…

JavaScript中闭包的理解

闭包&#xff08;Closure&#xff09;概念&#xff1a;一个函数对周围状态的引用捆绑在一起&#xff0c;内层函数中访问到其外层函数的作用域。简单来说;闭包内层函数引用外层函数的变量&#xff0c;如下图&#xff1a; 外层在使用一个函数包裹住闭包是对变量的保护&#xff0c…