如何使用Python json让Discord等级排行榜显示用户名而非None
修复方案
核心问题原因
- 你存储的用户ID为字符串格式,而
discord.py的bot.get_user()方法要求传入整数类型的Snowflake ID,传入字符串ID会匹配不到用户,直接返回None,这是用户名显示为None的主要原因。 - 你以经验值作为字典的key,如果多个用户经验值相同,后续用户的数据会覆盖前者,会导致排行榜缺漏用户。
bot.get_user()仅从机器人本地缓存中查询用户,如果目标用户不在缓存中也会返回None,建议改用异步的fetch_user()方法主动调用Discord API拉取用户信息。
修复后完整代码
import json import discord from discord.ext import commands async def leaderboard(ctx, x=10): # 限制排行榜展示数量边界,避免输入异常值 x = max(1, min(x, 50)) with open('level.json', 'r') as f: users = json.load(f) # 直接存储(经验值, 用户ID)元组,避免同经验覆盖问题 rank_list = [] guild_id = str(ctx.guild.id) for user_id_str in users.get(guild_id, {}): exp = users[guild_id][user_id_str]['experience'] user_id_int = int(user_id_str) rank_list.append((exp, user_id_int)) # 按经验值倒序排序 rank_list.sort(reverse=True, key=lambda x: x[0]) em = discord.Embed( title = f'本服务器前{x}等级排行', description = '服务器内等级最高的用户列表' ) for index in range(x): if index >= len(rank_list): break exp, user_id = rank_list[index] try: member = await bot.fetch_user(user_id) user_name = str(member) except: # 拉取不到用户时显示兜底文案 user_name = "未知用户" em.add_field(name = f'{index+1}: {user_name}', value = f'经验值:{exp}', inline=False) await ctx.send(embed = em)
补充注意
如果修改后依然偶发显示未知用户,请到Discord开发者后台的机器人设置页开启Server Members Intent权限,同时在机器人启动代码中添加成员意图配置:
intents = discord.Intents.default() intents.members = True bot = commands.Bot(command_prefix='你的命令前缀', intents=intents)
内容的提问来源于stack exchange,提问作者Ryan Avery
相关产品推荐
相关产品推荐

