使用discord.Guild.get_role()通过角色ID获取Role对象报错解决
问题:使用discord.Guild.get_role()获取角色时触发TypeError错误
我尝试用discord.Guild.get_role()方法通过角色ID获取Role对象,编写的代码为:
role = discord.Guild.get_role(role_id=config.ROLE_ID)
运行后触发TypeError错误,错误信息如下:
Traceback (most recent call last): File "C:\Users\Master\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\client.py", line 441, in _run_event await coro(*args, **kwargs) File "c:\Users\Master\Desktop\ДЗ\Python\DiscrodBot\bot.py", line 15, in on_member_join role = discord.Guild.get_role(role_id=config.ROLE_ID) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: Guild.get_role() got some positional-only arguments passed as keyword arguments: 'role_id'
我的完整代码如下:
import discord from discord.ext import commands import config intents = discord.Intents.all() intents.message_content = True bot = commands.Bot(command_prefix=config.BOT_CMD_PREFIX, intents=intents) @bot.event async def on_member_join(member): if config.IS_ADD_ROLE_CONNECTION_MEMBER: role = discord.Guild.get_role(role_id=config.ROLE_ID) await member.add_roles(role) if __name__ == "__main__": bot.run(config.BOT_TOKEN)
错误原因
- 参数传递错误:
Guild.get_role()的角色ID参数是位置必填参数,不支持role_id=这种关键字参数传递,必须直接传入ID值。 - 调用方式错误:
discord.Guild.get_role()是实例方法,不能直接通过类调用,必须使用具体的服务器(Guild)实例来调用。
修复方案
修改on_member_join事件中的代码,通过member.guild获取用户加入的服务器实例,然后直接传递角色ID:
@bot.event async def on_member_join(member): if config.IS_ADD_ROLE_CONNECTION_MEMBER: # 获取用户所在服务器实例,直接传入角色ID role = member.guild.get_role(config.ROLE_ID) await member.add_roles(role)
额外注意事项
- 确认
config.ROLE_ID是整数类型的角色ID,若为字符串需要先转换为整数。 - 机器人需要拥有「管理角色」的权限,否则执行
add_roles时会触发权限不足的错误。
内容的提问来源于stack exchange,提问作者Ya_SoVuH
相关产品推荐
相关产品推荐

