Этот вопрос закрыт для ответов, так как повторяет вопрос Пишу бота в Telegram на Python для записи дз. Не понимаю, почему не возможно сделать три уровня?
@Kapuzev

Пишу бота в Telegram на Python для записи дз. Не понимаю, почему не возможно сделать три уровня?

Не понимаю, почему не возможно сделать три уровня @bot.message_hendler и не понимаю как работать с bot.register_next_step_handle. Прочел уже столько, что перестаю понимать обычный текст.

Мой код:

import telebot
import constants
from telebot import apihelper
proxy = constants.ip+":"+constants.port
apihelper.proxy = {'https': proxy}
bot = telebot.TeleBot(constants.token1)
a = 0
pred = ("")
class dz:
    def __init__(self, name):
        self.Algebra = None
        self.Geom = None
        self.Rus = None
        self.Liter = None
        self.Him = None
        self.Fiz = None
        self.Nem = None
        self.Biol = None
        self.Istor = None
        self.Obsh = None
        self.Geogr = None
        self.Inf = None
        self.AnglSA = None
        self.AnglTA = None
        self.InfSA = None
        self.InfTA = None
        self.Fizra = None
        self.OBZh = None



@bot.message_handler(commands=['start'])
def hendle_start(message):
    user_markup = telebot.types.ReplyKeyboardMarkup(True, True)
    user_markup.row('Понедельник', 'Вторник', 'Среда')
    user_markup.row('Четверг', 'Пятница', 'Суббота')
    user_markup.row('/admin')
    bot.send_message(message.chat.id, "Выберите день недели", reply_markup = user_markup) #включен

    @bot.message_handler(content_types='text')
    def hendle_text(message):
        if message.text == "Понедельник":
            bot.send_message(message.chat.id, "ПОНЕДЕЛЬНИК")
            bot.send_message(message.chat.id, "Алгебра")
        elif message.text == "Вторник":
            bot.send_message(message.chat.id, "Выбран вторник")
        elif message.text == "Среда":
            bot.send_message(message.chat.id, "Выбрана среда")
        elif message.text == "Четверг":
            bot.send_message(message.chat.id, "Выбран четверг")
        elif message.text == "Пятница":
            bot.send_message(message.chat.id, "Выбрана пятница")
        elif message.text == "Суббота":
            bot.send_message(message.chat.id, "Выбранна суббота")

@bot.message_handler(commands=['admin'])
def hendle_admin(message):
    bot.send_message(message.chat.id, "Введите пароль")
    @bot.message_handler(content_types='text')
    def hendle_text(message):
        if message.text == constants.password:
            bot.send_message(message.chat.id, "Пароль верен")
            while a == 0:
                user_markup = telebot.types.ReplyKeyboardMarkup(True, True)
                user_markup.row('Алгебра', 'Геометрия', 'Русский', 'Литература')
                user_markup.row('Химия', 'Физика', 'Немецкий', 'Биология')
                user_markup.row('История', 'Обществознание', 'География', 'Информатика')
                user_markup.row('АнглийскийСА', 'АнглийскийТА', 'Физкультура', 'Обж')
                bot.send_message(message.chat.id, "Выберите предмет", reply_markup=user_markup)

                @bot.message_handler(content_types='text')
                def hendle_text(message):
                    while a == 0:
                        if message.text == "Алгебра":
                            bot.send_message(message.chat.id, "Запишите дз")

                        elif message.text == "Геометрия":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Русский":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Литература":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Химия":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Физика":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Немецкий":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "История":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Обществознание":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "География":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Информатика":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "АнглийскийСА":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "АнглийскийТА":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Физкультура":
                            bot.send_message(message.chat.id, "Запишите дз")
                        elif message.text == "Обж":
                            bot.send_message(message.chat.id, "Запишите дз")

        else:
            bot.send_message(message.chat.id, "Повторите попытку или выйдете в меню дз /start")


bot.polling(none_stop=True, interval=0)
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
tsarevfs
@tsarevfs
C++ developer
Я что-то не нашел вложенных handler. Я даже могу представить, что это работает в некоторых случаях, но не уверен что это хорошая идея.
Есть пример с register_next_step_handle:
https://github.com/eternnoir/pyTelegramBotAPI/blob...
Судя по документации, после вызова библиотека обработает следующее сообщение с помощью callback который вы ему передали.
Причем декораторы нужны только для комманд верхнего уровня.

@bot.message_handler(commands=['admin'])
def handle_admin(message):
    msg = bot.reply_to(message, "Введите пароль")
    bot.register_next_step_handler(msg, handle_admin_password)
def handle_admin_password(message):
    if message.text == constants.password:
        ...
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы