Discord机器人无法正确识别头像文件扩展名问题
问题原因
你判断头像格式的逻辑存在漏洞:Discord返回的头像URL会附带查询参数(比如?size=2048),用split('.').pop()拿到的内容是gif?size=2048,而非单纯的gif,导致avatarExtension === 'gif'的条件永远不成立,GIF头像因此被误分到PNG对应的频道。
修复方案
改用正则表达式提取URL中的文件扩展名,自动忽略查询参数的干扰,同时兼容大小写差异。
修正后的代码
client.on('userUpdate', (oldUser, newUser) => { const oldAvatarURL = oldUser.displayAvatarURL({ size: 2048, dynamic: true }); const newAvatarURL = newUser.displayAvatarURL({ size: 2048, dynamic: true }); if (oldAvatarURL === newAvatarURL) return; // 用正则提取扩展名(自动忽略查询参数) const extensionMatch = newAvatarURL.match(/\.([a-z0-9]+)(?:\?|$)/i); const avatarExtension = extensionMatch ? extensionMatch[1] : ''; const canalgif = client.channels.cache.get("1076541628405272667"); const canalicon = client.channels.cache.get("1076541589062692874"); if (avatarExtension.toLowerCase() === 'gif') { const embedgif = new Discord.EmbedBuilder() .setImage(newAvatarURL) .setColor('#360d60') .setTitle('Teste gif'); canalgif.send({ embeds: [embedgif] }); } else { const embedicon = new Discord.EmbedBuilder() .setImage(newAvatarURL) .setColor('#360d60') .setTitle('teste icon'); canalicon.send({ embeds: [embedicon] }); } });
关键修改说明
- 正则
/\.([a-z0-9]+)(?:\?|$)/i负责精准匹配扩展名:- 捕获
.之后、?或URL结尾之前的字母/数字序列 - 忽略大小写,避免因扩展名大写(如
GIF)导致的匹配失败
- 捕获
- 增加
toLowerCase()统一转换为小写,进一步消除大小写差异带来的问题
内容的提问来源于stack exchange,提问作者zxszin
相关产品推荐
相关产品推荐

