如何使用discord.Client()通过用户ID获取Discord用户服务器昵称
问题原因说明
这不是bug,属于API设计的正常逻辑:
client.fetch_user()接口返回的是discord.User类型对象,该对象仅存储Discord平台全局的用户公开信息,不包含任何单服务器专属的属性。服务器昵称是每个服务器独立配置的属性,只有对应服务器的discord.Member类型对象才会携带该属性。discord.User的display_name属性没有服务器上下文,所以只会直接返回全局用户名,和user.name取值一致。只有discord.Member的display_name才会遵循「优先返回服务器昵称,无昵称则返回全局用户名」的逻辑。
解决方法
discord.User 无法直接转换为 discord.Member 类型,需要绑定具体的服务器上下文获取对应的Member实例,示例代码如下:
# 第一步:先获取目标服务器的Guild对象,替换为你的服务器ID guild = await client.fetch_guild(你的服务器ID) # 第二步:通过用户ID获取该服务器内的Member实例 member = await guild.fetch_member(目标用户ID) # 此时即可正常获取服务器专属属性 print(member.nick) # 用户设置了服务器昵称则返回对应值,未设置则返回None print(member.display_name) # 优先返回昵称,无昵称时自动 fallback 到全局用户名 print(member.avatar_url) # 同时也支持原User对象的所有全局属性读取
注意事项
- 调用
fetch_member前需要先在Discord开发者后台的bot设置页开启Server Members Intent权限,同时确保bot在目标服务器内拥有读取成员列表的权限,否则接口会返回报错。 - 如果你的bot已经开启了成员缓存,也可以用
guild.get_member(目标用户ID)同步读取,不用await调用,但如果目标成员不在缓存中会返回None,生产环境更推荐使用异步的fetch_member方法保证取值稳定。
内容的提问来源于stack exchange,提问作者user15242190
相关产品推荐
相关产品推荐

