Inline-клавиатура
Кнопки внутри сообщения. При нажатии — отправляют callback или открывают URL/Mini App.
Пример
{
"chat_id": 12345,
"text": "Выберите вариант",
"reply_markup": {
"inline_keyboard": [
[
{"text": "✅ Да", "callback_data": "yes"},
{"text": "❌ Нет", "callback_data": "no"}
],
[
{"text": "🌐 Сайт", "url": "https://telefon.chat"}
]
]
}
}
Типы кнопок
| Тип | Что делает |
|---|---|
callback_data | Шлёт боту callback_query с этой строкой (до 64 байт) |
url | Открывает ссылку |
web_app | Открывает Mini App: {url: 'https://...'} |
switch_inline_query | Переключает в inline-режим в новом чате |
switch_inline_query_current_chat | То же, но в текущем чате |
copy_text | Копирует текст в буфер: {text: '...'} |
Обработка callback
Юзер нажал кнопку → бот получает обновление:
{
"update_id": 123,
"callback_query": {
"id": "cb-id",
"from": {"id": 999, "first_name": "Иван"},
"message": {"message_id": 42, "chat": {"id": 12345}},
"data": "yes"
}
}
Обязательно ответьте через answerCallbackQuery (иначе у юзера крутится индикатор):
{
"callback_query_id": "cb-id",
"text": "Готово!",
"show_alert": false
}
show_alert: true — модальное окно с OK. false — короткий toast в верхней панели.
Динамическое обновление кнопок
Меняйте кнопки на ходу через editMessageReplyMarkup:
{
"chat_id": 12345,
"message_id": 42,
"reply_markup": {
"inline_keyboard": [[{"text": "Готово ✓", "callback_data": "done"}]]
}
}
Совет: callback_data
64 байта — мало. Не пихайте туда JSON. Используйте короткие коды (a:1, b:42) и храните полный контекст в БД на стороне бота.