discord.py获取在线成员(含机器人)结果仅为1如何解决
问题根因
统计在线人数恒为1不是循环逻辑错误,是Discord接口的特权意图(Privileged Intents)限制导致的:2020年底Discord调整了机器人数据获取规则,默认不会向机器人推送全量服务器成员列表、成员在线状态数据,此时ctx.guild.members列表里只会存在机器人自身的账号数据,计数结果自然永远是1。
修复方案
1. 开发者后台开启权限
进入你的机器人对应的应用管理页面,找到Bot设置页,下滑到「Privileged Gateway Intents」区域,打开两个开关:
SERVER MEMBERS INTENT:允许获取全量服务器成员列表PRESENCE INTENT:允许获取成员的在线/离线状态
修改后保存页面配置。
2. 代码侧显式启用意图
初始化机器人客户端时必须传入对应意图配置,仅开后台开关不修改代码不会生效,参考修正后的完整代码:
import discord from discord.ext import commands # 加载意图配置 intents = discord.Intents.default() intents.members = True intents.presences = True # 初始化客户端时传入intents参数,替换成你自己的命令前缀 client = commands.Bot(command_prefix="!", intents=intents) @client.command() async def printstats(ctx): online_count = 0 for user in ctx.guild.members: if user.status != discord.Status.offline: online_count += 1 await ctx.send(f"当前服务器在线成员(含机器人账号)共 {online_count} 人")
补充说明
- 如果你使用的discord.py版本低于1.5,先执行
pip install -U discord.py升级到最新稳定版,旧版本不支持意图配置,无法适配当前Discord接口规则。 - 机器人加入服务器数量不足100时,上述两个特权意图可以直接开启使用;如果机器人服务的服务器超过100个,需要向Discord提交权限审核申请才能使用这两个意图。
- 修复后重启机器人进程,再执行命令就能拿到正确的在线人数统计结果。
内容的提问来源于stack exchange,提问作者upper-productions
相关产品推荐
相关产品推荐

