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

discord.py用户状态始终显示离线问题及Bot识别优化咨询

问题解决:Discord.py 用户状态显示异常、Intents配置与代码优化

一、用户状态始终显示离线的解决方法

这个问题核心是未正确启用成员意图(Members Intent)和在线状态意图(Presence Intent):

  1. 登录Discord开发者平台,找到你的Bot应用,在「Privileged Gateway Intents」中开启「Server Members Intent」和「Presence Intent」。
  2. 在代码初始化Bot客户端时,必须明确声明启用这些Intents:
import discord
from discord.ext import commands

# 初始化并配置Intents
intents = discord.Intents.default()
intents.members = True  # 启用成员意图,用于获取成员详细信息
intents.presences = True  # 启用在线状态意图,用于获取用户在线状态

# 初始化Bot客户端
client = commands.Bot(command_prefix="你的命令前缀", intents=intents)

注意:member.status是获取用户在线状态的正确方式,换成activities无效——activities是指用户的活动(如游戏、流媒体),和在线状态无关。

二、Cogs中使用Intents的说明

Intents是在Bot客户端初始化时全局配置的,不需要在Cogs里单独设置。只要初始化Client时开启了对应权限,Cogs通过self.client即可直接使用已配置好的Intents,相关功能(如获取成员状态、信息)会自动生效。

三、优化Bot识别逻辑,合并重复分支

原代码中Bot和普通用户的分支存在大量重复代码,可合并为单一逻辑,仅动态调整差异部分:

import discord
from discord import app_commands
from discord.ext import commands

class User(commands.Cog):
    def __init__(self, client):
        self.client = client

    @commands.Cog.listener()
    async def on_ready(self):
        print("user模块已加载完成")
    
    @app_commands.command(name='user', description='查询用户或机器人信息')
    @app_commands.describe(member='指定查询对象(留空则查询自己)')
    async def user(self, interaction: discord.Interaction, member: discord.Member = None):
        member = interaction.user if not member else member
        
        # 动态设置标题与描述
        if member.bot:
            embed_title = '机器人信息'
            embed_desc = f'{member.mention} <---- 这是一个机器人'
        else:
            embed_title = '用户信息'
            embed_desc = member.mention
        
        embed = discord.Embed(title=embed_title, description=embed_desc)
        embed.add_field(name="在线状态", value=str(member.status).capitalize())
        embed.add_field(name="是否为机器人", value='是' if member.bot else '否')
        
        # 仅为机器人添加头像缩略图
        if member.bot:
            embed.set_thumbnail(url=member.avatar.url)
        
        embed.set_footer(text=f'查询者:{interaction.user}', icon_url=interaction.user.avatar.url)
        
        await interaction.response.send_message(embed=embed)
        
async def setup(client):
    await client.add_cog(User(client))

优化点说明:

  • 合并重复的Embed创建逻辑,仅动态修改差异内容(标题、描述、缩略图)
  • 修复member.avatar直接作为URL的问题,需使用member.avatar.url才能正确获取图片链接
  • 将状态值转为首字母大写,提升显示友好度
  • 规范类名与注释,提升代码可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:57:26