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

