Discord.js v13 无法通过URL发送PNG文件附件问题咨询
问题原因
Discord.js v13配套使用的Discord API v9有两个核心变更导致旧代码失效:
- 废弃了
channel.send(content, options)的双参数传参方式,所有消息配置必须统一放在第一个入参对象中 - 禁止直接加载非HTTPS协议的外部媒体资源,你的测试链接是HTTP协议,会被直接拦截
可用解法
方案1:源站支持HTTPS时直接使用(推荐)
先将资源链接替换为HTTPS协议,显式构造MessageAttachment对象后发送,稳定性更高:
// 引入所需构造类 const { MessageAttachment } = require('discord.js'); const testchart = `https://jegin.net/testchart2.php?sysid=268.png`; const chartAttachment = new MessageAttachment(testchart, 'file.png'); message.channel.send({ content: `Last updated ${updatedAt.fromNow()}`, files: [chartAttachment] });
方案2:源站不支持HTTPS时用中转方式
如果资源只能走HTTP获取,先拉取资源到内存Buffer后再发送:
const fetch = require('node-fetch'); const { MessageAttachment } = require('discord.js'); const testchart = `http://jegin.net/testchart2.php?sysid=268.png`; // 先请求资源转成Buffer const imgResponse = await fetch(testchart); const imgBuffer = await imgResponse.buffer(); const chartAttachment = new MessageAttachment(imgBuffer, 'file.png'); message.channel.send({ content: `Last updated ${updatedAt.fromNow()}`, files: [chartAttachment] });
之前写法错误说明
- 第一种、第二种写法保留了v12的双参数传参逻辑,属于已废弃的调用方式,不会被正常解析
- 第三种写法虽然传参格式正确,但因为传入的是HTTP协议的URL,被Discord API直接拦截所以无法加载
内容的提问来源于stack exchange,提问作者Arburich
相关产品推荐
相关产品推荐

