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

如何利用nextcord的on_raw_message_delete获取消息删除者名称

解决nextcord中on_raw_message_delete获取消息删除者的问题

on_raw_message_delete 的 payload 对象本身不包含删除消息的用户信息,因为Discord推送该事件时不会附带删除者数据。要获取删除者,需要通过服务器的审计日志查询对应的操作记录。

实现步骤

  • 从payload中获取消息所在的服务器(guild)
  • 查询该服务器的审计日志,筛选出「消息删除」类型的条目
  • 匹配到对应消息的删除记录,提取删除者信息
  • 处理可能的异常情况(比如消息是用户自己删除、审计日志未记录等)

修正后的代码

@commands.Cog.listener()
async def on_raw_message_delete(self, payload):
    # 获取消息所在的服务器
    guild = self.bot.get_guild(payload.guild_id)
    if not guild:
        return
    
    # 获取目标频道
    channel = self.bot.get_channel(payload.channel_id)
    if not channel:
        return
    
    deleted_by = None
    # 查询审计日志,筛选消息删除操作,取最近的几条避免遗漏
    async for entry in guild.audit_logs(action=nextcord.AuditLogAction.message_delete, limit=5):
        # 匹配消息ID并限制时间范围,防止误匹配旧记录
        if entry.target.id == payload.message_id and (nextcord.utils.utcnow() - entry.created_at).total_seconds() < 10:
            deleted_by = entry.user
            break
    
    # 兜底处理:未找到审计日志记录的情况
    if not deleted_by:
        deleted_by = "未知用户(可能是消息发送者自行删除)"
    
    # 构建Embed
    embed = nextcord.Embed(title="消息已删除",
                          description=f"消息在 <#{payload.channel_id}> 被删除\n"
                                      f"删除者:{deleted_by.mention if isinstance(deleted_by, nextcord.User) else deleted_by}")
    # 替换为你的通知频道ID
    notify_channel = self.bot.get_channel(你的频道ID)
    if notify_channel:
        await notify_channel.send(embed=embed)

注意事项

  • 机器人需要拥有查看服务器审计日志的权限才能执行查询
  • 设置10秒的时间范围是为了避免匹配到无关的旧删除记录
  • 若消息由发送者自行删除,部分情况下审计日志不会生成对应条目,需做好兜底提示

内容的提问来源于stack exchange,提问作者zzzz4641

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:06:27