discord.py机器人userinfo指令异常:用户在线/勿扰却显示离线
问题核心成因
在discord.py中读取Member.status这类实时在线状态,需要机器人拥有接收Discord网关Presence事件的权限。如果权限缺失,机器人完全收不到任何用户的状态变更推送,所有成员对象的status属性会被默认赋值为离线——这就是无论目标用户实际处于在线、勿扰(dnd)状态,指令始终返回离线的根本原因。
分步排查与解决步骤
1. 开启机器人后台的特权意图权限
- 登录Discord开发者平台,进入对应机器人的应用管理页面
- 左侧导航栏切换到「Bot」配置页,下滑找到「Privileged Gateway Intents」(特权网关意图)板块
- 打开两个权限开关:
Presence Intent:用于接收用户实时在线状态、活动变更推送Server Members Intent:用于获取服务器内的完整成员列表、成员属性数据
- 保存后台配置修改
2. 在Bot初始化代码中显式声明意图
仅在后台开启权限还不够,discord.py v1.5+、v2.x 版本要求代码层面显式声明需要加载的意图,否则即使后台开了权限,客户端也不会加载对应事件。
修改你的Bot初始化代码:
# 顶部导入基础模块 from discord.ext import commands import discord # 实例化默认意图集,再手动开启需要的权限 intents = discord.Intents.default() intents.presences = True # 允许读取用户状态 intents.members = True # 允许读取服务器成员数据 # 初始化Bot时传入intents参数 client = commands.Bot( command_prefix="你的实际指令前缀", intents=intents )
如果你之前的初始化代码完全没有传入
intents参数,就是最直接的问题点。
3. 验证与排错
- 配置完成后重启Bot,重新运行
userinfo指令测试 - 如果仍有异常,可以在
userinfo命令内加入临时调试代码,确认配置生效:
查看控制台输出,确认两个意图的值都为# 在获取status的位置加一句打印 print(f"调试输出:目标用户实际状态值为 {user.status};当前Bot已开启presence意图:{client.intents.presences};已开启members意图:{client.intents.members}")True,且返回的status值和实际状态匹配。 - 版本兼容检查:如果调试输出显示意图已开启但状态仍为离线,检查当前安装的discord.py版本,过旧的v1.4及以下版本对新意图机制存在兼容问题,可升级到正式稳定版后重试。
补充说明
你现有代码中读取status、构造Embed的逻辑本身没有问题,只要意图配置正确,就会正常返回online、dnd、idle、offline等对应状态,不需要修改这部分业务代码。
内容的提问来源于stack exchange,提问作者ChaoticNebula
相关产品推荐
相关产品推荐

