如何使用Discord.py获取Discord用户的个人资料徽章?
解决discord.py获取用户徽章为空的问题
问题根源
你的代码存在两个核心问题:
- 依赖字符串替换处理徽章数据,逻辑脆弱且无法适配discord.py的对象结构
- 未刷新用户数据,本地缓存的
User/Member对象可能未包含完整的徽章信息
修复方案
使用discord.py v2.x的标准API获取并处理徽章,同时强制刷新用户数据确保准确性:
完整代码示例
import discord async def get_user_badges(message): if not message.mentions: return [] # 获取第一个提及的用户 target_user = message.mentions[0] # 强制刷新用户数据,确保获取最新的徽章信息 try: target_user = await target_user.fetch() except (discord.Forbidden, discord.HTTPException): # 无权限获取或网络异常时返回空列表 return [] # 获取所有激活的公开徽章枚举对象 active_badge_flags = target_user.public_flags.all() # 转换为可读名称列表(可直接用于Embed展示) readable_badges = [] for flag in active_badge_flags: # 将枚举名称转换为友好格式,比如"VERIFIED_BOT_DEVELOPER" → "Verified Bot Developer" friendly_name = flag.name.replace("_", " ").title() readable_badges.append(friendly_name) # 若需要返回徽章枚举对象(用于关联图标等自定义逻辑),直接返回active_badge_flags即可 return readable_badges
关键说明
await target_user.fetch():必须调用此方法刷新用户数据,避免缓存数据缺失徽章信息public_flags.all():直接返回当前用户激活的所有公开徽章枚举成员,无需字符串截取- 错误处理:捕获权限不足和网络异常,避免程序崩溃
关联徽章图标示例
如果需要在Embed中展示徽章图标,可以建立名称与CDN图标的映射:
# 示例:Discord官方徽章图标映射(可根据需要补充) BADGE_ICON_MAP = { "Staff": "https://cdn.discordapp.com/emojis/749289660875962428.png", "Partner": "https://cdn.discordapp.com/emojis/749289661230551060.png", "Hypesquad Events": "https://cdn.discordapp.com/emojis/749289661016760320.png", "Bug Hunter Level 1": "https://cdn.discordapp.com/emojis/749289660991502377.png", "Verified Bot Developer": "https://cdn.discordapp.com/emojis/749289661396758548.png" } # 在生成Embed时使用 badges = await get_user_badges(message) embed = discord.Embed(title="用户徽章") for badge in badges: icon_url = BADGE_ICON_MAP.get(badge) if icon_url: embed.add_field(name=badge, value=f"", inline=True)
内容的提问来源于stack exchange,提问作者Nerd Bear
相关产品推荐
相关产品推荐

