Я пишу очень простой телеграмм-бот, используя телеграфный бот-фреймворк. Пока он отвечает на некоторые простые команды, используя методы .hears
и .on
, пока все работает нормально.
Теперь я реализовал другой метод .hears
, который ожидает строку Miez
. Как только он «услышат» эту строку, он должен .replyWithDocument
содержать URL cat-api. URL-адрес в соответствии с cat-api предоставляет случайный cat-gif при каждом вызове. Пока мой код:
const Telegraf = require('telegraf')
const app = new Telegraf('<MY_TOKEN>')
// Connect/Express.js integration
const express = require('express')
const expressApp = express()
expressApp.set('port', (process.env.PORT || 5000));
app.command('start', (ctx) => {
console.log('start', ctx.from)
ctx.reply('Welcome!')
})
app.hears('Hi', (ctx) => ctx.reply('Hallo!'))
app.hears('Marco', (ctx) => ctx.reply('Polo'))
app.on('sticker', (ctx) => ctx.reply('❤'))
app.hears('Miez',(ctx) => {
try{
return ctx.replyWithDocument({
url: 'http://thecatapi.com/api/images/get?format=src&type=gif',
filename: 'cat.gif'
})
}catch(error){
return ctx.reply("Miau");
}
})
Итак, как видите, я обернул .replyWithDocument
в блок try/catch. Я сделал это, потому что данный url не всегда предоставляет GIF. Иногда вы просто получаете сообщение Server not found
. Я размещаю бота на Heroku, и вот журналы соответствующей ошибки:
Failed to process updates. { FetchError: request to http://30.media.tumblr.com/tumblr_lu65p0QXgW1r4xjo2o1_r1_500.gif failed, reason: getaddrinfo ENOTFOUND 30.media.tumblr.com 30.media.tumblr.com:80
at ClientRequest.<anonymous> (/app/node_modules/telegraf/node_modules/node-fetch/index.js:133:11)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:188:7)
at Socket.socketErrorListener (_http_client.js:310:9)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at connectErrorNT (net.js:1022:8)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
message: 'request to http://30.media.tumblr.com/tumblr_lu65p0QXgW1r4xjo2o1_r1_500.gif failed, reason: getaddrinfo ENOTFOUND 30.media.tumblr.com 30.media.tumblr.com:80',
name: 'FetchError',
errno: 'ENOTFOUND',
type: 'system',
code: 'ENOTFOUND' }
После этого бот перестает работать на Heroku на некоторое время, а затем снова возвращается через 15 минут или около того, я думаю, он перезапускается после некоторого времени бездействия.
Ну, в конце концов, я не возражаю против того, чтобы URL-вызов иногда терпел неудачу. Чего я не понимаю, так это почему мой блок try/catch не улавливает такое поведение. В случае, если моя интерпретация журналов верна.
Редактировать: Мне пришла в голову возможная причина, возможно, .replyWithDocument
— это асинхронный вызов. Так что HTTP-запрос успешен и попытка тоже. Но как только ответ будет Server not found
, вызов метода по-прежнему терпит неудачу. Если это может быть причиной, как с этим справиться?