Печатать команды вручную скучно и легко ошибиться. Куда приятнее, когда у бота есть кнопки: ткнул и готово. Сегодня добавим первый вид кнопок, тот, что заменяет клавиатуру снизу. Их называют reply-кнопки.
После урока сможешь: объяснить тему «Кнопки снизу: reply-клавиатура» и выполнить связанный с ней учебный шаг без подсказки.
Помнишь аналогию из словаря? Кнопки это как пульт от телевизора. Не объясняешь словами, просто жмёшь. Соберём такой пульт для своего бота.
Главная мысль про reply-кнопки
Когда пользователь жмёт reply-кнопку, боту приходит обычное текстовое сообщение с надписью этой кнопки. Нажал «Шутка», бот получил сообщение «Шутка». Будто человек сам напечатал это слово. Значит, и ловить нажатие будем знакомым обработчиком по тексту.
Собираем клавиатуру
Для кнопок понадобится помощник из библиотеки. В самом верху, рядом с импортом, добавь from telebot import types. types это набор готовых деталей: клавиатуры и кнопки. Теперь на /start бот покажет две кнопки:
import telebot
from telebot import types
from config import TOKEN
bot = telebot.TeleBot(TOKEN)
@bot.message_handler(commands=['start'])
def start(message):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.add(types.KeyboardButton("Шутка"), types.KeyboardButton("Совет"))
bot.send_message(message.chat.id, "Привет! Жми кнопку снизу:", reply_markup=keyboard)
bot.infinity_polling()
types.ReplyKeyboardMarkup(resize_keyboard=True)создаёт пустую клавиатуру;resize_keyboard=Trueделает кнопки аккуратными, а не во весь экран.keyboard.add(...)кладёт кнопки. Каждая этоtypes.KeyboardButton("надпись").reply_markup=keyboardв send_message значит «покажи вместе с сообщением вот эту клавиатуру». Без этого кнопок не будет.
Учим бота реагировать
Кнопки показались, но пока немые. Добавим обработчики. Помни секрет: нажатие это просто текст, ловим по тексту кнопки.
@bot.message_handler(func=lambda message: message.text == "Шутка")
def joke(message):
bot.send_message(message.chat.id, "Почему программисты путают Хэллоуин и Рождество? 31 OCT = 25 DEC.")
@bot.message_handler(func=lambda message: message.text == "Совет")
def advice(message):
bot.send_message(message.chat.id, "Сохраняйся почаще. И пей воду.")
Фильтр func=lambda message: message.text == "Шутка" значит «срабатывай, только если текст ровно Шутка». Поставь эти обработчики выше общего эхо, если он остался, иначе эхо перехватит нажатие. Частные правила выше общего, мы это проходили в Боте-Эхо.
Контрольный вопрос. Чтобы клавиатура показалась вместе с сообщением, в send_message добавляют параметр ____=keyboard. Напиши имя параметра.
Подсказка: reply_____
Онлайн-проверка ответа появится позже
Задание. Добавь боту на /start reply-клавиатуру с двумя своими кнопками, каждой кнопке свой ответ. Пришли скриншот, где видны кнопки снизу и ответ бота на нажатие.
Подсказка: Кнопки через keyboard.add(types.KeyboardButton(…)), показать через reply_markup=keyboard. Реагировать обработчиком func=lambda message: message.text == «надпись».
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Зачёт, если:
✅ на /start показывается reply-клавиатура с двумя твоими кнопками;
✅ на каждую кнопку бот отвечает по-своему;
✅ прислан скриншот: кнопки снизу и ответ бота на нажатие.
