Пишем своего telegram-бота на Python, ч.2

Пишем своего telegram-бота на Python, ч.2

Pocket Coder 👨‍💻

Виды клавиатур

В Telegram существует 2 типа клавиатур: Inline и Reply.


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)


Report Page