Найти в Дзене
Записки сисадмина

Python. Telegram bot. Многоуровневое меню в сообщении.

В этом посте мы разбирались с Inline клавиатурами. И там же я обещал показать, как можно создать такую клавиатуру еще проще. Сказал - сделал. Разбираемся с quick_markup. Функция, которая принимает в себя словарь с кнопками. markup = quick_markup({ 'Twitter': {'url': 'https://twitter.com'}, 'Facebook': {'url': 'https://facebook.com'}, 'Back': {'callback_data': 'whatever'} }, row_width=2) Ключи полученного словаря станут текстом кнопок, значения - действиями этих же кнопок. Так из примера мы получим кнопку "Twitter", которая при нажатии будет предлагать нам перейти на сайт "https://twitter.com". У меня сразу появляется задача: Есть 6 серверов, которые подключены к системе мониторинга. По команде /server мы должны получать информацию о них. Итак, наша клавиатура готова. Настало время делать многоуровневое меню. Я предполагаю, что нам будет интересно только 2 метрики: загрузка процессора и использование памяти. Как видно, при нажатии на кнопку "Server 1", мы получим callback
Оглавление

В этом посте мы разбирались с Inline клавиатурами. И там же я обещал показать, как можно создать такую клавиатуру еще проще. Сказал - сделал. Разбираемся с quick_markup.

quick_markup

Функция, которая принимает в себя словарь с кнопками.

  • Официальная документация показывает нам пример:

markup = quick_markup({

'Twitter': {'url': 'https://twitter.com'},

'Facebook': {'url': 'https://facebook.com'},

'Back': {'callback_data': 'whatever'}

}, row_width=2)

Ключи полученного словаря станут текстом кнопок, значения - действиями этих же кнопок. Так из примера мы получим кнопку "Twitter", которая при нажатии будет предлагать нам перейти на сайт "https://twitter.com".

У меня сразу появляется задача: Есть 6 серверов, которые подключены к системе мониторинга. По команде /server мы должны получать информацию о них.

  • Сервера находятся в России и Германии, поэтому наводим красоту и добавляем эмодзи, как учились здесь.
-2
  • Подготавливаем нашу клавиатуру с помощью quick_markup:
-3
  • Пишем обработчик команды /server
-4
-5

Итак, наша клавиатура готова. Настало время делать многоуровневое меню.

Многоуровневое меню

  • Добавляем клавиатуры для каждого нашего сервера по типу:
-6

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

  • Также, в каждую клавиатуру я добавляю кнопку "назад", чтобы иметь возможность вернуться в меню выше.
  • Пишем обработчик наших callback'ов:
-7

Как видно, при нажатии на кнопку "Server 1", мы получим callback server_1. Бот отредактирует отправленное сообщение, изменив в нем и текст, и клавиатуру (подставит клавиатуру kb_server1).

А вот при нажатии кнопки "Назад", бот снова выдаст нам изначальное сообщение с кнопками выбора серверов.

Заметим: здесь мы не отвечаем на callback'и.

  • Где мы будем использовать answer_callback_query ?

Мы предполагаем, что при нажатии на кнопку "Load Average" что-то произойдет. В моем случае должен выгрузиться график из системы мониторинга и отправиться пользователю.

Сейчас немного упростим:

  • Создаем словарь со всеми оставшимися callback'ами и ссылками на графики.
-8
  • Дописываем обработчик, который будет при нажатии на кнопку отправлять пользователю указанный url:
-9
  • Замечаем, что наша клавиатура многоразовая и никуда не пропадает:
-10

Советую вынести клавиатуры и созданный словарь в отдельный файл, чтобы не мусорить в скрипте с ботом.

Весь код из статьи выложил здесь.