如何制作无需输入指令即可自动修改用户昵称的Discord专属频道
实现方案
你之前代码的核心错误点
- 事件参数命名错误:
on_message事件接收的参数是discord.Message类型对象,不是命令上下文ctx,常规命名为message/msg - 事件函数命名错误:使用
@bot.event装饰器时,事件函数名必须和官方定义的事件名完全一致(即on_message),不能加bot.前缀 - 语法逻辑错误:第一段代码的
else分支位置错误,if分支执行return后无需再写else - 协程未等待:
Member.edit是异步协程方法,必须加await关键字调用否则会抛出未等待警告 - 缺少原消息删除逻辑:未实现发送后删除用户原消息的需求
- 缺少命令兼容处理:重写
on_message事件后如果不加process_commands调用,会导致你定义的其他前缀命令全部失效 - 权限边界遗漏:机器人无法修改角色等级高于自身的用户、服务器所有者的昵称,需要加异常捕获避免报错
正确可运行代码
@bot.event async def on_message(message): # 跳过机器人自身发送的消息,避免循环触发 if message.author.bot: await bot.process_commands(message) return # 匹配指定昵称修改频道ID NICKNAME_CHANNEL_ID = 853665391272263691 if message.channel.id != NICKNAME_CHANNEL_ID: await bot.process_commands(message) return # 提取消息内容作为昵称,可自行删除.lower()取消强制小写 new_nick = message.content.strip().lower() # 昵称不能为空,避免清空用户昵称 if not new_nick: await bot.process_commands(message) return try: # 执行修改昵称操作 await message.author.edit(nick=new_nick) # 删除用户发送的原消息 await message.delete() # 捕获权限不足异常 except discord.Forbidden: # 3秒后自动删除提示消息,避免刷屏 await message.channel.send("无法修改你的昵称,请确认我的角色等级高于你,且我拥有修改昵称权限", delete_after=3) await message.delete() except Exception as e: print(f"修改昵称出错: {str(e)}") await message.delete() # 保证其他前缀命令、斜杠命令正常运行 await bot.process_commands(message)
额外配置注意事项
- 请在Discord开发者后台给机器人开启
Server Members Intent权限,否则无法获取成员信息执行修改操作 - 机器人在服务器中的角色位置必须拖动到所有普通用户角色的上方,否则无法修改高等级角色用户的昵称
- 请给机器人授予
管理昵称和管理消息权限,保证可以正常修改昵称和删除频道内的消息
内容的提问来源于stack exchange,提问作者hacknorris
相关产品推荐
相关产品推荐

