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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:39:03