Pycord添加角色报错:404未知角色,但角色实际存在
解决Pycord机器人添加角色时的"Unknown Role"错误
问题描述
使用Pycord开发Discord机器人时,点击按钮执行添加角色的代码抛出discord.errors.NotFound: 404 Not Found (error code: 10011): Unknown Role错误,但目标角色实际存在。相关代码如下:
初始化代码:
import discord from discord.ext import commands # 补充原代码缺失的导入 intents = discord.Intents.all() bot = commands.Bot(intents=intents, help_command=None) class GiveRole(discord.ui.View): def __init__(self, member: discord.Member): super().__init__(timeout=None) self.server_roles = bot.get_guild(1114203090950836284).roles print(self.server_roles) self.member = member @discord.ui.button(label="G1", style=discord.ButtonStyle.green, emoji="1️⃣", row=0) async def grade1(self, button: discord.ui.Button, interaction: discord.Interaction): await self.member.add_roles(discord.utils.get(self.server_roles, id=1114212978707923167))
触发错误的代码行:
await self.member.add_roles(discord.utils.get(self.server_roles, id=1114212978707923167))
错误信息:
discord.errors.NotFound: 404 Not Found (error code: 10011): Unknown Role
解决方法
1. 改用交互对象获取服务器和角色
提前缓存的角色列表可能失效,或者服务器对象未完全加载。在按钮回调中通过interaction.guild获取当前交互所在的服务器,再直接用角色ID获取角色,这是最可靠的方式:
修改后的grade1方法:
async def grade1(self, button: discord.ui.Button, interaction: discord.Interaction): # 通过交互对象获取实时服务器,再用ID定位角色 target_role = interaction.guild.get_role(1114212978707923167) if target_role: await self.member.add_roles(target_role) # 可选:给用户发送操作反馈 await interaction.response.send_message("已添加G1角色", ephemeral=True) else: await interaction.response.send_message("找不到目标角色,请检查角色ID", ephemeral=True)
同时可删除__init__里的self.server_roles相关代码,避免无效缓存。
2. 检查机器人权限
- 确保机器人拥有管理角色权限(在服务器设置→角色→机器人角色中开启)。
- 机器人的角色位置必须高于目标角色的位置,否则无法给用户添加权限等级更高的角色。
3. 验证角色ID正确性
右键目标角色→选择「复制ID」(需先开启Discord开发者模式:设置→高级→开发者模式),对比代码中的ID是否完全一致,避免输入错误。
4. 避免提前加载服务器对象
不要在View初始化时用bot.get_guild()获取服务器,机器人启动初期可能还未完成服务器缓存,而interaction.guild是交互触发时的实时服务器对象,不会有缓存失效问题。
内容的提问来源于stack exchange,提问作者Allen Wei
相关产品推荐
相关产品推荐

