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

如何让Discord机器人的on_message_delete事件获取消息删除者?

如何在Discord.py中获取删除消息的用户

问题原因

on_message_delete事件仅提供被删除的消息对象,无法直接获取删除者信息——message.author是消息的发送者,不是删除操作的执行者。你之前尝试的author.deleted、deleted.user.id等写法都是错误的,因为这些属性并不存在于该事件的参数中。

解决方案:通过审计日志获取删除者

Discord服务器的审计日志会记录消息删除操作,我们可以在on_message_delete事件中查询最近的审计日志条目,匹配被删消息的ID来找到删除者。

完整代码示例

@client.event
async def on_message_delete(message):
    # 过滤含邀请链接的消息(保留你的原有逻辑)
    if "discord.gg" in message.content or "https://discord.gg/" in message.content or "discord.gg/" in message.content:
        return
    
    log_channel = client.get_channel(你的日志频道ID)  # 替换为实际频道ID
    embed = discord.Embed(
        title="消息已删除",
        description=f"发送者:**{message.author.name}**\n删除的消息内容:\n```{message.content}```",
        color=discord.Color.red()
    )
    embed.set_footer(text="自定义脚本文字", icon_url="自定义图标URL")  # 替换为实际内容
    
    # 仅在服务器环境下查询审计日志(DM中无法获取)
    if message.guild:
        try:
            # 查询最近的10条消息删除审计日志
            audit_logs = message.guild.audit_logs(action=discord.AuditLogAction.message_delete, limit=10)
            async for entry in audit_logs:
                # 匹配被删消息的ID和审计日志中的目标
                if entry.target.id == message.author.id and entry.extra.message_id == message.id:
                    embed.add_field(name="删除者", value=f"**{entry.user.name}**", inline=False)
                    break
        except discord.Forbidden:
            embed.add_field(name="提示", value="机器人无查看审计日志权限,无法获取删除者", inline=False)
    
    await log_channel.send(embed=embed)

关键说明

  • 权限要求:机器人必须拥有View Audit Log(查看审计日志)权限,否则无法查询审计日志。
  • 匹配逻辑:通过entry.extra.message_id匹配被删消息的ID,确保找到对应的删除操作记录。
  • 异常处理:加入Forbidden异常捕获,避免因权限不足导致机器人报错。
  • DM场景:DM中删除消息不会生成审计日志,因此无法获取删除者,代码中已做判断跳过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:05:26