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

Discord.py中member.status失效:用户信息命令全员显示离线如何修复?

修复Discord用户信息命令状态显示离线的问题

问题出在机器人缺少获取用户状态所需的权限(意图),以及代码未正确处理状态枚举值,按以下步骤修复:

1. 开启Discord开发者平台的意图权限

登录Discord开发者平台,进入你的机器人应用页面:

  • 切换到Bot标签页
  • 在Privileged Gateway Intents区域,开启Presence Intent和Server Members Intent两个开关

2. 修改代码启用意图

在初始化机器人时,必须显式启用所需的意图:

import discord
from discord import appcommands
from datetime import datetime
from discord.ext import commands

# 初始化意图
intents = discord.Intents.default()
intents.members = True  # 允许获取服务器成员信息
intents.presences = True  # 允许获取用户在线状态

bot = commands.Bot(command_prefix="!", intents=intents)  # 前缀可根据需求修改

3. 优化状态显示逻辑

直接输出member.status会返回枚举对象,需要转换成友好的可读文本,同时处理异常情况:
修改原代码中状态相关的行:

# 定义状态对应表情和文本
status_map = {
    discord.Status.online: "🟢 在线",
    discord.Status.idle: "🟡 空闲",
    discord.Status.dnd: "🔴 请勿打扰",
    discord.Status.offline: "⚫ 离线/隐身",
    discord.Status.invisible: "⚫ 隐身"
}
# 替换原来的状态字段
embed.add_field(name="🟢 状态", value=status_map.get(member.status, "⚫ 未知状态"))

完整修改后的命令代码

@bot.tree.command(name="user", description="显示提及用户的详细信息")
async def user(interaction: discord.Interaction, member: discord.Member = None):
    if member is None:
        member = interaction.user
    
    roles = [role for role in member.roles if role.name != "@everyone"]
    embed = discord.Embed(
        title=f"用户信息:{member.name}",
        color=0xdaddd8,
        timestamp=datetime.utcnow()
    )
    embed.set_thumbnail(url=member.avatar.url if member.avatar else member.default_avatar.url)
    embed.add_field(name="👤 用户名", value=f"{member.name}#{member.discriminator}")
    embed.add_field(name="🏷️ 昵称", value=member.display_name or "无昵称")
    embed.add_field(name="🆔 用户ID", value=member.id)
    embed.add_field(name="📆 创建账号时间", value=member.created_at.strftime("%Y-%m-%d\n%H:%M:%S"))
    embed.add_field(name="👋🏻 加入服务器时间", value=member.joined_at.strftime("%Y-%m-%d\n%H:%M:%S") if member.joined_at else "未知")
    
    # 处理状态显示
    status_map = {
        discord.Status.online: "🟢 在线",
        discord.Status.idle: "🟡 空闲",
        discord.Status.dnd: "🔴 请勿打扰",
        discord.Status.offline: "⚫ 离线/隐身",
        discord.Status.invisible: "⚫ 隐身"
    }
    embed.add_field(name="🟢 状态", value=status_map.get(member.status, "⚫ 未知状态"))
    
    embed.add_field(name="❤️‍🔥 最高角色", value=member.top_role.mention)
    bot_status = "是" if member.bot else "否"
    embed.add_field(name="🤖 是否为机器人", value=bot_status)
    embed.set_footer(text=f"查询者:{interaction.user.name}", icon_url=interaction.user.avatar.url if interaction.user.avatar else interaction.user.default_avatar.url)
    
    await interaction.response.send_message(embed=embed)

额外说明:

  • 补充了member.avatar为空时使用默认头像的处理,避免报错
  • 优化了时间格式为更清晰的YYYY-MM-DD格式
  • 修正了原代码中的语法错误

内容的提问来源于stack exchange,提问作者Hylex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:05:30