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

Обработка нажатия кнопки в телеграмм боте?

Создал бота, и застрял на том что не могу понять как отправить при нажатии на кнопку в телеграмме, послать запрос на сервер? Есть ссылка при переходе на которую происходит действие какое-либо, подскажите как мне сделать что бы я мог при нажатии в боте отправить этот запрос на сервер ?
  • Вопрос задан
  • 11002 просмотра
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@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': ...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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