You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.py中@bot.command()与@bot.event()同时使用不生效如何解决

冲突原因
  • 你自定义on_message事件后,覆盖了discord.py默认的on_message实现,框架原本自动解析指令的逻辑被中断,导致@bot.command()装饰的指令无法被触发。
  • 你定义的指令函数名Send a photo包含空格,不符合Python函数命名规则,本身就会导致指令注册失败。
解决方案
  1. 先修正指令函数的命名,将空格替换为下划线等合法标识符,也可以通过name参数手动指定指令触发名。
  2. 在on_message事件的所有逻辑执行完成后,添加await bot.process_commands(msg),手动调用框架的指令解析流程,让消息可以继续匹配指令。

修正后的参考代码如下:

import random
# 这里假设你已经正确初始化了bot实例、加载了jdata配置

# 修正后的指令函数,函数名无空格,默认指令触发名为send_a_photo
@bot.command()
async def send_a_photo(ctx):
    # 如果是发送本地图片可以额外添加file参数,这里保留你原有的逻辑
    await ctx.send('image_1')

@bot.event
async def on_message(msg):
    keyword = ['morning','goodbye']
    # 提前跳过机器人自身发送的消息,避免循环触发
    if msg.author == bot.user:
        return
    for key in keyword:
        if key in msg.content:
            if key == 'morning':
                random_morning = random.choice(jdata['GOODMORNING'])
                await msg.channel.send(random_morning)
                break
            elif key == 'goodbye':
                random_goodbye = random.choice(jdata['GOODBYE'])
                await msg.channel.send(random_goodbye)
                break
    # 必须添加这行,手动触发指令处理逻辑
    await bot.process_commands(msg)
可选优化

如果你希望某条消息匹配到关键词回复后,不再触发对应的指令,可以在关键词回复逻辑的break前添加return,直接结束on_message事件的执行,跳过后续指令解析。

内容的提问来源于stack exchange,提问作者CNWJohn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 07:06:04