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

