简体   繁体   中英

Send An Image With NodeJs To Telegram Bot

I am trying to send an image to telegram bot in nodejs. I created image as I desired but when I send it across, telegram returns an error like:

Unhandled rejection Error: ETELEGRAM: 400 Bad Request: IMAGE_PROCESS_FAILED
    at BaseError (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\node-telegram-bot-api\src\errors.js:10:5)
    at TelegramError (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\node-telegram-bot-api\src\errors.js:62:5)
    at request.then.err (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\node-telegram-bot-api\src\telegram.js:280:15)
    at tryCatcher (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\util.js:16:23)
    at Promise._settlePromiseFromHandler (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\promise.js:547:31)
    at Promise._settlePromise (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\promise.js:604:18)
    at Promise._settlePromise0 (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\promise.js:649:10)
    at Promise._settlePromises (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\promise.js:729:18)
    at _drainQueueStep (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\async.js:93:12)
    at _drainQueue (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\async.js:86:9)
    at Async._drainQueues (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\async.js:102:5)
    at Immediate.Async.drainQueues (C:\Users\bakaydin\OneDrive - Amadeus Workplace\Project\Workspace\Other\NodeJs\node_modules\bluebird\js\release\async.js:15:14)
    at runCallback (timers.js:672:20)
    at tryOnImmediate (timers.js:645:5)
    at processImmediate [as _immediateCallback] (timers.js:617:5)

Code:

bot.onText(/\/items/, (msg, match) => {
    const chatId = msg.chat.id;

    var qr_svg = qr.image('I love QR!', { type: 'png' });
    qr_svg.pipe(require('fs').createWriteStream('i_love_qr.png'));

    fs.readFile('i_love_qr.png', function (err, data) {
        if (err) throw err; // Fail if the file can't be read.
        console.log(data)
        bot.sendPhoto(chatId, data)
    });

    bot.sendMessage(chatId, 'test')
});

Thanks in advance

qr_svg.pipe(require('fs').createWriteStream('i_love_qr.png')) is async operation. So the very next line might be get executed even before the above line and you would not have data written to file. So when sending corrupted or no data, You probably getting bad request error. So your code should be something like below:

 bot.onText(/\/items/, (msg, match) => {
    const chatId = msg.chat.id;

    var qr_svg = qr.image('I love QR!', { type: 'png' });
    var writeStream = fs.createWriteStream('i_love_qr.png')
    qr_svg.pipe(writeStream);
    writeStream.on('finish', () => {
    fs.readFile('i_love_qr.png', function (err, data) {
        if (err) throw err; // Fail if the file can't be read.
        console.log(data)
        bot.sendPhoto(chatId, data)
    });

    bot.sendMessage(chatId, 'test')

   })  
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM