Inline-клавиатуры
Inline-клавиатуры
Кнопки под сообщением — единственный вид клавиатуры в Kodari Messenger. Передаются в поле reply_markup методов sendMessage и editMessageText.
Структура
{
"inline_keyboard": [
[ { "text": "Да", "callback_data": "yes" }, { "text": "Нет", "callback_data": "no" } ],
[ { "text": "Открыть сайт", "url": "https://kodari.ru" } ]
]
}
inline_keyboard — массив рядов, каждый ряд — массив кнопок.
| Поле | Тип | Описание |
|---|---|---|
text | str | Надпись на кнопке |
callback_data | str | Данные, приходящие боту при нажатии, до 64 символов |
url | str | Кнопка-ссылка: открывает URL и callback не шлёт |
Цикл обработки нажатия
- Пользователь нажимает кнопку — клиент отправляет событие на сервер
- Бот получает апдейт
callback_queryс полямиid,from,message,data - Бот вызывает
answerCallbackQueryс этимid— у пользователя гаснет индикатор загрузки - При необходимости бот меняет сообщение через
editMessageText
Кнопки остаются активными: одна и та же клавиатура может нажиматься многократно, пока сообщение не отредактировано.
Передача параметров через callback_data
Ограничение в 64 символа удобнее всего обходить префиксами и короткими идентификаторами:
{ "text": "Товар #17", "callback_data": "item:17" }
@dp.callback_query(filters.callback_data_prefix("item:"))
async def on_item(cb):
item_id = cb.data.split(":")[1]
await cb.answer()
await cb.message.answer(f"Выбран товар {item_id}")
Полный пример на pykodaribot
from pykodaribot import Bot, Dispatcher, InlineKeyboardMarkup, InlineKeyboardButton, filters
bot = Bot("bot_ВАШ_ТОКЕН")
dp = Dispatcher()
kb = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="👍", callback_data="vote:up"),
InlineKeyboardButton(text="👎", callback_data="vote:down")],
[InlineKeyboardButton(text="Сайт", url="https://kodari.ru")],
])
@dp.message(filters.command("vote"))
async def vote(msg):
await msg.answer("Как вам обновление?", reply_markup=kb)
@dp.callback_query(filters.callback_data_prefix("vote:"))
async def on_vote(cb):
await cb.answer()
choice = cb.data.split(":")[1]
await bot.edit_message_text(cb.message.chat.id, cb.message.message_id,
f"Спасибо за голос: {choice}")
15 просмотров