Ответы пользователя по тегу PHP
  • Обработка нажатия кнопки в телеграмм боте?

    @SwitcherN
    Начинаю изучать python
    Во-первых, надо определиться каким образом вы выводите кнопку - от этого отличаются методы обработки событий.

    Есть два вида кнопок - это кастомной клавиатура, которая заменяет собой стандартную клавиатуру, либо онлайн кнопки - выводятся под сообщением. Для того и другого варианта не забудь импортировать библиотеку:

    from telebot import types

    1. Генерация кастомной клавиатуры.

    Я делал отдельную функцию для генерации клавиатуры, которая получает в качестве аргументов. Создание клавиатуры выглядет следующим образом:

    keyboard = utilits.generate_keyboard('Сделать заказ', 'Хочу скидку на заказ', 'Изменить персональную информацию')
    bot.send_message(message.chat.id, msg, reply_markup=keyboard)


    Тут создаем keyboard с помощью функции generate_keyboard, которая у меня лежит в файле utilits. Передаем в качестве аргументов то, что должно быть написано на кнопках.

    Сама функция generate_keyboard:

    def generate_keyboard (*answer):
        keyboard = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
        for item in answer:
            button = types.KeyboardButton(item)
            keyboard.add(button)
        return keyboard


    Здесь вызываем метод ReplyKeyboardMarkup из библиотеки types. Дальше проходимся итеративно по полученным аргументам и генерируем кнопки попутно добавляя кнопки к клавиатуре - keyboard.add(button).
    Возвращаем собранную клавиатуру.

    Далее обрабатываем полученный ответ. Я для обработки полученного ответа придумал следующий костыль - статус каждого клиента, который храню вместе с его ID в базе данных. Статус - по сути место каждого клиента на пути к оформлению заказа:

    @bot.message_handler(content_types=["text"])
    def check_text_message(message):
        status = int()
        try:
            status = config.current_users[message.chat.id][0]
        except Exception as er:
            status = 0
        if status == 0:
            bot.send_message(message.chat.id, 'Извините, я запутался. Давайте начнем сначала')
            first_step(message)
        elif status == 10:
            if message.text == 'Сделать заказ':
                Dialogs.order(message) ...


    То есть проверяю статус - "elif status == 10:"
    Если мы тут и получаем ответ "Сделать заказ", то выводим следующее сообщение, которое генерируем с помощью функции order - "Dialogs.order(message)". Эта же функция у меня и меняет статус, сохраняя его по пути в БД, на случай если бот "ляжет" и забудет кто на каком этапе находиться.

    2. Генерация онлайн клавиатуры.

    Все очень походе. Вот так генерирую такой тип клавиатуры, но тут необходимо помимо надписи на самой кнопке задать еще и команду, по которой мы и будем событие обрабатывать дополнительно (callback_data):

    keyboard = utilits.generate_inline_keyboard(['Имя', 'change_name'],
                                                     ['Телефон', 'change_phone'],
                                                     ['️Адрес', 'change_adress'],
                                                     ['Вернуться обратно', 'back'])


    def generate_inline_keyboard (*answer):
        keyboard = types.InlineKeyboardMarkup()
        temp_buttons = []
        for i in answer:
            temp_buttons.append(types.InlineKeyboardButton(text=i[0], callback_data=i[1]))
        keyboard.add(*temp_buttons)
        return keyboard


    А это обработка событий. Тут проще, можно обрабатывать не через статус, а по конкретной callback_data:

    @bot.callback_query_handler(func=lambda call: True)
    def ans(call):
        try:
            message = call.message
            if call.data == 'change_name':
                Dialogs.change_name(message)
            elif call.data == 'change_phone': ...
    Ответ написан
    Комментировать