Встроенные кнопки в Telegram Bot API — pyTelegramBotAPI

Добрый день уважаемые читатели, давайте рассмотрим, какие основные типы встроенных кнопок предлагают чат-боты telegram и в чем их особенности. Статья будет полезна всем, кто хочет разобраться в возможностях взаимодействия с пользователями telegram в версии bot API 2.0.

Для обзора возможностей нам понадобится установить 3 целых 2 десятых Python`a и пару ложек pyTelegramBotAPI. Особенности настройки и регистрации чат-бота мы рассматривать не будем, т.к. есть множество статей на эту тему.

И так, что же такое встроенные кнопки(клавиатура) в мессенджере Telegram? Это кнопки которые выводятся во внутренней области чата и привязываются к конкретному сообщению. Они жестко связаны с сообщением(если удалить сообщение, внутренние кнопки так же удаляются вместе с ним.). Они дают возможность динамически видоизменять его.

В данный момент есть три типа встроенных кнопок:


URL-кнопки




Для создания кнопки используется тип InlineKeyboardMarkup, давайте создадим кнопку «Наш сайт»:

@bot.message_handler(commands = ['url'])
def url(message):
    markup = types.InlineKeyboardMarkup()
    btn_my_site= types.InlineKeyboardButton(text='Наш сайт', url='https://habrahabr.ru')
    markup.add(btn_my_site)
    bot.send_message(message.chat.id, "Нажми на кнопку и перейди на наш сайт.", reply_markup = markup)

Тут название говорит само за себя, это тип кнопок предназначен для перенаправления пользователя по ссылке, с соответствующим предупреждением. Кнопка имеет соответствующий ярлычок в правом верхнем углу, чтобы дать понять пользователю, что это ссылка.

Switch-кнопки


Этот тип кнопок предназначен для перенаправления пользователя в какой либо чат, с последующей активацией (встроенного) inline-режима общения с ботом. Данный режим можно активировать вручную: в чате, вводим: "@название бота", но switch-кнопки позволяют это сделать автоматически (помогая знакомиться с inline-режимом новичкам).

Для того что-бы создать подобный переключатель, необходимо указать аргумент switch_inline_query либо пустой, либо с каким-либо текстом.
@bot.message_handler(commands = ['switch'])
def switch(message):
    markup = types.InlineKeyboardMarkup()
    switch_button = types.InlineKeyboardButton(text='Try', switch_inline_query="Telegram")
    markup.add(switch_button)
    bot.send_message(message.chat.id, "Выбрать чат", reply_markup = markup)

Теперь, если мы нажмем на кнопку и выберем чат, вот что получится:
Шаг 1:

Нажимаем на кнопку.

Шаг 2:

Выбираем чат.

Шаг 3:

Активировался встроенный inline-режим.

Callback-кнопки


Ну и наконец самое интересное — это кнопки с обратной связью: позволяют динамически обновлять сообщение/встроенные кнопки (не засоряя при этом ленту), а так же отображать уведомление в верху чат-бота или модальном окне.

Например, их можно использовать для просмотра длинного сообщения, аналогично пагинации страниц на сайтах, или например сделать календарь. Я не стану изобретать велосипед, а через поиск по GitHub, найду готовую библиотеку calendar-telegram. Выполнив указанные инструкции, получаем готовый календарь, который можно динамически изменять по нажатию на соответствующие кнопки:


@bot.message_handler(commands=['calendar'])
def get_calendar(message):
    now = datetime.datetime.now() #Текущая дата
    chat_id = message.chat.id
    date = (now.year,now.month)
    current_shown_dates[chat_id] = date #Сохраним текущую дату в словарь
    markup = create_calendar(now.year,now.month)
    bot.send_message(message.chat.id, "Пожалйста, выберите дату", reply_markup=markup)


Так же можно добавить уведомление по нажатию на дату, для этого достаточно указать сообщение в ответе:

bot.answer_callback_query(call.id, text="Дата выбрана")


(Пример в десктопной версии)


(Пример в мобильной версии)

Если изменить show_alert на True, то мы получим модальное окно:
bot.answer_callback_query(call.id, show_alert=True, text="Дата выбрана")



Заключение


По последним данным, в нашумевшем мессенджере Telegram регистрируются больше 600к пользователей ежедневно. Именно поэтому важно подхватить тренд и разобраться с его основными особенностями, т.к. различные методы взаимодействия с ботами существенно облегчает жизнь разработчиков и пользователей.



Cпасибо за Ваш интерес к данной теме.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 7

    0

    А можно раскрыть тему длинных текстов в кнопках, которые обре0аются при выводе на экран?

      0
      Не по кнопкам, но по телеботам
      Кто бы просвятил по таким вопросам:
      — В вебе пишут, что перевод строки делается через %0A, но у меня работает только старый добрый \r\n.
      — Если текст отправляется как markdown, а разметки markdown не содержит, то отправка падает с ошибкой (код 400). Как корректно валидировать тип текста перед отправкой?
      — Как корректно поступать с конфиденциальной информацией? Например пароль авторизации пользователем, можно как-то поудалять из истории сообщений для бота те сообщения, где пользователь сообщает пароль?
      — Пользователь добавил бота, отправил ему /start, но я не вижу ни его телефона, ни его логина по которым можно было бы напрямую связаться, только chat_id. Как получить контактные данные и отправлять сообщения по логину пользователя (например обновления новостей из его личной ленты). Возможно ли ботом по команде отправить пользователя в чат с другим пользователем? Не в общий канал, а именно личный чат
        0
        — Как корректно поступать с конфиденциальной информацией? Например пароль авторизации пользователем, можно как-то поудалять из истории сообщений для бота те сообщения, где пользователь сообщает пароль?

        ответ здесь
        и
        здесь

        — Пользователь добавил бота, отправил ему /start, но я не вижу ни его телефона, ни его логина по которым можно было бы напрямую связаться, только chat_id.

        ответ здесь
        0
        icmizer, не подскажете, существуют ли какие-то ограничения на количество инлайн-кнопок в одном сообщении от бота?
          0
          не проверял и для обычных задач не сталкивался с ограничениями.
            0
            redflasher, 50 кнопок для всплывающего меню. А если говорить о кнопках в самом чате, то созданная inline_keyboard должна быть не длиннее 16384 символов. Лично у меня как-то так.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое