You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:01:09