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

Discord.js开发Bot无法获取非共同服务器用户头像求助

解决方案:开发Discord Bot获取跨服务器用户头像的问题

你的推测完全正确!Discord Bot的客户端缓存(client.users)只包含与Bot共同在至少一个服务器中的用户,所以开发Bot因为和目标用户没有共同服务器,client.users.get(event.user.uid)会返回undefined,自然无法读取avatarURL。下面是几个可行的解决办法:

1. 通过API直接获取用户信息(推荐)

跳过客户端缓存,直接调用Discord API获取用户对象,即使没有共同服务器也能拿到公开的用户信息(包括头像)。根据你使用的Discord.js版本,代码会略有不同:

Discord.js v12及更早版本

client.fetchUser(event.user.uid)
  .then(user => {
    const avatarUrl = user.avatarURL({ format: 'png', size: 256 }); // 可选指定格式和大小
    // 这里处理拿到的头像URL
  })
  .catch(err => {
    console.error('获取用户信息失败:', err);
    // 处理错误场景,比如用户ID无效、API速率限制等
  });

Discord.js v13+版本

client.users.fetch(event.user.uid)
  .then(user => {
    const avatarUrl = user.displayAvatarURL({ format: 'png', size: 256 });
    // 处理头像URL
  })
  .catch(err => {
    console.error('获取用户信息失败:', err);
  });

这个方法的优势是能拿到完整的用户对象,包括最新的头像状态,只要用户账号存在就可以获取。

2. 直接构造头像URL(无需API调用)

如果你能从事件 payload(比如event.user)中获取到用户的avatar哈希值,可以直接构造Discord的头像CDN链接,不需要调用API:

const userId = event.user.uid;
const avatarHash = event.user.avatar;

// 处理自定义头像和默认头像的情况
const avatarUrl = avatarHash 
  ? `https://cdn.discordapp.com/avatars/${userId}/${avatarHash}.png?size=256`
  : `https://cdn.discordapp.com/embed/avatars/${userId % 5}.png`;
  • 如果用户没有设置自定义头像,avatarHash会是null,这时候用Discord的默认头像(共5种,通过用户ID取模选择)。
  • 可以通过修改URL末尾的size参数调整头像分辨率(支持16、32、64...2048的2次幂数值)。

注意事项

  • API速率限制:Discord对API调用有频率限制,记得在代码中处理429 Too Many Requests错误,必要时添加重试逻辑。
  • 版本差异:确保你使用的Discord.js版本方法正确,v13+对用户相关方法做了重构,比如fetchUser改为client.users.fetch。
  • 隐私限制:如果用户的账号是私密状态(比如关闭了服务器外的资料可见性),API可能无法返回完整信息,但头像通常还是可以获取到的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:44:49