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
相关产品推荐
相关产品推荐

