Дарова, в данной статье мы разберем инлайн кнопки в библиотеке aiogram и научимся работать с ними
Первый тип - Обычная кнопка, которая имеет свою callback_data и выводит нам сообщение в чат с ботом:
Задается она очень просто, в параметр text= мы передаем текст, который будет отображаться на нашей кнопке:
Полный код с обработчиком callback_data выглядит так:
В переменной test_kb задаем класс InlineKeyboardMarkup(), потом создаем переменную для кнопки в которой задаем текст кнопке и callback дату к котором потом будем обращаться, добавляем в нашу переменную с классом InlineKeyboardMarkup() кнопку test_kb_1, затем нужно отправить сообщение с этой клавиатурой, используя метод reply_markup.
После, используем @dp.callback_query_handler(text="first_one", state="*"), в параметр text передаем callback_data кнопки нажатие которой мы хотим обрабатывать. Если использовать метод call.answer, сообщение выведется по другому -
Инлайн кнопка:
test_kb_1 = InlineKeyboardButton(text="Первая кнопка", callback_data="first_one")
Полный код с обработчиком callback_data выглядит так:
Python:
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from aiogram.types import CallbackQuery
@dp.message_handler(commands=['start'], state="*")
async def inline_kb(message: types.Message):
test_kb = InlineKeyboardMarkup()
test_kb_1 = InlineKeyboardButton(text="Первая кнопка", callback_data="first_one")
test_kb.add(test_kb_1)
await message.answer("Кнопки:", reply_markup=test_kb)
@dp.callback_query_handler(text="first_one", state="*")
async def first_one(call: CallbackQuery):
await call.message.answer("Вы нажали первую кнопку")
В переменной test_kb задаем класс InlineKeyboardMarkup(), потом создаем переменную для кнопки в которой задаем текст кнопке и callback дату к котором потом будем обращаться, добавляем в нашу переменную с классом InlineKeyboardMarkup() кнопку test_kb_1, затем нужно отправить сообщение с этой клавиатурой, используя метод reply_markup.
После, используем @dp.callback_query_handler(text="first_one", state="*"), в параметр text передаем callback_data кнопки нажатие которой мы хотим обрабатывать. Если использовать метод call.answer, сообщение выведется по другому -
Второй тип - Кнопка с ссылкой, кнопка с ссылкой говорит сама за себя, это инлайн кнопка с заданной вами ссылкой
Принцип тот же, только вместо callback_data, мы используем параметр url="ссылка":
Полный код:
Тут по коду все понятно
Python:
test_kb_2 = InlineKeyboardButton(text="Кнопка с ссылкой", url="https://endway.su/lolz/")
Полный код:
Кнопка с ссылкой:
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
@dp.message_handler(commands=['start'], state="*")
async def inline_kb(message: types.Message):
test_kb = InlineKeyboardMarkup()
test_kb_2 = InlineKeyboardButton(text="Кнопка с ссылкой", url="https://endway.su/lolz/")
test_kb.add(test_kb_2)
await message.answer("Кнопки:", reply_markup=test_kb)
Третий тип - Кнопки с динамической callback_data, способов применения таких кнопок бесконечное множество, мы разберем эту кнопку на примере вывода профиля пользователя в условном магазине.
Задаем переменную user_id помещаем туда id пользователя и пихаем ее в callback_data используя f строку. теперь наша кнопка хранит в своей callback_data id юзера.
Полный код:
В этом случае мы используем параметр text_startswith= , записываем туда нашу часть callback_data, которая не является динамической, и в переменную user_id записываем int(call.data.split(":")[1]), получаем id юзера с callback_data кнопки.
В такую кнопку можно задать несколько данных, пример кода и использование ниже:
Создаем переменную random_num и помещаем туда генерацию случайного числа, после передаем его в callback_data нашей кнопки и через проверку выводим юзеру сообщение соответствующее его случайному номеру
Способов применения таких кнопок очень много, зависит от вашей фантазии
Динамическая callback_data:
user_id = message.from_user.id
test_kb_3 = InlineKeyboardButton(text="Динамическая data", callback_data=f"member:{user_id}")
Полный код:
Динамическая callback_data:
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from aiogram.types import CallbackQuery
@dp.message_handler(commands=['start'], state="*")
async def inline_kb(message: types.Message):
user_id = message.from_user.id
test_kb = InlineKeyboardMarkup()
test_kb_3 = InlineKeyboardButton(text="Динамическая кнопка", callback_data=f"member:{user_id}")
test_kb.add(test_kb_3)
await message.answer("Кнопки:", reply_markup=test_kb)
@dp.callback_query_handler(text_startswith="member", state="*")
async def first_one(call: CallbackQuery):
user_id = int(call.data.split(":")[1])
await call.message.answer(f"Ваш id {user_id}")
В такую кнопку можно задать несколько данных, пример кода и использование ниже:
Динамическая callback_data 2.0:
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from aiogram.types import CallbackQuery
import random
@dp.message_handler(commands=['start'], state="*")
async def inline_kb(message: types.Message):
random_num = random.randint(10000, 99999)
user_id = message.from_user.id
test_kb = InlineKeyboardMarkup()
test_kb_3 = InlineKeyboardButton(text="Динамическая кнопка", callback_data=f"member:{user_id}:{random_num}")
test_kb.add(test_kb_3)
await message.answer("Кнопки:", reply_markup=test_kb)
@dp.callback_query_handler(text_startswith="member", state="*")
async def first_one(call: CallbackQuery):
user_id = int(call.data.split(":")[1])
random_num = int(call.data.split(":")[2])
if random_num < 50000:
await call.message.answer(f"Ваш id {user_id} Ваше случайное число {random_num} - Вы крут")
else:
await call.message.answer(f"Ваш id {user_id}\n Ваше случайное число {random_num} - Вы глист")
Способов применения таких кнопок очень много, зависит от вашей фантазии
Как настроить внешний вид кнопок(расположение)?
В коде это может выглядеть вот так:
В боте это выглядит так:
Как вы видите, мы можем вывести одну кнопку несколько раз, их расположение выглядит как в коде, ну и в этом нет ничего сложного
В коде это может выглядеть вот так:
Код:
@dp.message_handler(commands=['start'], state="*")
async def inline_kb(message: types.Message):
random_num = random.randint(10000, 99999)
user_id = message.from_user.id
test_kb = InlineKeyboardMarkup()
test_kb_1 = InlineKeyboardButton(text="Первая кнопка", callback_data="first_one")
test_kb_2 = InlineKeyboardButton(text="Вторая кнопка", callback_data="first_one")
test_kb_3 = InlineKeyboardButton(text="Третья кнопка", callback_data="first_one")
test_kb_4 = InlineKeyboardButton(text="Кнопка с ссылкой", url="https://endway.su/lolz/")
test_kb_5 = InlineKeyboardButton(text="Вторая кнопка с ссылкой", url="https://endway.su")
test_kb_6 = InlineKeyboardButton(text="Динамическая кнопка", callback_data=f"member:{user_id}:{random_num}")
test_kb.add(test_kb_1, test_kb_2, test_kb_3)
test_kb.add(test_kb_4, test_kb_5)
test_kb.add(test_kb_6)
test_kb.add(test_kb_6)
await message.answer("Кнопки:", reply_markup=test_kb)
В боте это выглядит так:
Как вы видите, мы можем вывести одну кнопку несколько раз, их расположение выглядит как в коде, ну и в этом нет ничего сложного
Спасибо за прочтение данной темы, в библиотеке аиограм есть и другие типы инлайн кнопок, я рассказал про самые популярные.