使用Node.js调用Telegram Bot API发送音频遇400错误求排查
问题排查与修复方案
我来帮你搞定这个400错误的问题——你的Node.js代码里有几个关键细节没处理对,导致Telegram API无法正确解析你的请求:
核心问题分析
- 错误的文件传递方式:你直接把文件路径字符串
'./audio.mp3'传给了audio字段,但Telegram的sendAudio接口需要的是文件流,不是纯文本路径 - 手动设置Content-Type导致格式错误:你硬写了
'multipart/form-data;',但没有带上form-data自动生成的boundary(分隔符),这会让API无法正确拆分请求中的各个字段 - 缺少fs模块引入:代码里用到了
fs.createReadStream但没引入fs模块,这会导致运行时错误(虽然你的报错里没体现,但这是潜在问题)
修正后的完整代码
const axios = require('axios'); const FormData = require('form-data'); const fs = require('fs'); // 必须引入fs模块 // 初始化FormData let payload = new FormData(); payload.append('chat_id', '你的真实ChatID'); // 替换成实际的chat_id payload.append('audio', fs.createReadStream('./audio.mp3')); // 用文件流传递音频 // 发送请求 axios.post( 'https://api.telegram.org/bot你的真实BotToken/sendAudio', // 替换成实际的BotToken payload, { headers: payload.getHeaders() // 直接使用form-data生成的完整headers,包含正确的boundary } ) .then(function (response) { console.log('请求成功:', response.data); }) .catch(function (error) { console.log('请求失败:', error.response?.data || error.message); });
关键修改说明
- 引入fs模块:必须通过
fs.createReadStream读取本地文件,生成可被form-data处理的文件流 - 用文件流替代字符串路径:
fs.createReadStream('./audio.mp3')会把本地文件转换成流,form-data会自动处理文件的上传格式 - 使用form-data的getHeaders():这个方法会生成包含
boundary的完整multipart/form-data头部,完全不需要手动设置Content-Type,避免格式错误 - 移除多余代码:删掉了注释里的
payload.append('photo', ...),因为sendAudio接口不需要photo字段,多余字段可能干扰API解析
额外注意事项
- 确保
./audio.mp3文件路径正确,你可以用console.log(fs.existsSync('./audio.mp3'))验证文件是否存在 - 替换代码中的
你的真实ChatID和你的真实BotToken为实际值 - 捕获错误时优先打印
error.response?.data,Telegram API通常会返回具体的错误原因(比如文件格式不支持、权限不足等)
内容的提问来源于stack exchange,提问作者Donovant
相关产品推荐
相关产品推荐

