Discord Bot:on_message_delete非缓存消息未触发问题求助
解决Discord Bot非缓存消息删除的内容获取问题
核心方案:利用服务器审计日志获取被删消息内容
on_raw_message_delete事件本身只能拿到消息ID和频道ID,但可以通过查询服务器的审计日志,匹配对应的删除记录来获取消息内容,不需要提前存储所有消息。
实现步骤(以discord.py为例):
- 确保Bot拥有查看审计日志的服务器权限(否则无法读取审计日志)
- 在
on_raw_message_delete事件中,查询对应服务器的最近审计日志,筛选出消息删除类型的条目 - 匹配审计条目中的目标消息ID与事件传入的消息ID,提取被删内容
代码示例:
@bot.event async def on_raw_message_delete(payload): # 获取消息所在频道 channel = bot.get_channel(payload.channel_id) if not channel or not channel.guild: return # 查询最近5条消息删除的审计日志(数量可按需调整) async for entry in channel.guild.audit_logs( action=discord.AuditLogAction.message_delete, limit=5 ): # 匹配被删除的消息ID if entry.target.id == payload.message_id: # 单条消息删除时,entry.extra.content就是被删消息内容 if hasattr(entry.extra, 'content'): deleted_content = entry.extra.content # 这里替换成你的业务逻辑,比如通知、记录等 print(f"[{channel.name}] 被删消息内容:{deleted_content}") break
注意事项:
- 审计日志的记录有一定延迟,建议设置合理的查询条数(比如5-10条),避免漏匹配
- 如果是批量删除消息,
entry.extra会是一个消息列表,但单条删除的场景下能直接拿到内容 - 若用户删除自己发送的消息,审计日志同样会生成对应条目,不会遗漏
为什么不推荐其他方案?
on_ready加载历史消息:Discord API有严格的速率限制,大服务器下无法一次性加载所有消息,且缓存容量有限,后续仍会出现消息被踢出缓存的情况- 提前存储所有消息:需要额外的存储资源,且会增加Bot的运行负担,不符合你的需求
内容的提问来源于stack exchange,提问作者user28857236
相关产品推荐
相关产品推荐

