Пишем своего 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)
Это статья из серии о телеграм-ботах. Я по частям расскажу о важных моментах в 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-кнопки вы видите под сообщением.
Клавиатура для них делается вот так:
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% при первом пополнении — не забудьте ввести его.
Успехов и всего доброго 🤟
Edit this page
Toggle table of contents sidebar
- 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 ofkeyboard
and all the buttons are equal.A reply keyboard with reply options.¶
Use In
-
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()
Examples
-
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
- Parameters:
-
-
keyboard (Sequence[Sequence[
str
|telegram.KeyboardButton
]]) – Array of
button rows, each represented by an Array oftelegram.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 toFalse
, 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 toFalse
. -
selective (
bool
, optional) –Use this parameter if you want to show the keyboard to
specific users only. Targets:-
Users that are @mentioned in the
text
of the
telegram.Message
object. -
If the bot’s message is a reply (has
reply_to_message_id
), sender of the
original message.
Defaults to
False
. -
-
input_field_placeholder (
str
, optional) –The placeholder to be shown in the input
field when the keyboard is active;
1
—
64
characters.New in version 13.7.
-
is_persistent (
bool
, optional) –Requests clients to always show the keyboard when
the regular keyboard is hidden. Defaults toFalse
, in which case the custom
keyboard can be hidden and opened with a keyboard icon.New in version 20.0.
-
- keyboard[source]¶
-
Array of button rows,
each represented by an Array oftelegram.KeyboardButton
objects.- Type:
-
Tuple[Tuple[
telegram.KeyboardButton
]]
- resize_keyboard[source]¶
-
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 toFalse
, in which case the custom keyboard is always of the
same height as the app’s standard keyboard.- Type:
-
bool
- one_time_keyboard[source]¶
-
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 toFalse
.- Type:
-
bool
- selective[source]¶
-
Optional. Show the keyboard to specific users only.
Targets:-
Users that are @mentioned in the
text
of the
telegram.Message
object. -
If the bot’s message is a reply (has
reply_to_message_id
), sender of the
original message.
Defaults to
False
.- Type:
-
bool
-
- input_field_placeholder[source]¶
-
Optional. The placeholder to be shown in the input
field when the keyboard is active;
1
—
64
characters.New in version 13.7.
- Type:
-
str
- is_persistent[source]¶
-
Optional. Requests clients to always show the keyboard when
the regular keyboard is hidden. IfFalse
, the custom keyboard can be hidden and
opened with a keyboard icon.New in version 20.0.
- Type:
-
bool
- MAX_INPUT_FIELD_PLACEHOLDER = 64[source]¶
-
telegram.constants.ReplyLimit.MAX_INPUT_FIELD_PLACEHOLDER
New in version 20.0.
- MIN_INPUT_FIELD_PLACEHOLDER = 1[source]¶
-
telegram.constants.ReplyLimit.MIN_INPUT_FIELD_PLACEHOLDER
New in version 20.0.
- classmethod from_button(button, resize_keyboard=False, one_time_keyboard=False, selective=False, input_field_placeholder=None, is_persistent=None, **kwargs)[source]¶
-
Shortcut for:
ReplyKeyboardMarkup([[button]], **kwargs)
Return a ReplyKeyboardMarkup from a single KeyboardButton.
- Parameters:
-
-
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 toFalse
, 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 toFalse
. -
selective (
bool
, optional) –Use this parameter if you want to show the keyboard
to specific users only. Targets:-
Users that are @mentioned in the text of the Message object.
-
If the bot’s message is a reply (has
reply_to_message_id
), sender of the
original message.
Defaults to
False
. -
-
input_field_placeholder (
str
) –Optional. The placeholder shown in the input
field when the reply is active.New in version 13.7.
-
is_persistent (
bool
) –Optional. Requests clients to always show the keyboard
when the regular keyboard is hidden. Defaults toFalse
, in which case the
custom keyboard can be hidden and opened with a keyboard icon.New in version 20.0.
-
- classmethod from_column(button_column, resize_keyboard=False, one_time_keyboard=False, selective=False, input_field_placeholder=None, is_persistent=None, **kwargs)[source]¶
-
Shortcut for:
ReplyKeyboardMarkup([[button] for button in button_column], **kwargs)
Return a ReplyKeyboardMarkup from a single column of KeyboardButtons.
- Parameters:
-
-
button_column (Sequence[
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 toFalse
, 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 toFalse
. -
selective (
bool
, optional) –Use this parameter if you want to show the keyboard
to specific users only. Targets:-
Users that are @mentioned in the text of the Message object.
-
If the bot’s message is a reply (has
reply_to_message_id
), sender of the
original message.
Defaults to
False
. -
-
input_field_placeholder (
str
) –Optional. The placeholder shown in the input
field when the reply is active.New in version 13.7.
-
is_persistent (
bool
) –Optional. Requests clients to always show the keyboard
when the regular keyboard is hidden. Defaults toFalse
, in which case the
custom keyboard can be hidden and opened with a keyboard icon.New in version 20.0.
-
- classmethod from_row(button_row, resize_keyboard=False, one_time_keyboard=False, selective=False, input_field_placeholder=None, is_persistent=None, **kwargs)[source]¶
-
Shortcut for:
ReplyKeyboardMarkup([button_row], **kwargs)
Return a ReplyKeyboardMarkup from a single row of KeyboardButtons.
- Parameters:
-
-
button_row (Sequence[
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 toFalse
, 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 toFalse
. -
selective (
bool
, optional) –Use this parameter if you want to show the keyboard
to specific users only. Targets:-
Users that are @mentioned in the text of the Message object.
-
If the bot’s message is a reply (has
reply_to_message_id
), sender of the
original message.
Defaults to
False
. -
-
input_field_placeholder (
str
) –Optional. The placeholder shown in the input
field when the reply is active.New in version 13.7.
-
is_persistent (
bool
) –Optional. Requests clients to always show the keyboard
when the regular keyboard is hidden. Defaults toFalse
, in which case the
custom keyboard can be hidden and opened with a keyboard icon.New in version 20.0.
-
-
Permalink
Cannot retrieve contributors at this time
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This example show how to use inline keyboards and process button presses | |
import telebot | |
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton | |
TELEGRAM_TOKEN = ‘<TOKEN>’ | |
bot = telebot.TeleBot(TELEGRAM_TOKEN) | |
def gen_markup(): | |
markup = InlineKeyboardMarkup() | |
markup.row_width = 2 | |
markup.add(InlineKeyboardButton(«Yes», callback_data=«cb_yes»), | |
InlineKeyboardButton(«No», callback_data=«cb_no»)) | |
return markup | |
@bot.callback_query_handler(func=lambda call: True) | |
def callback_query(call): | |
if call.data == «cb_yes»: | |
bot.answer_callback_query(call.id, «Answer is Yes») | |
elif call.data == «cb_no»: | |
bot.answer_callback_query(call.id, «Answer is No») | |
@bot.message_handler(func=lambda message: True) | |
def message_handler(message): | |
bot.send_message(message.chat.id, «Yes/no?», reply_markup=gen_markup()) | |
bot.infinity_polling() |
Bot API v2: Кнопки и редактирование сообщений
Введение
В начале апреля 2016 года вышло первое по-настоящему крупное обновление API для ботов. Изменений довольно много, поэтому материал я разобью на несколько частей. Сегодня поговорим об inline-кнопках и редактировании сообщений, а затем обсудим новые инлайн-режимы вместе со специальными кнопками для отправки геолокации и номера телефона.
Новые возможности
Начнём с двух важных изменений:
- Каждая кнопка, будь то обычная или инлайн, это теперь самостоятельный объект
KeyboardButton
илиInlineKeyboardButton
, не забудьте обновить своих ботов! - В Inline-режиме все текстовые поля теперь представлены отдельными объектами
InputMessageContent
, которые, в свою очередь могут быть аж 4-х типов (подробности тут).
URL-кнопки
Итак, инлайн-кнопки. Что это такое? Это специальные объекты, которые “цепляются” к конкретным сообщениям и распространяют своё действие, в общем случае, только на них. Делятся такие кнопки на три типа: URL-кнопки, Callback-кнопки и Switch-кнопки.
Самыми простыми являются кнопки-ссылки (URL). Как видно из названия, их цель — просто перекидывать пользователей по определенным веб-адресам. Давайте сразу напишем обработчик, который будет на любое сообщение отвечать каким-либо текстом и предложением перейти, например, на Яндекс.
@bot.message_handler(content_types=["text"])
def default_test(message):
keyboard = types.InlineKeyboardMarkup()
url_button = types.InlineKeyboardButton(text="Перейти на Яндекс", url="https://ya.ru")
keyboard.add(url_button)
bot.send_message(message.chat.id, "Привет! Нажми на кнопку и перейди в поисковик.", reply_markup=keyboard)
Инлайн-клавиатура представляет собой объект InlineKeyboardMarkup
, а каждая инлайн-кнопка – это объект InlineKeyboardButton
. Чтобы получилась URL-кнопка, нужно указать значения параметров text
(текст на кнопке) и url
(валидный веб-адрес). В результате бот пришлет нам такое сообщение (см. рис.). В целях обеспечения безопасности, перед переходом по URL-кнопкам появляется всплывающее окно, в котором видна ссылка целиком.
URL-кнопка
Callback-кнопки и редактирование сообщений
Прежде, чем мы перейдем к другим кнопкам, давайте познакомимся с функциями редактирования сообщений, коих тоже три: editMessageText
(редактирование текста), editMessageCaption
(редактирование подписи к медиа) и editMessageReplyMarkup
(редактирование инлайн-клавиатуры). В рамках этого урока рассмотрим только первую функцию, остальные работают аналогично и предлагаются для самостоятельного изучения.
Чтобы отредактировать сообщение, нам надо знать, про какое именно идёт речь. В случае, если оно было отправлено самим ботом, идентификаторами служит связка chat_id
+ message_id
. Но если сообщение было отправлено в инлайн-режиме, то ориентироваться надо по параметру inline_message_id
.
И вот теперь вернемся к нашим баранам кнопкам. На очереди – Callback. Это, на мой взгляд, самая крутая фича нового обновления. Колбэк-кнопки позволяют выполнять произвольные действия по их нажатию. Всё зависит от того, какие параметры каждая кнопка в себе несёт. Соответственно, все нажатия будут приводить к отправке боту объекта CallbackQuery
, содержащему поле data
, в котором написана некоторая строка, заложенная в кнопку, а также либо объект Message
, если сообщение отправлено ботом в обычном режиме, либо поле inline_message_id
, если сообщение отправлено в инлайн-режиме.
Приведу пример, после которого все вопросы должны отпасть: пусть, например, если сообщение отправлено ботом в обычном режиме, то нажатие на кнопку заменит текст сообщения на “Пыщь”, если в инлайн – то “Бдыщь”. При этом в обоих случаях значение callback_data
будет равно test
. Что для этого нужно сделать: во-первых, написать простейший хэндлер для всех входящих сообщений, во-вторых, написать простейший хэндлер для инлайн-сообщений, в-третьих, написать простейший хэндлер для колбэка, который определит, из какого режима пришло сообщение.
# Обычный режим
@bot.message_handler(content_types=["text"])
def any_msg(message):
keyboard = types.InlineKeyboardMarkup()
callback_button = types.InlineKeyboardButton(text="Нажми меня", callback_data="test")
keyboard.add(callback_button)
bot.send_message(message.chat.id, "Я – сообщение из обычного режима", reply_markup=keyboard)
# Инлайн-режим с непустым запросом
@bot.inline_handler(lambda query: len(query.query) > 0)
def query_text(query):
kb = types.InlineKeyboardMarkup()
# Добавляем колбэк-кнопку с содержимым "test"
kb.add(types.InlineKeyboardButton(text="Нажми меня", callback_data="test"))
results = []
single_msg = types.InlineQueryResultArticle(
id="1", title="Press me",
input_message_content=types.InputTextMessageContent(message_text="Я – сообщение из инлайн-режима"),
reply_markup=kb
)
results.append(single_msg)
bot.answer_inline_query(query.id, results)
# В большинстве случаев целесообразно разбить этот хэндлер на несколько маленьких
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
# Если сообщение из чата с ботом
if call.message:
if call.data == "test":
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Пыщь")
# Если сообщение из инлайн-режима
elif call.inline_message_id:
if call.data == "test":
bot.edit_message_text(inline_message_id=call.inline_message_id, text="Бдыщь")
if __name__ == '__main__':
bot.infinity_polling()
Запускаем бота, отправляем инлайн-сообщение, которое, в свою очередь, вызовет обычное:
Нажмем на обе кнопки, результат правильный:
После проверки
Таким образом, callback-кнопки – это очень мощный инструмент для взаимодействия пользователей с ботом, а редактирование сообщений дополнительно помогает в этом.
Более того, нажатие на колбэк-кнопку может дополнительно тригернуть либо уведомление в верхней части экрана, либо всплывающее окно. Покажу первый вариант. Пускай помимо изменения сообщения на “Пыщь”, аналогичное слово показывается уведомлением. Для этого перепишем первое if-условие в хендлере колбэков:
if call.message:
if call.data == "test":
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Пыщь")
bot.answer_callback_query(callback_query_id=call.id, show_alert=False, text="Пыщь!")
Результат – на скриншоте. Попробуйте, кстати, изменить аргумент show_alert
на True
и посмотрите, что получится.
Всплывающее уведомление
Switch-кнопки
Наконец, остался последний тип кнопок — Switch (переключатель). Они нужны, чаще всего, для обучения пользователей работе с ботом в инлайн-режиме. Чтобы активировать сделать кнопку такого типа, нужно указать аргумент switch_inline_query
либо пустой, либо с каким-либо текстом. В последнем случае этот текст будет сразу подставлен в поле ввода, например, для показа демонстрации инлайна. Как вообще работает такая кнопка? При нажатии на неё Telegram предложит выбрать чат, после чего подставит в поле ввода ник вашего бота и (если есть), текст, указанный вами в аргументе switch_inline_query
. Давайте попробуем так сделать. Добавим кнопку, которая будет перенаправлять пользователя в какой-либо чат и предлагать в инлайн-режиме запрос “Telegram”. Код всего хендлера выглядит вот так:
@bot.message_handler(content_types=["text"])
def any_msg(message):
keyboard = types.InlineKeyboardMarkup()
switch_button = types.InlineKeyboardButton(text="Нажми меня", switch_inline_query="Telegram")
keyboard.add(switch_button)
bot.send_message(message.chat.id, "Я – сообщение из обычного режима", reply_markup=keyboard)
Теперь, если мы нажмем на кнопку и выберем чат, вот что получится:
Результат
Итак, в этом уроке мы познакомились с новыми кнопками в Telegram Bot API, научились переписывать историю редактировать сообщения и отправлять небольшие уведомления по нажатию. В следующий раз продолжим изучать новые возможности для ботов.
А исходники к этому уроку можно найти в этом репозитории.
← Урок №7
Урок №9 →