Кто-нибудь знает, как отправить аудио / изображение с помощью NodeJs боту Telegram? - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь отправить аудиофайл боту Telegram, используя узел и Telegram Api (в данном случае sendAudio)

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, и это сработало, я не понимаю, что не так в этом коде.

1 Ответ

0 голосов
/ 15 мая 2018

Вы отправляете не аудиофайл, а строку, содержащую локальный путь к файлу, к которому Telegram, разумеется, не имеет доступа.

Аудио файл для отправки. Передайте file_id как String для отправки аудиофайла который существует на серверах Telegram (рекомендуется), передайте URL-адрес HTTP как строка для Telegram, чтобы получить аудиофайл из Интернета, или загрузить новый, используя multipart / form-data.

Телеграмма документация ясна, audio должно быть:

  • file_id
  • URL
  • Разместите файл, используя 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();
...