Discord.py已开启Intents仍报'NoneType'无members属性错误
报错原因
这个错误和你开没开Intents没有直接关系,核心问题是调用get_guild的时机完全错误:
client.get_guild()依赖客户端本地缓存的服务器数据,只有当机器人和Discord网关完成连接、初始数据同步完成(也就是on_ready事件触发之后),这个方法才能查到对应ID的服务器对象。- 你在
client初始化完成后立刻就调用了get_guild(sampleid),这时候机器人还没连上网关,本地缓存是空的,方法直接返回None,后续访问None.members自然会抛出'NoneType' object has no attribute 'members'错误。 - 补充:就算解决了时机问题,
discord.Intents.default()默认是关闭成员列表权限的,如果你需要读取完整的服务器成员列表,还需要在代码里手动开启members意图,和开发者后台的配置对应,否则就算拿到了guild对象,guild.members里也只会缓存机器人自身的信息。
修复步骤
- 把获取服务器对象的逻辑移动到
on_ready事件内部,确保连接就绪、缓存加载完成后再调用相关接口。 - 代码中显式开启成员意图,和开发者后台的权限配置对齐。
- 增加必要的判空逻辑兜底,避免ID填错、机器人未入群等场景触发新的报错。
- 不要用
guild.members[1]这种硬取下标的写法,成员列表的缓存顺序不固定,很容易出现下标越界、取错对象的问题,建议通过用户ID精准查询目标成员。
修复后的可运行参考代码:
import discord # 初始化意图,显式开启成员权限 intents = discord.Intents.default() intents.members = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f"机器人已上线:{client.user}") # 连接完成后再获取服务器实例 guild = client.get_guild(sampleid) # 判空兜底 if guild is None: print("获取服务器失败,请检查服务器ID是否正确、机器人是否已加入该服务器") return # 替换成你自己的业务逻辑,示例为通过ID获取指定成员 # target_user = guild.get_member(目标用户的数字ID) print(f"当前服务器共有 {guild.member_count} 名成员") # 替换为你自己的机器人Token client.run("你的机器人Token")
后续排查清单
如果调整后仍有问题,按顺序核对:
- 确认填入的
sampleid是纯数字格式的服务器ID,不是服务器名称、邀请链接或其他字符串 - 确认机器人已经被邀请进入对应服务器,没有被移出、封禁
- 确认Discord开发者门户的Bot设置页中,
Server Members Intent特权意图开关已打开,修改后记得保存配置 - 确认你使用的discord.py版本为2.0及以上,2.0版本后意图配置为强制校验项,缺省配置会导致相关接口无法正常返回数据
内容的提问来源于stack exchange,提问作者Darkly Lady
相关产品推荐
相关产品推荐

