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

如何在Python的Hikari框架中实现类似discord.py的bot.get_user(id)功能获取Discord用户名

Hikari框架中如何通过用户ID获取用户名并定期更新JSON列表?

问题描述

我正在使用Python的Hikari框架,需要制作一份服务器所有用户的JSON列表,目前仅拥有用户的ID但缺少对应的用户名,且希望能定期更新这些用户名信息。请问如何实现类似discord.py中bot.get_user(id)的功能来获取Discord用户名?以下是我的代码片段:

def retrieveUsernames(): 
    consoleLog(color.blue,"do get usernames") # log in console 
    guild = "xxxx" 
    jsonItem = cc.getJson() #get json object 
    for key in creamCoin[guild]: 
        user = # GET USER OBJECT FROM ID 
        name = user.username 
        name = bot.rest.get_user(int(key)) 
        print(key) 
        print(name) #key acts as user 
        jsonItem[guild][key]["username"] = name #update plain text username 
        cc.updateJSONDatabase() #commit changes

解决方案

刚好在Hikari里处理过类似需求,给你梳理下正确的实现方式:

1. 修正异步调用问题

Hikari的REST API方法都是异步的,所以你的retrieveUsernames函数必须定义为async,并且调用bot.rest.get_user()时要加await关键字。另外你代码里的逻辑顺序也有问题,得先获取用户对象再提取用户名。

2. 正确获取用户对象并更新JSON

下面是修正后的核心代码:

import asyncio
import hikari

# 假设你的bot实例为`bot`,cc是你用于操作JSON的工具类

async def retrieve_usernames():
    consoleLog(color.blue, "开始获取并更新用户名...")
    guild_id = hikari.Snowflake("xxxx")  # 推荐用Snowflake类型处理Discord ID
    json_item = cc.getJson()
    
    # 遍历目标服务器下的所有用户ID
    for user_id_str in json_item[str(guild_id)]:
        try:
            user_id = int(user_id_str)
            # 异步获取用户对象
            user = await bot.rest.get_user(user_id)
            # 获取账号用户名,若要服务器昵称则用user.display_name
            username = user.username
            # 更新JSON中的用户名字段
            json_item[str(guild_id)][user_id_str]["username"] = username
            print(f"已更新用户 {user_id} 的用户名: {username}")
        except hikari.NotFoundError:
            print(f"警告:用户 {user_id_str} 不存在或无法访问")
        except Exception as e:
            print(f"处理用户 {user_id_str} 时出错: {str(e)}")
    
    # 提交JSON更新到数据库
    cc.updateJSONDatabase()
    consoleLog(color.blue, "用户名更新任务完成")

3. 实现定期更新

如果要定期执行这个更新任务(比如每天一次),可以利用Hikari的任务系统配合asyncio.sleep实现循环调度:

async def periodic_username_update():
    while True:
        await retrieve_usernames()
        # 等待24小时(单位:秒),可根据需求调整时长
        await asyncio.sleep(86400)

# 在Bot启动时启动定时任务
@bot.listen()
async def on_bot_start(event: hikari.StartingEvent) -> None:
    bot.create_task(periodic_username_update())

额外说明

  • 异常处理:一定要加上try-except块,避免因用户账号删除、离开服务器等情况导致整个任务崩溃
  • Snowflake类型:Hikari推荐用hikari.Snowflake来封装Discord的ID,能避免字符串与整数转换的潜在问题
  • 用户名vs昵称:user.username是用户的全局账号名,user.display_name是用户在当前服务器的自定义昵称,可根据需求选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:02:47