You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动