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

