discord.js开发pokeinfo命令时无法正确显示对应宝可梦缩略图
故障原因
- 宝可梦官方站点配置了反盗链规则,Discord拉取嵌入缩略图时的请求来源不在官方站点的允许范围内,请求会被直接拦截,因此图片无法在嵌入内渲染,仅支持手动点击链接跳转访问。
- 你手动拼接的链接本身也不符合官方站点的资源路径规则:官方图鉴页面的图片资源并不直接存放在
/us/pokedex/路径下,仅拼接文件名无法拿到真实的图片直链。
解决方案
方案一:本地托管资源(稳定性最高)
- 将所有宝可梦对应图片存放到项目本地的静态资源目录,发送消息时将图片作为附件随嵌入一同上传,直接引用附件内的图片,完全规避外部站点反盗链限制。
- 具体代码修改如下:
// 顶部引入路径处理模块 const path = require('path'); const { Message, Client, MessageEmbed, MessageAttachment } = require("discord.js"); const {Ecolor} = require("../../embeds.js") pokemon = require('../../db/pokemon.js') module.exports = { name: "pokeinfo", description: "Shares Information about specified Pokemon of the game", run: async (client, message, args) => { // 替换原有参数解析逻辑,避免多余字符影响匹配 let pkmn = args.join(' ').toLowerCase() for(var i=0;i<pokemon.length;i++){ if(pkmn == pokemon[i]._engName.toLowerCase()){ // 读取本地对应宝可梦图片创建附件 const imgPath = path.resolve(__dirname, `../../pokemon-img/${pokemon[i]._pho}`); const pkmnAttach = new MessageAttachment(imgPath, 'current-pkmn.png'); let Embed = new MessageEmbed() .setColor(`${Ecolor.pink}`) .setTitle(`Details about ${pokemon[i]._engName} :`) .setDescription(`Dex number - ${pokemon[i]._nb}`) .setThumbnail('attachment://current-pkmn.png') // 引用上传的附件图片 .addFields( {name: 'Rarity:', value:`${pokemon[i]._rare}`, inline: true }, {name: 'Evolution Chart:', value:`${pokemon[i]._evo}`, inline: true }, {name: 'Location:', value:`${pokemon[i]._loc}`, inline: false }, {name: 'Ev Yield:', value:`${pokemon[i]._ev}`, inline: true }, {name: 'Ability:', value:`${pokemon[i]._ability}`, inline: true }, {name: '__Base Stats__:', value: ` **HP** : ${pokemon[i]._baseStats._hp} **Atk** : ${pokemon[i]._baseStats._atk} **Def** : ${pokemon[i]._baseStats._def} **S. Atk** : ${pokemon[i]._baseStats._sAtk} **S. Def** : ${pokemon[i]._baseStats._sDef} **Speed** : ${pokemon[i]._baseStats._spd} **Total** : ${pokemon[i]._baseStats._total} **Growth Rate** : ${pokemon[i]._gr} **Type** : ${pokemon[i]._ty} `, inline: false }, ); // 发送时同时传入嵌入和附件 message.channel.send({ embeds: [Embed], files: [pkmnAttach] }); // 匹配到结果后跳出循环,减少不必要的遍历 break; } } }, };
注意:使用本方案需要提前将所有宝可梦图片按
_pho字段对应的文件名,存放到你项目中存放宝可梦图片的目录,注意修正代码里的图片目录路径和你实际存放路径一致。另外你提供的宝可梦样例数据中,_ty:"Grass/Poison"行末尾缺少逗号,直接运行会触发语法错误,记得补上。
方案二:使用公开无反盗链限制的宝可梦静态资源
- 选择开放热链权限、无反盗链限制的宝可梦静态资源库,将数据中
_pho字段的值替换为对应图片的直链地址(即直接访问链接可以返回图片内容、不是网页的地址),调用时直接传入直链即可正常加载。 - 该方案不需要本地存储图片,但稳定性依赖第三方资源的可用性。
内容的提问来源于stack exchange,提问作者Corey
相关产品推荐
相关产品推荐

