Стараюсь написать бота. Использую telebot + Yandex Cloud serverless function.
Все работало идеально, но после двух недель пользования что-то сломалось. Сел переделывать.
Если запускать код с помощью bot.polling(none_stop=True), то порядок ответов правильный. Запуская, через handler в serverless, ошибки не выдает, но порядок действий сбивается.
Как должно работать:
Как работает:
Основной код:
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': '!',
}