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
相关产品推荐
相关产品推荐

