discord.py中@bot.command()与@bot.event()同时使用不生效如何解决
冲突原因
- 你自定义
on_message事件后,覆盖了discord.py默认的on_message实现,框架原本自动解析指令的逻辑被中断,导致@bot.command()装饰的指令无法被触发。 - 你定义的指令函数名
Send a photo包含空格,不符合Python函数命名规则,本身就会导致指令注册失败。
解决方案
- 先修正指令函数的命名,将空格替换为下划线等合法标识符,也可以通过
name参数手动指定指令触发名。 - 在
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
相关产品推荐
相关产品推荐

