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

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触发属性报错。
修改步骤
  1. 先到Discord开发者平台对应机器人的设置页,找到Privileged Gateway Intents板块,打开Server Members Intent和Presence Intent两个开关并保存。
  2. 调整代码逻辑,显式声明需要的网关意图,修正状态判断逻辑,修正计数初始值,添加重连时的计数重置逻辑。

修正后的可运行代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:09:25