!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 李四 管理员
最后再确认两个细节:
- 机器人的角色位置必须高于你要添加的目标角色,不然没有权限执行添加操作;
- 确保你拥有的角色名确实是「ADMIN」(Discord角色名区分大小写)。
内容的提问来源于stack exchange,提问作者Darrel
相关产品推荐
相关产品推荐

