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

Discord机器人userinfo命令状态显示异常求助

Discord机器人userinfo命令状态显示异常问题排查修复

问题描述

我的Discord机器人userinfo命令其余功能均正常,但无论测试用户实际处于在线/空闲状态,该命令始终显示用户为离线。状态判断代码已在代码中标记,查阅官方文档未找到有效解决方案,恳请协助排查问题。

原代码

@client.tree.command(name = "userinfo", description = "All possible info about you or someone else")
@app_commands.describe(
  user="User whos info you want to view")
async def ban(
  interaction: discord.Interaction,
  user: discord.Member = None):
    if user is None:
        user2 = interaction.user
    else:
        user2 = user
    joineddiscord = user2.created_at.timestamp()
    joinedserver = user2.joined_at.timestamp()
    roles = ', '.join([role.name for role in user2.roles])
    if user2.premium_since is None:
        isbooster = 'User is not a booster'
    else:
        isbooster = 'User is a booster'
    user_badges_flags = {
            "hypesquad_bravery": "<:braverybadge:1237791318604906577>",
            "hypesquad_balance": "<:balancebadge:1237791246278459394>",
            "hypesquad_brilliance": "<:brilliancebadge:1237790451248140409>",
            "hypesquad": "<:hypesquadeventsbadge:1237791113738190869>",
            "partner": "<:partnerbadge:1237790610837209218>",
            "verified_bot_developer": "<:earlydeveloperbadge:1237791816036778097>",
            "active_developer": "<:activedeveloperbadge:1237790946129739828>",
            "bug_hunter_lvl_1": "<:bughunterbadge:1237790732279091280>",
            "early_supporter": "<:earlysupporterbadge:1237787024606498877>",
            "staff": "<:staffbadge:1237790548937408592>",
            "discord_certified_moderator": "<:discordmodbadge:1237791913919123467>",
        }
    misc_flags_descriptions = {
            "team_user": "Application Team User",
            "system": "System User",
            "spammer": "Spammer",
            "verified_bot": "Verified Bot",
            "bot_http_interactions": "HTTP Interactions Bot",
        }

    set_flags = {flag for flag, value in user2.public_flags if value}
    subset_flags = set_flags & user_badges_flags.keys()
    badges = [user_badges_flags[flag] for flag in subset_flags]
    # STATUS CODE -------------------------------------
    if str(user2.status) == "online":
        status = '<:online:1138327529766264872>'
    elif str(user2.status) == "offline":
        status = '<:offline:1138327585516961833>'
    elif str(user2.status) == "idle":
        status = '<:idle11:1239983290744574035>'
    elif str(user2.status) == "dnd":
        status = '<:dnd11:1239983372328112148>'
    else:
        status = 'Unknown Status :question:'
    # -------------------------------------------------
    embed = discord.Embed(title="USER INFO",
                      colour=0x00b0f4)

    embed.set_author(name=f"{user2.name}",
                 icon_url=f"{user2.avatar.url}")

    embed.add_field(name="<:image_id:1238505158367776829> USER ID",
                value=f"```\n{user2.id}\n```",
                inline=True)
    embed.add_field(name="<:create:1238505341688221807> ACCOUNT CREATED",
                value=f"<t:{int(joineddiscord)}:F>",
                inline=True)
    embed.add_field(name="<:ServerJoin:1238505499566149673> JOINED SERVER",
                value=f"<t:{int(joinedserver)}:F>",
                inline=True)
    embed.add_field(name="<:Roles:1238505606227296306> ROLES",
                value=f"{roles}",
                inline=True)
    embed.add_field(name="<:boost:1138328347282251777> BOOSTER?",
                value=f"```\n{isbooster}\n```",
                inline=True)
    embed.add_field(name="<a:badges:1238505728042340422> BADGES",
                value=" ".join(badges),
                inline=True)
    embed.add_field(name="<a:IconUserStatus:1238505958049841262> STATUS",
                value=f"{status}",
                inline=True)
    await interaction.response.send_message(embed=embed)

解决方案

1. 启用机器人权限意图

这是核心问题:Discord机器人需要明确权限才能获取用户的在线状态和成员信息。

  • 登录Discord开发者门户,找到你的机器人应用
  • 进入「Bot」页面,下拉找到「Privileged Gateway Intents」
  • 开启Presence Intent和Server Members Intent
  • 保存更改

2. 初始化客户端时声明意图

在机器人初始化代码中,需要明确启用这两个意图:

import discord
from discord import app_commands

# 初始化意图
intents = discord.Intents.default()
intents.presences = True  # 启用状态意图
intents.members = True    # 启用成员意图

client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)

3. 优化状态判断逻辑

避免通过字符串匹配判断状态,直接使用discord.Status枚举值,更可靠且不易出错:
替换原状态判断代码段为:

# STATUS CODE -------------------------------------
if user2.status == discord.Status.online:
    status = '<:online:1138327529766264872>'
elif user2.status == discord.Status.offline:
    status = '<:offline:1138327585516961833>'
elif user2.status == discord.Status.idle:
    status = '<:idle11:1239983290744574035>'
elif user2.status == discord.Status.dnd:
    status = '<:dnd11:1239983372328112148>'
else:
    status = 'Unknown Status :question:'
# -------------------------------------------------

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:20:01