
Inline-кнопки в Telegram позволяют добавлять к сообщениям интерактивные элементы, которые не требуют отдельного ввода текста от пользователя. Они располагаются прямо под сообщением и могут открывать ссылки, отправлять callback-запросы или запускать бота с параметрами.
Для работы с inline-кнопками используется класс InlineKeyboardMarkup из библиотеки python-telegram-bot или аналогичных SDK. Кнопки задаются объектами InlineKeyboardButton, где указывается текст и действие: url, callback_data или switch_inline_query. Такой формат удобен, если нужно реализовать меню, подтверждения действий или быстрые переходы.
Перед написанием кода важно учесть лимиты Telegram API: максимальная длина callback_data – 64 байта, а в одной строке можно разместить до 8 кнопок. Эти ограничения стоит учитывать при проектировании интерфейса бота.
Создание бота в BotFather для работы с inline кнопками

Для генерации нового бота необходимо открыть официальный аккаунт @BotFather в Telegram и отправить команду /newbot. В ответ будет предложено ввести название, которое будет отображаться пользователям, и короткое уникальное имя, оканчивающееся на bot (например, inline_example_bot).
После успешного создания BotFather вернёт токен доступа формата 123456789:ABC-DEF1234ghIkl-zyx57W2v1u123ew11. Этот ключ требуется для работы с API и отправки сообщений с inline-кнопками. Сохранять его следует в конфигурационном файле или переменных окружения.
Чтобы бот мог использовать inline кнопки, дополнительных включений не требуется, но рекомендуется сразу настроить описание и команды: /setdescription, /setabouttext, /setcommands. Это облегчает тестирование взаимодействия с кнопками и делает интерфейс понятнее.
Проверить работоспособность можно, написав боту любое сообщение. Если токен действителен и код корректен, бот сможет отвечать с сообщениями, содержащими inline-кнопки.
Подключение библиотеки python-telegram-bot к проекту

Для работы с Telegram API на Python удобнее всего использовать библиотеку python-telegram-bot. Она предоставляет готовые классы и методы для обработки сообщений, кнопок и команд.
Установка выполняется через pip:
pip install python-telegram-bot --upgrade
В зависимости от версии библиотеки меняется способ инициализации бота. Сравнение:
| Версия | Инициализация |
|---|---|
| < 20.0 |
|
| ≥ 20.0 |
|
Рекомендуется использовать актуальную версию (≥ 20.0), так как старые варианты устарели и не поддерживаются.
После установки библиотеки и создания объекта бота можно добавлять обработчики команд и inline-кнопки.
Использование InlineKeyboardMarkup и InlineKeyboardButton
Для создания inline-кнопок используется объект InlineKeyboardMarkup, который принимает список списков кнопок. Каждая кнопка формируется через InlineKeyboardButton, где можно указать текст и действие: callback_data, url или другие параметры.
Пример кода на Python с использованием библиотеки python-telegram-bot:
from telegram import InlineKeyboardMarkup, InlineKeyboardButton
def start(update, context):
keyboard = [
[InlineKeyboardButton("Открыть сайт", url="https://example.com")],
[InlineKeyboardButton("Нажми меня", callback_data="button_pressed")]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text("Выберите действие:", reply_markup=reply_markup)
Кнопки располагаются в строках, поэтому для нескольких кнопок в одной строке их объединяют в один список. callback_data лучше делать коротким, но уникальным для обработки в функции обратного вызова.
Пример кода с одной inline кнопкой

Для создания inline кнопки в Python с использованием библиотеки python-telegram-bot применяется класс InlineKeyboardButton. Ниже приведён минимальный пример:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, ContextTypes
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [[InlineKeyboardButton("Открыть сайт", url="https://example.com")]]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text("Нажмите кнопку:", reply_markup=reply_markup)
async def main():
app = Application.builder().token("ВАШ_ТОКЕН").build()
app.add_handler(CommandHandler("start", start))
await app.run_polling()
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Ключевые моменты:
InlineKeyboardButtonсоздаёт кнопку с текстом и действием.- Для открытия ссылки указывается параметр
url. InlineKeyboardMarkupиспользуется для объединения кнопок в структуру клавиатуры.
Обработка нажатия кнопки через CallbackQueryHandler
Для обработки нажатия inline-кнопок в библиотеке python-telegram-bot применяется CallbackQueryHandler. Каждой кнопке при создании задаётся параметр callback_data, который передаётся в хэндлер при её нажатии.
Пример кода:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, ContextTypes
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [[InlineKeyboardButton("Нажми меня", callback_data="button_pressed")]]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text("Выберите действие:", reply_markup=reply_markup)
async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
if query.data == "button_pressed":
await query.edit_message_text(text="Кнопка нажата!")
def main():
app = Application.builder().token("YOUR_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CallbackQueryHandler(button_handler))
app.run_polling()
if name == "main":
main()
Метод query.answer() обязателен: он сообщает Telegram, что запрос обработан, и предотвращает сообщение о «долгом времени ожидания». Для изменения текста исходного сообщения используется query.edit_message_text(). Для разных кнопок следует задавать уникальные значения callback_data и проверять их внутри обработчика.
Добавление нескольких кнопок в одном сообщении

Для создания нескольких inline-кнопок в одном сообщении используется массив массивов объектов InlineKeyboardButton. Каждый внутренний массив формирует одну строку кнопок. Telegram поддерживает до 8 кнопок в строке и до 100 кнопок всего на сообщение.
Пример на Python с использованием библиотеки python-telegram-bot:
Пример кода:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, CallbackContext
def start(update: Update, context: CallbackContext):
keyboard = [
[InlineKeyboardButton("Кнопка 1", callback_data='1'), InlineKeyboardButton("Кнопка 2", callback_data='2')],
[InlineKeyboardButton("Кнопка 3", callback_data='3')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text("Выберите вариант:", reply_markup=reply_markup)
def button(update: Update, context: CallbackContext):
query = update.callback_query
query.answer()
query.edit_message_text(text=f"Вы нажали кнопку {query.data}")
updater = Updater("YOUR_TOKEN")
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CallbackQueryHandler(button))
updater.start_polling()
updater.idle()
В этом примере первая строка содержит две кнопки, вторая – одну. При необходимости можно добавлять новые строки, создавая отдельные массивы внутри основного списка keyboard. Для улучшения читаемости рекомендуется не перегружать одну строку большим количеством кнопок.
При создании нескольких кнопок важно использовать уникальные callback_data для корректной обработки нажатий. Telegram ограничивает длину callback_data до 64 байт, поэтому для длинных значений стоит применять идентификаторы или хэшированные значения.
Реализация разных действий при нажатии разных кнопок

Для обработки различных действий в Telegram при нажатии inline-кнопок используется объект callback_query. Каждой кнопке присваивается уникальное значение callback_data, по которому бот определяет, какое действие выполнять.
Пример создания клавиатуры с двумя кнопками, каждая из которых выполняет отдельное действие:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import CallbackQueryHandler, Updater
def start(update, context):
keyboard = [
[InlineKeyboardButton("Приветствие", callback_data='greet')],
[InlineKeyboardButton("Проверка времени", callback_data='time')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text('Выберите действие:', reply_markup=reply_markup)
Обработка нажатий производится через функцию-обработчик:
def button_handler(update, context):
query = update.callback_query
query.answer() # подтверждение нажатия
if query.data == 'greet':
query.edit_message_text(text="Привет! Рад вас видеть.")
elif query.data == 'time':
from datetime import datetime
current_time = datetime.now().strftime("%H:%M:%S")
query.edit_message_text(text=f"Текущее время: {current_time}")
Регистрация обработчика в Updater:
updater = Updater("YOUR_TOKEN")
updater.dispatcher.add_handler(CallbackQueryHandler(button_handler))
updater.start_polling()
updater.idle()
Рекомендации при работе с разными действиями:
- Использовать уникальные и понятные
callback_dataдля каждой кнопки. - Для сложных действий лучше создавать отдельные функции, чтобы не перегружать один обработчик.
- Всегда подтверждать
callback_query.answer(), иначе кнопка будет отображать индикатор загрузки бесконечно. - Если сообщение нужно обновлять без удаления клавиатуры, использовать
edit_message_textс сохранениемreply_markup. - Для динамических клавиатур можно генерировать список кнопок в зависимости от состояния пользователя или данных из базы.
Вопрос-ответ:
Что такое inline кнопка в Telegram и чем она отличается от обычной клавиатуры?
Inline кнопка — это кнопка, которая отображается прямо под сообщением в чате и может выполнять действие без отправки отдельного сообщения пользователем. В отличие от стандартной клавиатуры Telegram, которая заменяет поле ввода текста, inline кнопки остаются привязанными к конкретному сообщению и могут открывать ссылки, отправлять callback-запросы боту или запускать встроенные приложения.
