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

Discord机器人报错CommandRegistrationError:on_message命令重复注册求助

解决Discord.py的CommandRegistrationError: The command on_message is already an existing command or alias

这个错误的核心原因有两个,咱们一步步拆解清楚:

1. on_message是Discord.py内置的事件函数,不是命令名

on_message是Discord.py框架专门用来监听所有消息事件的函数,它需要用@bot.event装饰器来定义,而不是@bot.command()。你用命令装饰器去注册这个名字,相当于和框架内置的功能抢命名空间,直接触发冲突。

2. 你重复注册了同名命令

哪怕on_message不是内置函数,只要你在代码里多次用@bot.command()定义名为on_message的命令(比如写了多个async def on_message(...)都加了这个装饰器),Discord.py也会报错——因为每个命令的名字必须是唯一的,不能重复注册。


修复方案

第一步:给你的命令改个专属名字

把你原本想用on_message实现的功能(比如给成员分配角色)改成一个不冲突的名字,比如assign_role、give_role这类清晰的命名。

第二步:区分事件监听和命令的写法

  • 如果是用户触发的命令(比如输入!give_role @小明 @管理员),用@bot.command(),示例代码:
@bot.command(name="give_role")  # name参数可省略,默认使用函数名
async def give_role_command(message, member: discord.Member, *, role: discord.Role):
    # 你的业务逻辑,比如给成员添加角色
    await member.add_roles(role)
    await message.reply(f"成功给 {member.mention} 分配 {role.name} 角色!")
  • 如果是监听所有消息的事件(比如自动回复关键词、过滤广告),用@bot.event,示例代码:
@bot.event
async def on_message(message):
    # 先过滤机器人自己的消息,避免循环触发
    if message.author.bot:
        return
    
    # 比如收到"hello"就回复
    if message.content.lower() == "hello":
        await message.reply("Hi there!")
    
    # 必须加这一行,否则你的命令会失效
    await bot.process_commands(message)

第三步:清理重复代码

检查整个项目,删掉所有重复用@bot.command()定义on_message的代码,确保每个命令的名字唯一。


这样修改后,你的命令和事件监听就能正常工作,不会再触发命名冲突的错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:42:55