discord.py遍历成员判断status==online失效问题排查
故障原因
你的代码无法正常统计有3个核心问题:
- 类型比对错误:
discord.py中member.status返回的是discord.Status枚举对象,不是普通字符串,直接和字符串"online"做相等判断永远返回False,计数逻辑根本不会触发。 - 缺少必要网关权限:默认配置下机器人不会拉取完整成员列表、成员在线状态数据,需要手动开启专属特权意图,否则
guild.members大概率只能获取到机器人自身的信息,拿不到全量成员数据。 - 初始值与逻辑漏洞:你提到变量初始化为null,Python中不存在null关键字,计数变量如果初始化为
None,执行加法运算时会直接抛出类型错误;就算初始化逻辑正常,on_ready事件会在机器人重连时多次触发,不重置计数会导致数值重复累加。 - 细节错误:代码中
my guild id是占位符,实际传入时必须是整数类型的服务器ID,不能传字符串,否则get_guild会返回None触发属性报错。
修改步骤
- 先到Discord开发者平台对应机器人的设置页,找到Privileged Gateway Intents板块,打开
Server Members Intent和Presence Intent两个开关并保存。 - 调整代码逻辑,显式声明需要的网关意图,修正状态判断逻辑,修正计数初始值,添加重连时的计数重置逻辑。
修正后的可运行代码如下:
import discord from discord import Status # 计数变量初始值必须为整数0,不能设为None online_count = 0 bot_count = 0 # 配置需要的网关意图 intents = discord.Intents.default() intents.members = True intents.presences = True client = discord.Client(intents=intents) @client.event async def on_ready(): global bot_count, online_count # 替换为你自己的服务器整数ID,不要加引号 guild = client.get_guild(你的服务器数字ID) if not guild: print("服务器获取失败,请检查ID是否正确、机器人是否已加入目标服务器") return # 每次触发就绪事件先重置计数,避免重连导致重复累加 online_count = 0 bot_count = 0 for member in guild.members: # 单独统计机器人数量 if member.bot: bot_count += 1 # 与Status枚举值比对判断在线状态 if member.status == Status.online: online_count += 1 print(f"在线成员:{member.name}") print(f"统计结束:当前服务器在线成员共{online_count}人,其中机器人{bot_count}个") # 替换为你的机器人Token client.run("你的机器人Token")
额外说明
- 如果需要统计
idle(挂机)、dnd(请勿打扰)状态的成员,对应枚举值为Status.idle、Status.dnd,离线状态对应Status.offline。 - 若机器人加入的服务器总数超过100,使用特权意图需要向Discord提交审核申请,个人使用的小机器人直接开启即可,无需审核。
内容的提问来源于stack exchange,提问作者Alexandr Nikitin
相关产品推荐
相关产品推荐

