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

discord.py中如何获取用户服务器资料的公会横幅?

Discord机器人服务器专属横幅获取问题解答

问题背景

你在开发!avatar、!banner命令时,已掌握通过member.display_avatar获取用户服务器专属(公会)头像的方法,但未找到member.display_banner这类对应属性来获取用户的服务器专属横幅,当前已实现全局用户横幅的获取逻辑,代码如下:

@commands.command(aliases=["bn"])
    async def banner(self, ctx, member: discord.Member = None):
        if member is None:
            member = ctx.author

        user = await self.bot.fetch_user(member.id)

        if user.banner is None:
            await ctx.send(embed=discord.Embed(
                description="this user has no banner."
            ))
        else:
            embed = discord.Embed(
                description=f"{user.banner.url}"
            )
            embed.set_image(url=user.banner.url)
            await ctx.send(embed=embed)

核心结论

  • 截至discord.py v2.3.x正式稳定版本,没有官方封装的member.display_banner属性,无法直接通过现成封装方法拿到用户的服务器专属横幅。
  • 出现该差异的原因是:display_avatar是早期就完成封装的属性,会自动判断用户是否设置服务器专属头像,无设置时自动回退到全局头像;而服务器专属横幅是Discord后续推出的Nitro专属功能,虽然官方API已经返回对应字段,但discord.py正式发布版本暂未将该字段封装到Member对象中。

临时实现方案

可通过调用内部未正式公开的资料加载接口拿到服务器横幅字段,注意该接口在后续版本可能随官方封装调整变动,修改后的完整可运行代码如下:

@commands.command(aliases=["bn"])
async def banner(self, ctx, member: discord.Member = None):
    if member is None:
        member = ctx.author
    
    # 加载成员在当前服务器的专属资料字段
    await member._get_guild_profile()
    guild_banner = member.guild_banner

    # 优先使用服务器专属横幅,未设置则回退到全局用户横幅
    target_banner = guild_banner
    if target_banner is None:
        user = await self.bot.fetch_user(member.id)
        target_banner = user.banner

    if target_banner is None:
        await ctx.send(embed=discord.Embed(
            description="该用户未设置横幅。"
        ))
    else:
        embed = discord.Embed(
            description=f"{target_banner.url}"
        )
        embed.set_image(url=target_banner.url)
        await ctx.send(embed=embed)

注意事项

  • 服务器专属横幅是Nitro付费用户专属功能,普通用户无设置权限,绝大多数场景下该字段返回值为None
  • 如果你使用discord.py git主分支的开发预览版,后续正式版本上线后会提供和display_avatar逻辑一致的display_banner属性,自动完成服务器横幅/全局横幅的回退判断,届时可直接调用该属性简化代码
  • 你原有的全局横幅获取逻辑本身没有问题,仅缺少服务器专属横幅的判断分支

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:22:03