Клавиатура telegram bot api python

ReplyKeyboardMarkup¶

https://core.telegram.org/file/464001950/1191a/2RwpmgU-swU.123554/b50478c124d5914c23

class telegram. ReplyKeyboardMarkup ( keyboard , resize_keyboard = None , one_time_keyboard = None , selective = None , input_field_placeholder = None , is_persistent = None , * , api_kwargs = None ) [source] ¶ Bases: telegram.TelegramObject This object represents a custom keyboard with reply options. Objects of this class are comparable in terms of equality. Two objects of this class are considered equal, if their size of keyboard and all the buttons are equal.

  • telegram.Bot.copy_message()
  • telegram.Bot.send_animation()
  • telegram.Bot.send_audio()
  • telegram.Bot.send_contact()
  • telegram.Bot.send_dice()
  • telegram.Bot.send_document()
  • telegram.Bot.send_location()
  • telegram.Bot.send_message()
  • telegram.Bot.send_photo()
  • telegram.Bot.send_poll()
  • telegram.Bot.send_sticker()
  • telegram.Bot.send_venue()
  • telegram.Bot.send_video_note()
  • telegram.Bot.send_video()
  • telegram.Bot.send_voice()

An another kind of keyboard would be the telegram.InlineKeyboardMarkup .

  • Example usage: A user requests to change the bot’s language, bot replies to the request with a keyboard to select the new language. Other users in the group don’t see the keyboard.
  • Conversation Bot
  • Conversation Bot 2
  • keyboard (Sequence[Sequence[ str | telegram.KeyboardButton ]]) – Array of button rows, each represented by an Array of telegram.KeyboardButton objects.
  • resize_keyboard ( bool , optional) – Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to False , in which case the custom keyboard is always of the same height as the app’s standard keyboard.
  • one_time_keyboard ( bool , optional) – Requests clients to hide the keyboard as soon as it’s been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat — the user can press a special button in the input field to see the custom keyboard again. Defaults to False .
  • selective ( bool , optional) – Use this parameter if you want to show the keyboard to specific users only. Targets:
    1. Users that are @mentioned in the text of the telegram.Message object.
    2. If the bot’s message is a reply (has reply_to_message_id ), sender of the original message.
Читайте также:  Php условие не пустая

Array of button rows, each represented by an Array of telegram.KeyboardButton objects.

Optional. Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to False , in which case the custom keyboard is always of the same height as the app’s standard keyboard.

Optional. Requests clients to hide the keyboard as soon as it’s been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat — the user can press a special button in the input field to see the custom keyboard again. Defaults to False .

Optional. Show the keyboard to specific users only. Targets:

  1. Users that are @mentioned in the text of the telegram.Message object.
  2. If the bot’s message is a reply (has reply_to_message_id ), sender of the original message.

Optional. The placeholder to be shown in the input field when the keyboard is active; 1 — 64 characters.

Optional. Requests clients to always show the keyboard when the regular keyboard is hidden. If False , the custom keyboard can be hidden and opened with a keyboard icon.

classmethod from_button ( button , resize_keyboard = False , one_time_keyboard = False , selective = False , input_field_placeholder = None , is_persistent = None , ** kwargs ) [source] ¶

ReplyKeyboardMarkup([[button]], **kwargs) 

Return a ReplyKeyboardMarkup from a single KeyboardButton.

  • button ( telegram.KeyboardButton | str ) – The button to use in the markup.
  • resize_keyboard ( bool , optional) – Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to False , in which case the custom keyboard is always of the same height as the app’s standard keyboard.
  • one_time_keyboard ( bool , optional) – Requests clients to hide the keyboard as soon as it’s been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat — the user can press a special button in the input field to see the custom keyboard again. Defaults to False .
  • selective ( bool , optional) – Use this parameter if you want to show the keyboard to specific users only. Targets:
    1. Users that are @mentioned in the text of the Message object.
    2. If the bot’s message is a reply (has reply_to_message_id ), sender of the original message.
ReplyKeyboardMarkup([[button] for button in button_column], **kwargs) 

Return a ReplyKeyboardMarkup from a single column of KeyboardButtons.

  1. Users that are @mentioned in the text of the Message object.
  2. If the bot’s message is a reply (has reply_to_message_id ), sender of the original message.
ReplyKeyboardMarkup([button_row], **kwargs) 

Return a ReplyKeyboardMarkup from a single row of KeyboardButtons.

  1. Users that are @mentioned in the text of the Message object.
  2. If the bot’s message is a reply (has reply_to_message_id ), sender of the original message.

Источник

Keyboa: клавиатуры на максималках для ботов в Telegram

Боты — одна из особенностей Telegram, сделавших мессенджер столь популярным. А его встроенные клавиатуры дают разработчикам большую свободу взаимодействия с пользователями.

Keyboa помогает создавать встроенные клавиатуры любой сложности для ботов, разработанных на базе pyTelegramBotAPI.

В этой статье рассмотрим базовые возможности модуля — создание клавиатур из разных наборов данных, автоматическое и ручное распределение кнопок по рядам, объединение нескольких клавиатур в одну. Научимся создавать сложные, динамические callback, сохраняя в них информацию о выборе пользователя.

Статья рассчитана на тех, кто знает основы Telegram Bot API и хотя бы немного знаком с фреймворком pyTelegramBotAPI.

Модуль требует > Python 3.5 и ставится через pip:

В официальной документации Telegram объект inline_keyboard определен как массив, состоящий из массивов кнопок (Array of Array of InlineKeyboardButton). То есть основной массив (список) — это клавиатура в целом, а его элементы (вложенные списки) — это ряды кнопок. Не переживайте, если определение кажется сложным — позже мы разберём его на простом примере.

Предположим, что сам бот у нас уже настроен:

import os from telebot import TeleBot from keyboa import keyboa_maker token = os.environ["TELEGRAM_BOT_TOKEN"] uid = os.environ["TELEGRAM_USER_ID"] bot = TeleBot(token=token)

Создаём клавиатуру

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

fruits = [ "banana", "coconut", "orange", "peach", "apricot", "apple", "pineapple", "avocado", "melon" ]

Создадим самую простую клавиатуру, в которой каждый элемент встанет на отдельный ряд:

kb_fruits = keyboa_maker(items=fruits, copy_text_to_callback=True)

Всё, что потребовалось — передать список в items . Оставить пустой сallback_data (ответную часть кнопки) мы не можем, ведь иначе не узнаем, что нажал пользователь. Поэтому добавляем текст каждой кнопки в её callback_data , устанавливая параметр copy_text_to_callback .

Отправим сообщение пользователю:

bot.send_message( chat_id=uid, reply_markup=kb_fruits, text="Please select one of the fruit:")

Распределяем кнопки по рядам

Разместить несколько кнопок в ряд можно любым из трёх способов.

Указать количество кнопок в ряду

Определите параметр items_in_row , чтобы задать количество кнопок в ряду. Их число должно быть от одного до восьми. Больше кнопок нам не позволит добавить сам Telegram.

Создадим клавиатуру и отправим обновлённое сообщение:

kb_fruits = keyboa_maker(items=fruits, copy_text_to_callback=True, items_in_row=3) bot.send_message( chat_id=uid, reply_markup=kb_fruits, text="Please select one of the fruit:")

Использовать автоподбор

Если клавиатура создается динамически, мы не всегда знаем, сколько в ней окажется кнопок. Чтобы автоматически равномерно распределить их по рядам, установите параметр auto_alignment . Если выставить True , Keyboa попробует подобрать делитель в диапазоне от трёх до пяти, а можно задать свой диапазон в виде списка чисел от одного до восьми, например, [2, 3, 7] .

Параметр reverse_alignment_range определяет, будет ли Keyboa искать делитель с начала или с конца диапазона, указанного в auto_alignment .

Распределить кнопки вручную

С помощью Keyboa можно легко вручную задать количество кнопок в каждом ряду клавиатуры с помощью вложенных списков. Для примера объединим в ряды часть наших фруктов. Принцип остался прежним: каждый элемент основного списка — отдельный ряд клавиатуры, только теперь состоящий из нескольких элементов — кнопок.

fruitscomplex = [ "banana", ["coconut", "orange"], ["peach", "apricot", "apple"], "pineapple", ["avocado", "melon"], ] kb_fruits_complex = keyboa_maker(items=fruits_complex, copy_text_to_callback=True) bot.send_message( chat_id=uid, reply_markup=kb_fruits_complex, text="Please select one of the fruit:")

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

Управляем содержимым callback

Мы упоминали, что callback_data — это строка, которую Telegram отправляет вам после нажатия кнопки пользователем. По её содержимому вы можете понять, какая именно кнопка была нажата.

Порой необходимо записать в callback_data дополнительные данные, например, идентификатор или другие свойства элемента. Чтобы задать кнопкам уникальные callback_data с требуемой информацией воспользуемся списком словарей или списком кортежей.

fruits_with_ids = [ , , , , , , , , , ] # or [ # ("banana", "101"), ("coconut", "102"), ("orange", "103"), # ("peach", "104"), ("apricot", "105"), ("apple", "106"), # ("pineapple", "107"), ("avocado", "108"), ("melon", "109"), ]

В этом случае ключ каждого словаря станет текстом кнопки, а его значение пойдет в callback_data. Для кортежей это будут нулевой и первый элементы соответственно. И поскольку мы явно указываем, что добавить в callback_data, параметр copy_text_to_callback больше не нужен.

kb_fruits = keyboa_maker(items=fruits_with_ids, items_in_row=3) bot.send_message( chat_id=uid, reply_markup=kb_fruits, text="Please select one of the fruit:")

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

Этого достаточно, если мы используем числа только для обозначения фруктовых id. А если нужно принимать разные числовые параметры, например вес или цену? Как определить, к чему относится полученное число?

С Keyboa мы можем явно указать это при создании клавиатуры. Параметр front_marker добавляет одинаковый текст в начало callback_data каждой кнопки, а back_marker , соответственно, в конец. Рассмотрим на примере:

kb_fruits = keyboa_maker(items=fruits_with_ids, front_marker="&fruit_id python"># коллбек, полученный после нажатия на кнопку, например "&fruit_id=102" selected_fruit_id = call.data available_weight = [1, 2, 5, 10, 100, ] kb_available_weight = keyboa_maker( items=available_weight, copy_text_to_callback=True, front_marker="&weight python">from keyboa import keyboa_maker, keyboa_combiner controls = [["⏹️", "⏪️", "⏏️", "⏩️", "▶️"], ] tracks = list(range(1, 13)) keyboard_controls = keyboa_maker(items=controls, copy_text_to_callback=True) keyboard_tracks = keyboa_maker(items=tracks, items_in_row=4, copy_text_to_callback=True) keyboard = keyboa_combiner(keyboards=(keyboard_tracks, keyboard_controls)) bot.send_message( chat_id=uid, reply_markup=keyboard, text="Please select the track number:")

Можно объединить сразу много клавиатур — главное, чтобы общее количество кнопок было не больше ста. Это ограничение Telegram.

Итог

В этой статье мы кратко рассмотрели создание клавиатур для ботов в Telegram с помощью Keyboa. Больше информации и описание остальных параметров можно найти на странице проекта в Github.

Буду рад вашим отзывам, идеям и конструктивной критике по развитию проекта.

Источник

Оцените статью