【问题标题】:Anybody knows how to send a audio/image using NodeJs to a Telegram bot?有人知道如何使用 NodeJs 将音频/图像发送到 Telegram 机器人吗?
【发布时间】:2025-11-30 06:05:01
【问题描述】:

我正在尝试使用 nodeTelegram Api(在本例中为 sendAudio)将音频文件发送到 Telegram 机器人

const axios = require('axios');
const FormData = require('form-data');

let payload = new FormData();
payload.append('chat_id', 'ID');
payload.append('audio', './audio.mp3');
// OR  payload.append('photo', fs.createReadStream(`./audio.jpg`));

axios.post(
    'https://api.telegram.org/botMyToken/sendAudio',
    payload,
    {
        headers: {
            'accept': 'application/json',
            'Content-Type': `multipart/form-data;`
        }
    })
    .then(function (response) {
        console.log(response);
    })
    .catch(function (error) {
        console.log(error);
    });

控制台结果是一个大对象:

Error: Request failed with status code 400
at createError (/Users/username/TelegramBot/MyBot/node_modules/axios/lib/core/createError.js:16:15)
at settle (/Users/username/TelegramBot/MyBot/node_modules/axios/lib/core/settle.js:18:12)
at IncomingMessage.handleStreamEnd (/Users/username/TelegramBot/MyBot/node_modules/axios/lib/adapters/http.js:201:11)
at IncomingMessage.emit (events.js:185:15)
at endReadableNT (_stream_readable.js:1101:12)
at process._tickCallback (internal/process/next_tick.js:114:19) 

headers:
  { Accept: 'application/json, text/plain, */*',
    'Content-Type': 'multipart/form-data;',
    accept: 'application/json',
    'Accept-Language': 'en-US,en;q=0.8',
    'User-Agent': 'axios/0.18.0' },
  method: 'post',
  url: 'https://api.telegram.org/botMyToken/sendAudio',
  data:
   FormData {
    _overheadLength: 210,
    _valueLength: 89,
    _valuesToMeasure: [],
    writable: false,
    readable: true,
    dataSize: 0,
    maxDataSize: 2097152,
    pauseStreams: true,
    _released: true,
    _streams: [],
    _currentStream: null,
    _boundary: '--------------------------432591578870565694802709',
    _events: {},
    _eventsCount: 0 } },

我做错了什么? 我尝试使用简单的表单发送相同的文件,并且 PHP 并且它有效,我不明白这段代码有什么问题。

【问题讨论】:

  • console.log(error) 输出什么?
  • 刚刚更新问题

标签: node.js post upload axios telegram-bot


【解决方案1】:

您发送的不是音频文件,而是包含 本地 文件路径的字符串,Telegram 当然没有访问权限。

要发送的音频文件。将 file_id 作为字符串传递以发送音频文件 存在于 Telegram 服务器上(推荐),将 HTTP URL 传递为 Telegram 用于从 Internet 获取音频文件的字符串,或 使用 multipart/form-data 上传一个新的。

电报文档清楚,audio必须是:

  • file_id
  • 网址
  • 使用 multipart/form-data 发布文件

你可以试试这个:

payload.append('audio', fs.createReadStream('./audio.mp3'));

我建议使用telegraf,它将完成所有繁重的工作,并允许您使用本地文件路径。

const bot = new Telegraf(process.env.BOT_TOKEN);

bot.on('message', (ctx) => {

  // send file
  ctx.replyWithAudio({ source: './audio.mp3' })

});

bot.startPolling();

【讨论】:

  • 不要,就像我告诉你的那样,为audio 发送有效数据,而不是本地路径,这是你的确切问题,正如我的回答所描述的那样。
  • 你能告诉我如何发送文件音频,这是我想要得到的
  • 更新了我的答案
  • 没有 axios 很容易,这是你如何处理请求的问题,我自己从未使用过 axios,但我建议使用 telegraf,否则你将很难自己编写所有代码。几个小时后我回家用 axios 测试。
  • 就是我说的,axios不如request模块imo。
【解决方案2】:

我推荐你使用 FormData 模块的 getHeaders() 函数。这解决了我将照片发送到电报机器人的问题

payload.append('photo', fs.createReadStream(`./audio.jpg`));
... 
headers: payload.getHeaders()
...

【讨论】: