discord.py 自定义@bot.command() 无法正常触发问题咨询
核心问题定位
你重写on_message事件后,缺失了指令解析的中转步骤,直接截断了Bot的命令触发流程,所有自定义指令自然不会被识别执行。
原理说明
- Discord.py 框架默认的消息处理流程是:收到消息 → 触发
on_message事件 → 自动调用process_commands方法解析消息是否匹配已注册的自定义指令 → 匹配则执行对应指令逻辑。 - 当你用
@bot.event装饰器重写整个on_message方法时,框架原本内置的自动调用process_commands的逻辑会被完全覆盖。你当前写的on_message逻辑只做了违禁词检测、违规消息删除的操作,完全没有触发指令解析的环节,所以哪怕用户发了!hello这样的指令,Bot也只会过一遍违禁词检测流程,根本不会走到指令匹配的步骤。
修复方法
在on_message事件的末尾补充指令解析的调用即可,同时要规避逻辑漏洞:
- 跳过机器人自身发送的消息,避免触发死循环
- 违规消息被删除后直接终止流程,不要继续走指令解析
- 普通非违规消息正常交给指令解析流程处理
修复后的完整on_message代码片段:
@bot.event async def on_message(message): # 跳过机器人自身发送的消息,避免循环触发 if message.author.bot: return # 原有违禁词检测逻辑 for word in words: if word in message.content.lower(): await message.delete() await message.channel.send("Oops! Seems like " + message.author.mention + " was trying to send a message that was breaking the " + bot.get_channel(783064049859559434).mention + ". Luckily, I deleted it before it caused any more damage. Don't send any more messages like that!\n\nIf you think that I made an error, please report it in " + bot.get_channel(783074030265040916).mention + ", " + bot.get_channel(783074002255478848).mention + " or in " + bot.get_channel(783092164590174251).mention) # 违规消息已删除,直接返回不触发后续指令逻辑 return # *关键*:将非违规消息交给Bot的指令解析流程处理 await bot.process_commands(message)
额外注意事项
- 新版本Discord.py要求,要读取消息内容做指令解析、违禁词检测,必须在Discord开发者后台的Bot设置页开启Message Content Intent权限,否则哪怕补了代码逻辑,也读不到消息内容。
- 你当前使用的
intents = discord.Intents().all()属于全量权限开启,生产环境建议只按需开启实际用到的 intent(比如消息读取、成员加入事件对应的权限),避免不必要的权限申请导致Bot被审核限制。
内容的提问来源于stack exchange,提问作者Nekidev
相关产品推荐
相关产品推荐

