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
相关产品推荐
相关产品推荐

