Discord机器人调用guild.get_role报错:NoneType无get_role属性
问题解决:AttributeError: 'NoneType' object has no attribute 'get_role'
错误原因
你在bot还未完成Discord网关连接、未加载服务器数据时就调用了bot.get_guild(GUILD_ID),此时bot还没成功接入Discord平台,无法获取到目标服务器实例,因此guild变量是None,调用get_role自然会触发属性错误。
修复方案
必须等待bot完成启动(触发on_ready事件)后,再执行获取服务器、角色及成员的逻辑。on_ready事件是bot成功连接到Discord并完成初始化后的回调,此时才能正常访问服务器数据。
修正后的代码:
import discord from discord.ext import commands TOKEN = "你的机器人令牌" GUILD_ID = 123456789012345678 # 替换为你的服务器ID(整数类型) ROLE_ID = 987654321098765432 # 替换为你的角色ID(整数类型) bot = commands.Bot(command_prefix='+', intents=discord.Intents.all()) @bot.event async def on_ready(): print(f"已以 {bot.user} 身份登录") # 此时bot已连接,可正常获取服务器 guild = bot.get_guild(GUILD_ID) if not guild: print("无法找到目标服务器,请检查GUILD_ID是否正确,且bot已加入该服务器") return admin_role = guild.get_role(ROLE_ID) if not admin_role: print("无法找到目标角色,请检查ROLE_ID是否正确") return # 获取拥有该角色的所有用户 role_members = admin_role.members print(f"拥有该角色的用户列表:") for member in role_members: print(f"- {member.name}#{member.discriminator}") bot.run(TOKEN)
额外注意事项
- 确保
GUILD_ID和ROLE_ID是整数类型,不要用字符串包裹 - 确认你的机器人已经加入了目标服务器
- 若获取成员列表为空,需在Discord开发者后台的机器人页面,开启「Server Members Intent」权限(你代码中用了
Intents.all(),已经包含该权限,但仍需后台开启)
内容的提问来源于stack exchange,提问作者Ztuber45
相关产品推荐
相关产品推荐

