Discord.py中调用display_name返回Discord用户名而非服务器自定义昵称的技术问题
解决Discord.py中
display_name返回用户名而非服务器昵称的问题 我懂你的困扰——当你通过message.mentions获取用户时,拿到的是全局User对象,它的display_name属性只会返回用户的基础Discord用户名,而非他们在当前服务器的自定义昵称。要获取服务器专属的昵称,你需要拿到对应的Guild Member对象。
核心原因
message.mentions返回的是discord.User类型的对象,这类对象代表Discord平台上的全局用户,不包含服务器专属的信息(比如自定义昵称)。而服务器内的成员信息由discord.Member对象承载,它继承自User,但额外包含了服务器相关的属性,其中就包括正确的服务器自定义昵称。
解决方案
在遍历提及用户时,通过当前服务器(message.guild)的get_member()方法,把User对象转换成Member对象,之后再访问display_name就能得到服务器内的自定义昵称了。
修改后的代码示例
针对你代码里的关键部分,调整如下:
# 遍历消息提及的用户时,直接遍历元素更简洁 for mentioned_user in message2.mentions: # 获取该用户在当前服务器的Member对象 mentioned_member = message.guild.get_member(mentioned_user.id) # 先判断用户是否仍在服务器中,避免报错 if mentioned_member: print(mentioned_member.display_name) # 现在输出的是服务器自定义昵称 if "no ping" in mentioned_member.display_name.lower(): counter += 1
额外优化小建议
- 尽量避免用
for i in range(len(...))的方式遍历列表,直接遍历元素会让代码更简洁易读。 - 如果遇到用户不在缓存中的情况,可以尝试使用
await message.guild.fetch_member(mentioned_user.id)(需要异步调用),不过get_member()会优先读取缓存,效率更高。
内容的提问来源于stack exchange,提问作者Lloyd




