Гайд - Python | Aiogram | Inline Кнопки | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой скрипт на основе слитого?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

Гайд Python | Aiogram | Inline Кнопки

lolzteam

Сеньор
Автор темы
😈MORGENSHTERN😈
8 Янв 2023
148
72
0
Дарова, в данной статье мы разберем инлайн кнопки в библиотеке aiogram и научимся работать с ними

Первый тип - Обычная кнопка, которая имеет свою callback_data и выводит нам сообщение в чат с ботом:
Инлайн кнопка:
test_kb_1 = InlineKeyboardButton(text="Первая кнопка", callback_data="first_one")
Задается она очень просто, в параметр text= мы передаем текст, который будет отображаться на нашей кнопке:
1682379585458
Полный код с обработчиком
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, сообщение выведется по другому - 1682380430141
Второй тип - Кнопка с ссылкой, кнопка с ссылкой говорит сама за себя, это инлайн кнопка с заданной вами ссылкой

Python:
test_kb_2 = InlineKeyboardButton(text="Кнопка с ссылкой", url="https://endway.su/lolz/")
Принцип тот же, только вместо callback_data, мы используем параметр url="ссылка":
1682380661633


Полный код:
Кнопка с ссылкой:
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)
Тут по коду все понятно:catlove
Третий тип - Кнопки с динамической callback_data, способов применения таких кнопок бесконечное множество, мы разберем эту кнопку на примере вывода профиля пользователя в условном магазине.

Динамическая callback_data:
user_id = message.from_user.id
test_kb_3 = InlineKeyboardButton(text="Динамическая data", callback_data=f"member:{user_id}")
Задаем переменную user_id помещаем туда id пользователя и пихаем ее в callback_data используя f строку. теперь наша кнопка хранит в своей callback_data id юзера.

1682381486309


Полный код:
Динамическая 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}")
В этом случае мы используем параметр text_startswith= , записываем туда нашу часть callback_data, которая не является динамической, и в переменную
user_id записываем int(call.data.split(":")[1]), получаем id юзера с callback_data кнопки.

В такую кнопку можно задать несколько данных, пример кода и использование ниже:
Динамическая 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} - Вы глист")
Создаем переменную random_num и помещаем туда генерацию случайного числа, после передаем его в callback_data нашей кнопки и через проверку выводим юзеру сообщение соответствующее его случайному номеру
1682382144104
Способов применения таких кнопок очень много, зависит от вашей фантазии

Как настроить внешний вид кнопок(расположение)?

В коде это может выглядеть вот так:
Код:
@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)

В боте это выглядит так:
1682382622897

Как вы видите, мы можем вывести одну кнопку несколько раз, их расположение выглядит как в коде, ну и в этом нет ничего сложного

Спасибо за прочтение данной темы, в библиотеке аиограм есть и другие типы инлайн кнопок, я рассказал про самые популярные.
 
Like
  • 2
Реакции: 1 users

v_NLP

Dev Py3
8 Янв 2023
46
14
8
Есть ещё фабрики callback`ов, но это уже другой уровень, а в целом для новичков да, подойдёт
Кто захочет разобраться - покопается в библе и найдёт нужное
 

bandicuttt

Сеньор
int('xyi')
8 Янв 2023
235
64
28
Давай по 3ей версии аиограма разбор с роутерами мультиботами и прочими залупами. Информации очень мало, она будет очень полезна
 
Активность:
Пока что здесь никого нет