Пишем своего telegram-бота на Python, ч.2
Pocket Coder 👨💻
Виды клавиатур
В Telegram существует 2 типа клавиатур: Inline и Reply.


ReplyKeyboardMarkup — это шаблоны сообщений. К примеру, ваш бот задаёт пользователю вопрос и предлагает варианты ответа. Пользователь может самостоятельно напечатать ответ, либо нажать на готовую кнопку. Такая клавиатура показывается вместо основной и не привязана ни к какому сообщению.
InlineKeyboardMarkup — это уже настоящая кастомная клавиатура. С её помощью мы можем выполнять более сложные действия. Она привязывается к сообщению, с которым была отправлена.
Вывод клавиатур с помощью PyTelegramBotAPI
Ну что-же, давайте перейдём к коду. Для начала нам нужно импортировать модуль types (именно с его помощью мы будем вызывать клавиатуры). Сделать это можно с помощью данной строки:
from telebot import types
Теперь приступим к вызову нашей первой Reply клавиатуры.
Для этого нам нужно создать переменную, которой мы присвоим параметры нашей клавиатуры.
mm = types.ReplyKeyboardMarkup(row_width=2)
row_width=2 означает, что у нашей клавиатуры будет по 2 кнопки в строке, как на скриншоте ниже.
Также мы можем сделать кнопки в клавиатуре поменьше с помощью параметра resize_keyboard=True

Далее нам нужно создать переменные в которые мы запишем названия наших кнопок. Делаем это с помощью данных строк:
button1 = types.KeyboardButton("🐣 Привет")
button2 = types.KeyboardButton("😀 Как дела?")
Теперь нам нужно добавить данные кнопки в клавиатуру.
mm.add(button1,button2)
Готово! Клавиатура создана, теперь нам нужно вывести данную клавиатуру вместе с сообщением. Для этого в конце сообщения через запятую вводим:
reply_markup=mm
У нас должна выйти такая строка:

Теперь при виде команды /start бот будет отправлять нам сообщение "Hello World!" и прикреплять к данному сообщению клавиатуру с кнопками "Привет" и "Как дела".
Давайте включим бота и проверим нашу клавиатуру.

Отлично, работает!
Но при нажатии на кнопку бот ничего не будет делать в ответ. Давайте это исправим!
Для этого сделаем обработчик сообщений и в него добавим названия наших кнопок.
@bot.message_handler(content_types=['text'])
def handler(message):
if message.text == "🐣 Привет":
bot.send_message(message.chat.id, "Привет!")
if message.text == "😀 Как дела?":
bot.send_message(message.chat.id, "Отлично!")
Отлично! Теперь в ответ на "Привет" бот будет присылать нам "Привет!", а в ответ на "Как дела?" будет присылать нам "Отлично!".
Давайте включим бота и проверим его на работоспособность!

Теперь бот отвечает при нажатии на кнопки в нашем меню. Теперь давайте перейдем к Inline клавиатурам.
Inline клавиатуры
С Inline клавиатурами всё немного посложнее, потому что мы будем обрабатывать не текстовые сообщения, а callback_data.
Давайте перейдём к созданию Inline клавиатуры. Для этого также создадим переменную, которая будет передавать параметры клавиатуры.
otvet = types.InlineKeyboardMarkup(row_width=2)
Параметры у Inline клавиатуры точно такие-же, как и у Reply клавиатуры.
Теперь давайте добавим кнопки в нашу Inline клавиатуру.
button1 = types.InlineKeyboardButton("😎 Хорошо", callback_data='good')
button2 = types.InlineKeyboardButton("😥 Плохо", callback_data='bad')
Здесь мы пропишем название нашей кнопки и сам callback_data, который мы будем обрабатывать.
Далее добавляем наши кнопки в клавиатуру с помощью строки:
otvet.add(button1,button2)
И теперь прикрепляем нашу клавиатуру к сообщению как в случае с Reply клавиатурой:
reply_markup=otvet

У вас должна выйти примерно вот такая строка.
Теперь включаем бота и проверяем нашу клавиатуру:

Как мы видим - клавиатура прикрепилась к сообщению.
Теперь нам нужно добавить обработчик callback_data с помощью данных строк:
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
try:
if call.message:
if call.data == "good":
bot.send_message(call.message.chat.id, "Круто!")
if call.data == "bad":
bot.send_message(call.message.chat.id, "Ничего, все наладится!")
except Exception as e:
print(repr(e))
Теперь при нажатии на кнопку "Хорошо" бот будет отвечать "Круто!", а при нажатии на "Плохо" будет отвечать "Ничего, все наладится!"
Проверим, отвечает ли бот при нажатии на кнопки в клавиатуре:

Как мы видим - бот отвечает нам при нажатии на кнопки клавиатуры.
Поздравляю! Теперь вы умеете вызывать клавиатуры с помощью библиотеки pyTelegramBotAPI 🎉
В следующем уроке мы научимся использовать базу данных sqlite3, отправлять emoji 🎲(костей) с нужным нам числом, а также начнём делать свой первый проект (мини-казино).
Спасибо за внимание! ✨
Конечный код:
import telebot
from telebot import types
bot = telebot.TeleBot('ключ')
mm = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
button1 = types.KeyboardButton("🐣 Привет")
button2 = types.KeyboardButton("😀 Как дела?")
mm.add(button1,button2)
@bot.message_handler(commands=['start'])
def start(message):
bot.send_message(message.chat.id, "Hello World!", reply_markup=mm)
@bot.message_handler(content_types=['text'])
def handler(message):
if message.text == "🐣 Привет":
bot.send_message(message.chat.id, "Привет!")
if message.text == "😀 Как дела?":
otvet = types.InlineKeyboardMarkup(row_width=2)
button1 = types.InlineKeyboardButton("😎 Хорошо", callback_data='good')
button2 = types.InlineKeyboardButton("😥 Плохо", callback_data='bad')
otvet.add(button1,button2)
bot.send_message(message.chat.id, "Отлично! А у тебя?", reply_markup=otvet)
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
try:
if call.message:
if call.data == "good":
bot.send_message(call.message.chat.id, "Круто!")
if call.data == "bad":
bot.send_message(call.message.chat.id, "Ничего, все наладится!")
except Exception as e:
print(repr(e))
bot.polling(none_stop=True)