如何让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
相关产品推荐
相关产品推荐

