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

discord.py中ctx.guild.members仅返回机器人无法获取全服务器成员

问题根因
  • 代码存在核心逻辑错误:你同时实例化了两个Bot对象,其中bot = Bot("e? ")既没有配置intents,甚至没有正确导入对应类,所有命令都注册在这个无效实例上;你配置了intents的client2实例没有绑定任何命令,intents配置完全没生效。
  • 观察到的chunked=False是正常现象:discord.py 1.7.3默认不会在启动时主动拉取中大型服务器的全量成员缓存,就算intents配置正确,未完成chunk的服务器guild.members只会返回已缓存的成员(通常只有机器人自身、近期触发过事件的成员)。
  • 配置路径走错了:OAuth2页面的guilds.members.read是面向普通用户授权登录的scope,机器人账号不需要配置这个权限,也不需要填写重定向URL,在这个页面操作解决不了问题。
修复步骤

1. 修正代码逻辑

删除重复的无效Bot实例,所有命令统一注册到配置了intents的Bot对象上,同时补上缺失的导入、主动拉取成员缓存的逻辑:

import discord
from discord.ext import commands
import os  # 原代码使用了os模块但未导入,补上

# 配置intents,不需要全量开启的话也可以单独写intents.members = True
intents = discord.Intents.all()
# 仅保留一个有效Bot实例
bot = commands.Bot(
    command_prefix="e? ",
    intents=intents,
    # 小服务器可以加下面这个参数,启动时自动拉取所有服务器成员缓存,不需要每次调用命令手动chunk
    # chunk_guilds_at_startup=True
)

@bot.command(name = "work")
@commands.has_permissions(administrator = True)
async def work(ctx):
    # 主动拉取当前服务器的全量成员,解决chunked=False导致的成员列表不全问题
    await ctx.guild.chunk()
    if not os.path.exists("users.txt"):
        # 写文件记得指定编码,避免中文乱码
        with open("users.txt", "x", encoding="utf-8") as f:
            for user in ctx.guild.members:
                print(user)
                f.write(f"{user.id} | {user.name}\n")
    print(f"当前服务器成员总数:{len(ctx.guild.members)}")

bot.run("你的机器人Token")

注意:guild.chunk()操作会拉取全量成员数据,服务器人数极多(超过几万成员)时不建议频繁调用,可以改用guild.fetch_members()按需查询。

2. 确认开发者后台配置

不需要操作OAuth2页面的重定向URL相关内容,只需要在开发者门户的Bot页面检查配置:

  • 找到Privileged Gateway Intents板块
  • 开启SERVER MEMBERS INTENT开关
  • 如果需要获取成员在线状态、活动信息,可以同步开启PRESENCE INTENT,仅获取成员列表的话不需要开这个
  • 保存配置后重启机器人进程即可生效

3. 确认机器人邀请链接配置正确

重新生成邀请链接时,在OAuth2的URL Generator页面只需要勾选bot scope即可,不需要勾选任何面向用户授权的scope;机器人基础权限不需要额外勾选特殊项,能正常接入服务器即可。

内容的提问来源于stack exchange,提问作者10 Rep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:21:30