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

