能否使用discord.js给Discord自机器人消息附加本地图片?
解决Discord自机器人本地图片附件发送失败的问题
你的代码核心问题是直接将二进制文件数据放在JSON请求体中——Discord的文件上传接口要求使用multipart/form-data格式提交数据,JSON无法正确处理二进制内容,导致图片附件被忽略,仅文本发送成功。
修改后的代码
首先安装依赖包:
npm install form-data
替换原有代码为:
const fetch = require('node-fetch') const fs = require('fs'); const FormData = require('form-data'); (async () => { // 发送带本地文件的消息 async function sendMessageWithFile(channelOrThreadId, message, filePath) { const formData = new FormData(); // 添加文本内容 formData.append('content', message); // 添加本地文件(用文件流更高效) const fileStream = fs.createReadStream(filePath); formData.append('files[0]', fileStream, { filename: 'chosen.png' }); // 请匹配实际文件扩展名 // 调用Discord官方API发送消息 const response = await fetch(`https://discord.com/api/v9/channels/${channelOrThreadId}/messages`, { method: 'POST', headers: { 'Authorization': 'YOUR_AUTH_TOKEN', // 替换为你的Discord账号Token ...formData.getHeaders() // 自动生成multipart/form-data请求头 }, body: formData }); if (!response.ok) { throw new Error(`请求失败: ${response.status} ${response.statusText}`); } return await response.json(); } // 使用示例 const channelId = '你的频道ID'; const filePath = '本地图片的绝对/相对路径'; sendMessageWithFile(channelId, '这是本地图片:', filePath) .then(sentMessage => console.log('消息发送成功:', sentMessage)) .catch(error => console.error('发送失败:', error)); })()
关键修改说明
- 用
form-data包构建符合Discord要求的请求体,解决二进制文件传输的格式问题 - 使用
fs.createReadStream读取文件,比直接读二进制数据更高效且适配FormData规范 - 直接调用Discord官方API,确保请求头和请求体格式完全符合要求(避免原有
api.sendMessage的JSON请求限制)
注意事项
- 替换代码中的
YOUR_AUTH_TOKEN、频道ID和文件路径为实际值 - 文件名要和实际文件类型匹配(如jpg/png等)
- 再次提醒:Discord官方明确禁止自机器人使用,即使个人项目也存在账号永久封禁风险,请谨慎操作
内容的提问来源于stack exchange,提问作者Alilt
相关产品推荐
相关产品推荐

