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

!addrole命令失效求助:代码问题还是操作不当?

问题根源:代码存在多处错误,和操作关系不大

你的代码里有几个关键问题导致机器人无响应,逐个拆解:

  • Intents未配置:你直接写了intents = intents但根本没定义这个变量,Discord.py 1.5版本之后必须显式设置意图,还要去Discord开发者后台(你的机器人应用页面)开启「服务器成员意图」和「消息内容意图」,不然机器人拿不到成员、消息核心数据。
  • 缺少必要导入:get函数没导入,得在开头加from discord.utils import get——你说没报错?大概率是没看终端运行日志,实际运行时这里肯定会抛出错误。
  • API调用过时:
    • member.server要改成member.guild,Discord.py早就把server重命名为guild了;
    • await client.add_roles(member, role)要改成await member.add_roles(role),现在官方推荐通过成员对象直接调用添加角色的方法。
  • 命令逻辑不匹配需求:你原来的代码是固定给自己加「Test」角色,没有接收参数的逻辑,后来改成!addrole [member] [role]但代码没同步更新,自然没效果。
  • 无错误处理:哪怕出问题也没日志输出,你根本不知道哪里错,建议加try-except块或者打印日志排查。

修正后的代码示例

import discord
from discord.ext import commands
from discord.utils import get  # 新增get函数的导入

# 配置intents
intents = discord.Intents.default()
intents.message_content = True  # 开启消息内容意图,才能读取命令参数
intents.members = True  # 开启成员意图,才能获取成员对象

client = commands.Bot(command_prefix='!', intents=intents)

@client.command()
@commands.has_role("ADMIN") 
async def addrole(ctx, member: discord.Member, role_name: str):
    # 根据角色名获取服务器内的角色
    role = get(ctx.guild.roles, name=role_name)
    if not role:
        await ctx.send(f"找不到名为「{role_name}」的角色")
        return
    # 给指定成员添加角色
    await member.add_roles(role)
    await ctx.send(f"已给{member.display_name}添加「{role.name}」角色")

# 替换成你的机器人token后运行
client.run("你的机器人Token")

正确命令格式

修正后命令需要带两个参数:目标成员(可以@对方或者直接打用户名)、角色名,示例:

  • !addrole @张三 Test
  • !addrole 李四 管理员

最后再确认两个细节:

  1. 机器人的角色位置必须高于你要添加的目标角色,不然没有权限执行添加操作;
  2. 确保你拥有的角色名确实是「ADMIN」(Discord角色名区分大小写)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:45:54