You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord Bot:on_message_delete非缓存消息未触发问题求助

解决Discord Bot非缓存消息删除的内容获取问题

核心方案:利用服务器审计日志获取被删消息内容

on_raw_message_delete事件本身只能拿到消息ID和频道ID,但可以通过查询服务器的审计日志,匹配对应的删除记录来获取消息内容,不需要提前存储所有消息。

实现步骤(以discord.py为例):

  1. 确保Bot拥有查看审计日志的服务器权限(否则无法读取审计日志)
  2. 在on_raw_message_delete事件中,查询对应服务器的最近审计日志,筛选出消息删除类型的条目
  3. 匹配审计条目中的目标消息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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:21:02