{"id":14291,"url":"\/distributions\/14291\/click?bit=1&hash=257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","hash":"257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","title":"\u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u043d\u0430 Ozon \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u0451\u0442","buttonText":"","imageUuid":""}

Кнопки в телеграм-ботах

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

Виды

Кнопки в телеграм бывают двух видов - inline и обычные (reply).

Обычные

Обычные вы видите вместо клавиатуры, все, что они делают, как правило, - отправляют текстовое сообщение боту.

обычные кнопки

Но, перед тем, как сделать кнопку, нужно создать клавиатуру. Для обычных кнопок она одна, для inline другая, вот обычная:

keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=False, one_time_keyboard=True)

Параметры:

resize_keyboard: bool - необязательный | будет ли клавиатура растягиваться (по умолчанию: без значения)

one_time_keyboard: bool - необязательный \ разовая ли клавиатура (по умолчанию: без значения)

selective: bool - необязательный | кому показывать (по умолчанию: без значения)

row_width: int - обязательный | количество столбцов кнопок (по умолчанию: 3)

input_field_placeholder: str - необязательный | заменяет текст-заглушку в поле ввода (по умолчанию: без значения)

Создав клавиатуру, создадим к ней кнопку:

stop = types.KeyboardButton(text='отмена ❌')

text: str - обязательный | текст кнопки. Если указан только он, то кнопка будет просто отправлять текст при нажатии.

request_contact: bool - необязательный | если указан как true то пользователь при нажатии отправит свой контакт. Доступен только в приватных чатах.

request_location: bool - необязательный | если указан как true, то пользователь при нажатии отправит свою локацию. Доступен только в приватных чатах.

request_poll: bool - необязательный | если указан как true, то пользователь при нажатии отправит свою локацию. Доступен только в приватных чатах.

web_app: WebAppInfo - необязательный | если указан как true, то при нажатии откроется страница указанного веб-приложения - про это есть отдельная статья. Доступен только в приватных чатах.

После создания кнопки ее нужно добавить в клавиатуру вот так:

keyboard.add(stop)

И далее дать эту клавиатуру пользователю с сообщением:

bot.send_message(message.chat.id, 'Клавиатура с одной кнопкой, reply_markup=keyboard)
  • Отправить можно только одну клавиатуру за раз
  • Это актуально для всех типов клавиатур.

Inline

Inline-кнопки вы видите под сообщением.

Inline-кнопки

Клавиатура для них делается вот так:

keyboard = types.InlineKeyboardMarkup(row_width=2)

у нее только один параметр:

row_width: int - обязательный | количество столбцов кнопок (по умолчанию: 3)

Теперь делаем кнопку:

add = types.InlineKeyboardButton(text="Принять ✅", callback_data = str({'user_id': user_id, 'add': '1'}))

inline-кнопки бывают нескольких видов.

1) Отправляющие данные. В кнопке записаны какие-то данные в формате строки. При нажатии их можно отловить и среагировать на них.

2) Ссылки - просто открывают сайт в вашем браузере.

3) WebApp - открывают веб-приложение в отдельном окне, опять-таки у меня есть статья об этом.

Есть и другие виды. Можете посмотреть актуальные по ссылке.

Рассмотрим самый часто используемый - отправляющий данные.

Чтобы создать такую нам нужно указать просто текст и данные в виде строки. А чтобы отловить это действие и получить данные нужно сделать следующее:

@bot.callback_query_handler(func=lambda call: True) //вешаем обработчик событий на нажатие всех inline-кнопок def callback_inline(call): if call.data: //проверяем есть ли данные если да, далаем с ними что-то.

Вот и все, мы выяснили какие бывают основные кнопки и как ими пользоваться.

Нужен VDS-сервер для хостинга ботов? - рекомендую sprintbox. По моему промокоду CASHGOK20 вы получите кэшбэк 20% при первом пополнении - не забудьте ввести его.

Успехов и всего доброго 🤟

0
5 комментариев
Андрей Козловский

Добрый день, Михаил! А как можно размещать опрос типа такого?

Ответить
Развернуть ветку
Эмиль Гусейнов

Пересылать сообщение наверное, раз опрос

Ответить
Развернуть ветку
Михаил Гок
Автор

Да, можно делать опросы, есть отдельные функции для этого.
Примерно так:
bot.send_poll(message.chat.id, 'вопрос', options=['1', '2', '3'])

Ответить
Развернуть ветку
grajdaninrossii Кузин

Добрый день!
А как ограничивать ответы бота?
Чтобы с одной ReplyKeyboard только одни команды регистрировались, а на другой другие?
Просто в таком формате обработке я могу вбить вариант из другой клавиатуры🙃

Ответить
Развернуть ветку
grajdaninrossii Кузин

Разобрался

Ответить
Развернуть ветку
2 комментария
Раскрывать всегда