Telegraf бот прекратил принимать сообщения. Никаких ошибок не показано
У меня есть бот для принятия запросов, и есть веб-интерфейс для ответа на эти запросы. В последнее время я несколько раз заметил, что бот просто прекращает принимать запросы от клиентов. Это было 13го ноября, и вот 2го декабря. Раньше такого никогда не было, бот спокойно проработал 7 месяцев. Сервер в это время не обновлялся, код тоже.
Никаких ошибок, ничего. Также, ответы на эти "запросы", отправляемые с веб-интерфейса, проходят через этот же самый бот, и вроде бы доставляются клиентам без проблем. Бот токена актуальный и валидный.
Что случилось в ноябре? Может Телеграм ввел какие-то новые правила для ботов, может кто-то знает? Инициализация бота вполне себе стандартная:
import { Telegraf, Markup, Composer, Scenes, session } from 'telegraf'
import { message } from 'telegraf/filters'
import { Mongo as mongoSession } from "@telegraf/session/mongodb";
import { stages as menuWizardStages } from './wizards/menu'
import { stages as newTicketWizardStages } from './wizards/newTicket'
import { stages as oldTicketWizardStages } from './wizards/oldTicket'
import { startHandler } from './commands'
import { blockedUserHandler } from './commands'
import handleMessage from './handleMessage'
import mediaGroup from 'telegraf-media-group'
export async function setupBot() {
try {
console.log('in setupBot')
await global.getDBInitialized();
const bot = new Telegraf(process.env.BOT_TOKEN)
bot.telegram.setMyCommands([
{ command: 'start', description: 'Start' },
]).catch(e => console.warn(e));
bot.telegram.setMyDescription("My bot description").catch(e => console.warn(e));
global.telegrafBot = bot;
bot.use(blockedUserHandler)
bot.use(session()); // { store: dbSessionStore }
const menuWizard = new Scenes.WizardScene('menuWizard', ...menuWizardStages);
const newTicketWizard = new Scenes.WizardScene('newTicketWizard', ...newTicketWizardStages);
const oldTicketWizard = new Scenes.WizardScene('oldTicketWizard', ...oldTicketWizardStages);
bot.use(mediaGroup());
const stages = new Scenes.Stage([menuWizard, newTicketWizard, oldTicketWizard])
bot.use(stages.middleware());
bot.start(startHandler)
bot.on('edited_message', async function (ctx) {
return await ctx.reply(`We do not process messages edits`)
})
bot.on('message', handleMessage)
bot.launch()
// Enable graceful stop
process.once('SIGINT', function () {
console.log('bot stopping with SIGINT')
bot.stop('SIGINT')
})
process.once('SIGTERM', function () {
console.log('bot stopping with SIGTERM')
bot.stop('SIGTERM')
})
console.log('Bot is launched.')
} catch (e) {
console.warn(e)
}
}
Обычно, когда юзер отправляет /start в наш бот, бот принимает этот запрос и показывает некое меню. Когда появляется описываемая проблема, бот ничего не делает, даже на /start не отвечает.
Код для обработки /start:
export const startHandler = async function (ctx) {
console.log('startHandler, ctx.scene', !!ctx.scene, 'ctx.wizard', !!ctx.wizard)
await ctx.scene?.leave();
await ctx.scene?.enter('menuWizard');
return;
}
У меня логи по всему приложению, каждое действие и прохождение по визардам логгируется. В какой-то момент, бот просто перестает обрабатывать сообщения. В данный момент у нас примерно 150 запросов в день.
Я сейчас "фиксю" эту проблему рестартом процесса бота на моем сервере, пришлось добавить перезапуск каждую ночь. Это костыль, нужно реальное решение.