You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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);
});

关键修改说明

  1. 引入fs模块:必须通过fs.createReadStream读取本地文件,生成可被form-data处理的文件流
  2. 用文件流替代字符串路径:fs.createReadStream('./audio.mp3')会把本地文件转换成流,form-data会自动处理文件的上传格式
  3. 使用form-data的getHeaders():这个方法会生成包含boundary的完整multipart/form-data头部,完全不需要手动设置Content-Type,避免格式错误
  4. 移除多余代码:删掉了注释里的payload.append('photo', ...),因为sendAudio接口不需要photo字段,多余字段可能干扰API解析

额外注意事项

  • 确保./audio.mp3文件路径正确,你可以用console.log(fs.existsSync('./audio.mp3'))验证文件是否存在
  • 替换代码中的你的真实ChatID和你的真实BotToken为实际值
  • 捕获错误时优先打印error.response?.data,Telegram API通常会返回具体的错误原因(比如文件格式不支持、权限不足等)

内容的提问来源于stack exchange,提问作者Donovant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:04:50