You need to enable JavaScript to run this app. discord.py 自定义@bot.command() 无法正常触发问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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事件的末尾补充指令解析的调用即可,同时要规避逻辑漏洞:

  1. 跳过机器人自身发送的消息,避免触发死循环
  2. 违规消息被删除后直接终止流程,不要继续走指令解析
  3. 普通非违规消息正常交给指令解析流程处理
    修复后的完整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 15:24:04