如何让Discord机器人在版主删除消息时发送通知?
解决Discord机器人仅在版主删除消息时发送通知的问题
要实现仅在版主删除消息时触发通知,核心是通过**审核日志(Audit Log)**判断消息的删除者身份,区分普通用户自删和版主删帖。以下是针对discord.py 2.0+版本的实现方案:
核心逻辑说明
- 用户自行删除自己的消息时,Discord默认不会生成审核日志记录;若服务器开启了全量审核日志,记录的执行者就是消息作者本人,可直接排除。
- 版主删除他人消息时,会生成
message_delete类型的审核日志,我们需要获取这条日志,验证删除者是否拥有版主权限(如manage_messages),且删除者不是消息作者。
修改后的代码实现
import discord from discord.ext import commands # 初始化机器人,配置必要的意图 intents = discord.Intents.default() intents.message_content = True # 需开启消息内容意图 intents.messages = True intents.guilds = True intents.members = True # 获取成员权限需开启此意图 client = commands.Bot(command_prefix="!", intents=intents) @client.event async def on_message_delete(message): # 排除指定频道(修正原代码逻辑错误) if message.channel.name not in ["│vent-help", "┗vent-no-reply"]: # 排除特定表情消息 if message.content != "<:1984:1051269758164668497>": # 仅处理服务器内消息,DM无审核日志 if not message.guild: return try: # 获取最近1条消息删除的审核日志 async for entry in message.guild.audit_logs( action=discord.AuditLogAction.message_delete, limit=1 ): # 匹配日志对应的被删消息作者 if entry.target == message.author: # 验证删除者是版主且不是消息作者本人 if entry.user != message.author and entry.user.guild_permissions.manage_messages: user = str(message.author) moderator = str(entry.user) await message.channel.send(f"版主{moderator}删除了{user}的消息: <:1984:1051269758164668497>") break except discord.Forbidden: # 机器人无审核日志权限时的提示 await message.channel.send("机器人无查看审核日志权限,无法判断删除者身份") # 启动机器人 client.run("你的机器人Token")
关键注意事项
- 权限与意图配置:
- 机器人需要在服务器中开启
查看审核日志权限。 - 在Discord开发者门户中,必须开启
消息内容意图、服务器成员意图等必要权限,否则无法获取消息内容和成员权限信息。
- 机器人需要在服务器中开启
- 原代码逻辑修正:
- 原代码中
message.channel != "│vent-help" or message.channel != "┗vent-no-reply"逻辑错误,改为判断频道名不在目标列表中,避免所有频道都触发通知。
- 原代码中
- 边界情况处理:
- 加入异常捕获,处理机器人无审核日志权限的场景,防止报错崩溃。
- 自动排除DM中的消息删除操作,因为DM会话没有审核日志。
内容的提问来源于stack exchange,提问作者Jammy
相关产品推荐
相关产品推荐

