Telegram бот python aiogram 3 #8 Многоуровневое инлайн меню, каталог, пагинация, корзина товаров

YOUTUBE · 25.11.2025 07:08

Ключевые темы и таймкоды

Введение

0:00
  • Приветствие от канала «Пайтон Хап Студио».
  • Восьмое видео по разработке Telegram-ботов на Python и Ogramma 3.0.
  • Темы видео: многоуровневое онлайн-меню, каталог товаров, постраничное перелистывание и корзины пользователей.

Меню для пользователя

0:37
  • Админка почти готова, будут показаны изменения.
  • Пользователь заходит на бота, нажимает «запустите старт», появляется меню.
  • Взаимодействие с пиццерией происходит через меню с онлайн-кнопками и текстом.

Категории и товары

1:22
  • Кнопка «о нас» отображает справочную информацию о магазине.
  • Кнопка «товары» позволяет выбрать категории «еда» и «напитки».
  • Доступ к корзине из второго уровня меню.

Корзина

2:18
  • В корзине отображаются изображение продукта, стоимость, количество и общая стоимость.
  • Дополнительные кнопки для управления товарами: увеличение количества, удаление.
  • Возможность вернуться на главную страницу или заказать сформированный заказ.

Изменения в коде

3:18
  • Добавлены категории «еда» и «напитки».
  • Убраны команды для пользователя в «хендлерс юзер приват».
  • Закомментированы ненужные команды в «бот комонс лист» и файле «э пай».

Подготовка к работе

4:11
  • Переход на репозиторий видеокурса.
  • Скачивание шаблона для работы.
  • Открытие проекта в редакторе и обзор изменений.

Удаление команд и настройка базы данных

5:50
  • Удаление команд пользователя из «хендлерс юзер приват».
  • Разкомментирование строк для удаления старых команд при первом запуске скрипта.
  • Создание новой схемы базы данных при первом запуске.

Дополнительные таблицы

6:44
  • В пакете «дата бейс» добавлены дополнительные таблицы.
  • Настройка базы данных не показана, так как это было в прошлых видео.

Создание таблиц

7:15
  • Таблица «Продукт» наследуется от «Бейс», содержит стандартные поля: дата создания и обновления записей.
  • Таблица «Баннер» также наследуется от «Бейс», хранит ID, имя баннера и описание.
  • В таблице «Баннер» хранятся изображения и описания для информационных страниц.

Добавление категорий и продуктов

8:07
  • Добавлены категории «Еда» и «Напитки».
  • В таблице «Продукты» добавлены поля «Категория ID» и «Категория Map».
  • Установлена связь между таблицами через внешний ключ.

Настройка внешнего ключа

9:03
  • Внешний ключ указывает на таблицу «Категории».
  • Параметр «Каскад» позволяет автоматически удалять продукты при удалении категории.
  • Возможность настройки дефолтных значений или запрета удаления категории при наличии продуктов.

Исправление типа поля

9:57
  • Поле «Прайс» изменено с «Float» на «Numeric» для корректной работы с Equlite.
  • Ограничение на количество знаков после запятой в поле «Прайс».

Таблица «Юзер» и «Корзина»

10:53
  • Таблица «Юзер» содержит ID, имя, фамилию и номер телефона.
  • Таблица «Корзина» содержит ID, ID пользователя, ID товара и количество.
  • Каскад для удаления корзин при удалении пользователя.

Запросы и админка

12:39
  • Создан самописный агрегатор для постраничного перелистывания товаров.
  • Добавлены запросы для работы с баннерами и категориями.
  • Админка позволяет добавлять, удалять и изменять продукты и категории.

Текстовые файлы и импорт

15:07
  • В папке «Common» добавлены текстовые файлы с категориями и описаниями для информационных страниц.
  • Импорт категорий и описаний в базу данных при старте бота.

Запуск бота и заполнение базы данных

18:39
  • Запуск бота, создание таблиц и запись категорий и описаний.
  • Загрузка товаров через админскую команду.
  • Заполнение базы данных товарами и категориями.

Добавление и изменение товаров админом

20:36
  • В FSM добавлен новый пункт «категория».
  • После ввода описания товара админ переходит в состояние «продукт категории».
  • Формируется словарь с категориями и отправляется в функцию callback.

Обработка кликов и проверка категорий

21:35
  • При нажатии на категорию «еда» запрашивается цена товара.
  • Проверяется, есть ли введённая категория в списке, и добавляется update date.
  • Исправлен баг с добавлением пунктов меню только при наличии товара для изменения.

Загрузка изображений товаров

22:31
  • Вводятся цена и изображение товара.
  • Товар добавляется или изменяется.
  • Загружаются изображения для категории «напитки».

Оптимизация FSM и проверка ввода

23:11
  • Убрана лишняя орфографическая проверка.
  • Проверка длины названия товара: менее 4 или более 150 символов.
  • При выходе за рамки диапазона выводится сообщение для корректного ввода.

Работа с баннерами

24:13
  • МикроFSM для загрузки и изменения баннеров.
  • Отправка фото баннера и указание страницы в описании.
  • Проверка правильности ввода страницы и обновление баннера в базе данных.

Обновление баннеров в базе данных

27:03
  • Запуск функции на старте бота для заполнения таблицы баннеров.
  • Обновление изображений баннеров для разных страниц.

Работа с ассортиментом

28:00
  • Выбор категории для вывода ассортимента.
  • Формирование кнопок для удаления или изменения товаров.
  • Вывод списка продуктов с учётом выбранных категорий.

Меню для пользователей

29:55
  • Сообщения с онлайн-кнопками для изменения текста.
  • Редактирование текста и кнопок при нажатии на кнопку.
  • Возможность редактирования отдельных элементов сообщения: текст, кнопки, изображения.

Особенности редактирования сообщений

31:58
  • Одновременное редактирование текста и кнопок.
  • Редактирование отдельных элементов: текст, описание, изображение.
  • Важность наличия изображений на страницах для красивого отображения.

Преимущества редактирования сообщений

33:28
  • Меньше хендлеров и более лояльный интерфейс.
  • Ограничение на удаление сообщений в Telegram — 48 часов.
  • Старые сообщения не удаляются, что может привести к захламлению чата.

Разработка схемы меню

34:25
  • Меню будет иметь четыре уровня с разными наборами кнопок.
  • Каждая кнопка отправляет информацию через callback-данные.
  • Пример callback-данных: уровень меню и имя страницы.

Реализация кнопок и уровней

35:23
  • Кнопки «О нас», «Оплата» и «Доставка» имеют уровень 0 и страницу «Шиппи».
  • Кнопка «Корзина» ведёт на уровень 3.
  • Товары отправляют уровень 1, а кнопка «Назад» — уровень 0.

Дополнительные callback-данные

36:23
  • Для постраничной навигации требуется дополнительная callback-дата.
  • Информация о странице и товарах передаётся через callback-данные.

Использование фабрики callback-данных

37:21
  • Стандартные строки callback-данных неудобны в работе.
  • Фабрика callback-данных в Telegram упрощает работу с данными.

Подготовка структуры бота

38:21
  • Удаление ненужных частей файла user_private.
  • Формирование первого сообщения при команде «старт».
  • Создание файла menu_process для обработки меню.

Реализация функции get_menu_content

40:50
  • Функция получает аргументы: сессия, уровень и меню нейм.
  • Проверка уровня меню и возврат изображения, описания и кнопок.
  • Импорт необходимых функций для работы с изображениями и клавиатурами.

Получение изображения и формирование клавиатуры

41:57
  • Получение изображения из базы данных по имени страницы.
  • Формирование онлайновой клавиатуры и возврат её функции.
  • Объяснение использования медиа и кэпшн в методе transfer_photo.

Создание инлайновой кнопки

44:09
  • В файле «ин-лайн» создаём функцию для обработки уровня меню.
  • Передаём уровень меню и размерность кнопок.
  • Формируем онлайн-клавиатуру с кнопками «товары», «каталог», «корзина» и другими.

Формирование callback-данных

45:04
  • Используем словарь для формирования callback-данных кнопок.
  • Создаём класс «меню-callback», наследуя от «callback-data».
  • Аннотируем поля класса: уровень и меню-нейм.

Обработка кнопок

47:00
  • Перебираем словарь для формирования кнопок.
  • Для кнопки «товары» формируем callback-данные с уровнем +1.
  • Для кнопки «корзина» формируем callback-данные с уровнем 3.
  • Для остальных кнопок передаём базовый уровень.

Проверка работы кнопок

49:06
  • Запускаем бота и проверяем отображение кнопок.
  • Убеждаемся, что кнопки отображаются правильно, но не работают.

Обработка callback-событий

50:02
  • Импортируем класс «меню-callback» в хендлер.
  • Фильтруем callback-события с префиксом «меню».
  • Получаем данные из callback-данных и формируем медиа-сообщение.

Редактирование медиа-сообщения

52:47
  • Редактируем отправленное сообщение, передавая медиа-экземпляр.
  • Возвращаем соответствующее изображение по имени страницы.

Тестирование обработки уровней

53:44
  • Тестируем обработку нулевого уровня.
  • Проверяем отображение новых изображений и подписей.
  • Переходим к обработке уровня один для перехода к товарам.

Настройка кнопок в меню

54:18
  • При нажатии на кнопку «Товары» должно отображаться меню с кнопками «Назад», «Корзина» и категориями товаров.
  • В callback-строке кнопок добавляется информация о категории товара из базы данных.
  • Категория товара хранится в таблице под ключом «категории».

Добавление параметра категории

55:15
  • В классе добавляется параметр категории с аннотацией типа.
  • Параметр может быть необязательным, его значение по умолчанию — None.

Функция для возврата кнопок

56:03
  • Создаётся функция get_user_catalog_buttons для возврата кнопок первого уровня.
  • Функция получает текущий уровень меню и список категорий из базы данных.
  • Формируются кнопки «Назад», «Корзина» и категории товаров.

Работа с категориями

57:02
  • Для каждой категории создаётся кнопка с callback-строкой, включающей уровень меню, название категории и идентификатор категории.
  • Функция menu_process запускает соответствующую функцию в зависимости от уровня меню.

Формирование баннера и категорий

57:59
  • Формируется баннер с описанием категорий на основе данных из базы данных.
  • Категории товаров выбираются из файла data_rm_categories.
  • Полученные категории передаются в клавиатуру.

Проверка работы меню

59:33
  • Проверяется работа меню, кнопок «Назад», «Корзина» и категорий.
  • Добавляется callback-строка категории для кнопок «Еда», «Напитки».

Добавление параметров для кнопок

1:00:19
  • В функцию get_menu_content добавляются параметры категории и product_id.
  • Product_id используется для добавления товара в корзину.

Формирование кнопок для товаров

1:01:39
  • Определяются поля page и product_id для кнопок.
  • Создаётся функция get_product_buttons для возврата кнопок товаров.

Формирование кнопок «Назад» и «Вперёд»

1:03:26
  • Формируются кнопки «Назад» и «Вперёд» для перелистывания товаров.
  • Кнопка «Купить» добавляет товар в корзину без изменения отображения меню.

Добавление кнопок «Предыдущий» и «Следующий» товар

1:04:44
  • Кнопки «Предыдущий» и «Следующий» товар добавляются в словарь.
  • Применяются методы append и remove для формирования списка кнопок.

Функция product

1:05:37
  • Функция product формирует изображение и кнопки.
  • Для работы функции требуются две функции: основная и для pagination.
  • В функцию передаются аргументы: сессия, уровень, категории и пейдж.

Передача аргументов и выбор товаров

1:06:31
  • Пейдж передаётся как callback, callback_data, page.
  • При нажатии на кнопку категории товара уровень меняется на уровень два.
  • Товары выбираются из базы данных с помощью функции rmt_products.

Выбор товаров срезами

1:07:24
  • Можно усложнить код, выбирая товары срезами с помощью параметров лимит и офсет.
  • Для небольшого количества товаров 50 лучше выбирать все товары сразу.

Класс paginator

1:08:21
  • Класс paginator принимает массив, список или кортеж данных.
  • Функция get_page выбирает товары по странице.
  • Определены методы для проверки наличия следующей и предыдущей страницы.

Формирование изображения товара

1:09:21
  • Формируется изображение товара, включая фото, название, описание и стоимость.

Создание кнопок навигации

1:10:15
  • Создаются кнопки «назад» и «вперёд» с помощью функции pages.
  • Возвращается словарь с кнопками.

Проверка работы бота

1:11:13
  • Запуск бота для проверки работы кнопок.
  • Проверка отображения товаров и кнопок навигации.

Добавление товара в корзину

1:13:22
  • При нажатии на кнопку «купить» товар добавляется в корзину.
  • Добавляется пользователь в базу данных перед добавлением товара в корзину.

Работа с корзинами

1:16:15
  • Создаётся корзина для пользователя, если её нет.
  • Изменяется количество товара в корзине, если она уже есть.

Тестирование добавления товара в корзину

1:17:50
  • Тестирование работы кнопки «купить».
  • Подтверждение добавления товара в корзину и отображения оповещения.

Дополнительное оповещение

1:18:33
  • Возможность добавления параметра show_alert для более явного оповещения пользователя.

Реализация отображения корзины товаров пользователя

1:18:53
  • Добавление дополнительных параметров для фильтрации корзин по пользователю.
  • Передача информации об user ID из хендлера в функцию get_menu_content.
  • Использование параметра user ID в функции с типом данных int или bool.

Формирование кнопок для корзины

1:20:48
  • Подготовка функции для формирования кнопок корзины.
  • Передача параметров: level, page, product_id, buttons.
  • Проверка наличия товаров в корзине перед формированием клавиатуры.

Реализация кнопок для пустой корзины

1:21:37
  • Формирование кнопки «Главная» при пустой корзине.
  • Отображение баннера пустой корзины.

Реализация кнопок для заполненной корзины

1:22:01
  • Добавление кнопок «Удалить», «Минус один», «Плюс один».
  • Формирование кнопок пагинации «Назад» и «Следующий».
  • Добавление кнопки «Заказать».

Логика взаимодействия с корзиной

1:23:00
  • Реализация функции для взаимодействия с корзиной пользователя.
  • Передача сессии, уровня, меню нейма, user ID и product_id.
  • Обработка действий пользователя: удаление товара, изменение количества товара.

Удаление товара из корзины

1:24:54
  • Вызов функции rm_delete_from_cart с передачей сессии, user ID и product_id.
  • Проверка и изменение страницы при удалении товара.

Изменение количества товара в корзине

1:25:33
  • Запрос к системе для уменьшения количества товаров в корзине.
  • Удаление корзины при уменьшении количества до одного товара.
  • Увеличение количества товаров при нажатии на кнопку «Плюс один».

Выбор всех корзин пользователя

1:28:17
  • Выбор всех корзин по пользователю с передачей сессии и user ID.
  • Применение метода ob_binds для загрузки связанных записей.
  • Формирование списка корзин.

Формирование баннера и клавиатуры

1:29:51
  • Формирование баннера пустой корзины при её отсутствии.
  • Формирование клавиатуры с одной кнопкой «Главная» при пустой корзине.
  • Формирование кнопок пагинации при наличии корзин.

Тестирование функции

1:30:48
  • Добавление запуска функции для тестирования.
  • Возможность просмотра кода на GitHub.

Удаление товаров из базы

1:31:45
  • Настройка выбора товара для удаления из базы.
  • Использование product_id из callback_data.
  • Проверка работы системы через бота.

Отображение товаров в корзине

1:32:44
  • Отображение стоимости и количества товаров в корзине.
  • Формирование общей стоимости товаров через перемножение количества товаров на их стоимость.
  • Применение функции round для округления стоимости.

Работа с paginator

1:33:35
  • Отображение одного элемента корзины с помощью paginator.
  • Использование цикла for для перемножения количества товаров на их стоимость.
  • Распаковка и просчёт данных для отображения.

Тестирование удаления товаров

1:34:30
  • Удаление одного товара из корзины.
  • Проверка работы системы после удаления.
  • Удаление всех товаров из корзины.

Финальные штрихи

1:35:29
  • Удаление лишних функций иPAGINATOR.
  • РазмещениеPAGINATOR в папке «утилиты».
  • Исправление импортаPAGINATOR в меню процессе.

Завершение видео

1:36:42
  • Форматирование документа для улучшения читаемости импортов.
  • Прощание и упоминание канала «Пайтон Хаб Студио».