Задать вопрос
@menty_for_light

Почему Телеграм бот работает неправильно после serverless деплоя, но запуская с помощью bot.polling все работает. Возможно проблема с handler?

Стараюсь написать бота. Использую telebot + Yandex Cloud serverless function.

Все работало идеально, но после двух недель пользования что-то сломалось. Сел переделывать.

Если запускать код с помощью bot.polling(none_stop=True), то порядок ответов правильный. Запуская, через handler в serverless, ошибки не выдает, но порядок действий сбивается.

Как должно работать:

64903bbc24648148752450.png

Как работает:

64903bd3b3d09402170236.png

Основной код:
import telebot
from telebot import types
from telebot.handler_backends import State, StatesGroup


bot = telebot.TeleBot('TOKEN', threaded=False)


class stat(StatesGroup):
    name = State()
    category = State()
    spends = State()
    happy = State()


@bot.message_handler(commands=["start"])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton("➕ Добавить расход")
    btn2 = types.KeyboardButton("➖ Убрать последний расход")
    markup.add(btn1, btn2)
    bot.send_message(message.chat.id,
                     text="Привет, {0.first_name}! ".format(
                         message.from_user), reply_markup=markup)

@bot.message_handler(content_types=['text'])
def main(message):
    if (message.text == "➕ Добавить расход"):
        bot.set_state(message.from_user.id, stat.name, message.chat.id)
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton(" Продукты")
        btn2 = types.KeyboardButton(" Транспорт")
        bot.register_next_step_handler(message, get_category)
        markup.add(btn1, btn2)
        bot.send_message(message.chat.id, text="Выберите категорию", reply_markup=markup)
    else:
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("➕ Добавить расход")
        btn2 = types.KeyboardButton("➖ Убрать последний расход")
        markup.add(btn1, btn2)
        bot.send_message(message.chat.id, text="Мне пока рано до этой функции", reply_markup=markup)

@bot.message_handler(state=stat.category)
def get_category(message):
    if (message.text == " Продукты" or message.text == " Транспорт"):
        remove = types.ReplyKeyboardRemove()
        bot.send_message(message.chat.id, "Введите сумму", reply_markup=remove)
        with bot.retrieve_data(message.from_user.id, message.chat.id) as data:
            data['category'] = message.text
        bot.register_next_step_handler(message, get_spends)
    else:
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton(" Продукты")
        btn2 = types.KeyboardButton(" Транспорт")
        markup.add(btn1, btn2)
        bot.send_message(message.chat.id, text="Пожалуйста, выберите среди предложенных категорий", reply_markup=markup)
        bot.register_next_step_handler(message, get_category)

@bot.message_handler(state=stat.spends)
def get_spends(message):
    try:
        message.text = int(message.text)
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("1⭐️")
        btn2 = types.KeyboardButton("2⭐️")
        markup.add(btn1, btn2)
        bot.send_message(message.chat.id, text="Оцените покупку", reply_markup=markup)
        bot.register_next_step_handler(message, get_amount)
        with bot.retrieve_data(message.from_user.id, message.chat.id) as data:
            data['spends'] = message.text
    except Exception:
        bot.send_message(message.from_user.id, 'Пожалуйста, введите сумму, на которую была совершена покупка')
        bot.register_next_step_handler(message, get_spends)

def get_amount(message):
    if (message.text == "1⭐️"):
        with bot.retrieve_data(message.from_user.id, message.chat.id) as data:
            msg = ("Расход записан:\n"
               f"<b>Категория: </b> {data['category']}\n"
               f"<b>Сумма: </b> {data['spends']}\n"
               f"<b>Уровень счастья: </b> {message.text}")
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("➕ Добавить расход")
        btn2 = types.KeyboardButton("➖ Убрать последний расход")
        markup.add(btn1, btn2)
        bot.send_message(message.chat.id, text=msg, reply_markup=markup, parse_mode="html")


Файл Handler, с помощью которого запускаю бота:

import telebot
import json
from main import bot

def handler(event, _):
    message = telebot.types.Update.de_json(event['body'])
    bot.process_new_updates([message])
    return {
        'statusCode': 200,
        'body': '!',
    }
  • Вопрос задан
  • 77 просмотров
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы