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

如何制作无需输入指令即可自动修改用户昵称的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 11:45:08