🌙

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 — массив рядов, каждый ряд — массив кнопок.

ПолеТипОписание
textstrНадпись на кнопке
callback_datastrДанные, приходящие боту при нажатии, до 64 символов
urlstrКнопка-ссылка: открывает URL и callback не шлёт

Цикл обработки нажатия

  1. Пользователь нажимает кнопку — клиент отправляет событие на сервер
  2. Бот получает апдейт callback_query с полями id, from, message, data
  3. Бот вызывает answerCallbackQuery с этим id — у пользователя гаснет индикатор загрузки
  4. При необходимости бот меняет сообщение через 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 просмотров