Создание меню и команд в Telegram-магазине (Часть 2)

Создание меню и команд в Telegram-магазине (Часть 2)

Создание файла с клавиатурами (keyboards.py)

Чтобы пользователь мог взаимодействовать с ботом, добавим в него кнопки. В Telegram есть два вида кнопок:

  • Reply-кнопки (ReplyKeyboardMarkup) – появляются под строкой ввода (например, кнопки «Каталог» и «Корзина»).
  • Inline-кнопки (InlineKeyboardMarkup) – встроенные кнопки внутри сообщений (например, кнопка «Смотреть товары»).

Код keyboards.py

Создаем файл keyboards.py и добавляем в него кнопки:

from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton

# Reply-клавиатура (главное меню)
button_catalog = KeyboardButton(text="🛍 Каталог")
button_cart = KeyboardButton(text="🛒 Корзина")

main_menu = ReplyKeyboardMarkup(
    keyboard=[[button_catalog, button_cart]],  # Размещаем кнопки в одном ряду
    resize_keyboard=True
)

# Inline-клавиатура (встроенные кнопки в сообщении)
button_view_products = InlineKeyboardButton(
    text="📦 Смотреть товары",
    callback_data="view_products"
)

catalog_keyboard = InlineKeyboardMarkup(inline_keyboard=[[button_view_products]])

Что делает этот код

✅ Создает кнопки – button_catalogbutton_cartbutton_view_products.
✅ Группирует их в клавиатуры – main_menu (reply-кнопки) и catalog_keyboard (inline-кнопки).
✅ Reply-клавиатура (main_menu) предлагает выбор между каталогом и корзиной.
✅ Inline-кнопка (catalog_keyboard) отправляет callback-запрос при нажатии.


Создание файла обработчиков (handlers.py)

Теперь создадим файл handlers.py, который будет обрабатывать команды /start, нажатие на кнопки и inline-запросы.

Код handlers.py

from aiogram import Router, F
from aiogram.types import Message, CallbackQuery
from keyboards import main_menu, catalog_keyboard

# Создаем Router для обработки команд
router = Router()


# Обработчик команды /start
@router.message(F.text == "/start")
async def start_command(message: Message):
    print("Обработчик команды /start сработал!")  # Логируем в консоль
    await message.answer(
        "Добро пожаловать в магазин! Выберите действие:",
        reply_markup=main_menu
    )


# Обработчик кнопки "Каталог"
@router.message(F.text == "🛍 Каталог")
async def catalog_command(message: Message):
    print("Обработчик кнопки 'Каталог' сработал!")  # Логируем для отладки
    await message.answer(
        "Вот наш каталог. Нажмите кнопку ниже, чтобы просмотреть товары:",
        reply_markup=catalog_keyboard
    )


# Обработчик inline-кнопки "Смотреть товары"
@router.callback_query()
async def handle_callback(callback: CallbackQuery):
    print(f"Получен callback-запрос: {callback.data}")  # Логируем callback

    if callback.data == "view_products":
        await callback.message.answer(
            "Список товаров:\n1. 📦 Товар A - 100₽\n2. 📦 Товар B - 200₽\n3. 📦 Товар C - 300₽"
        )
        await callback.answer()

Что делает этот код

✅ Обрабатывает команду /start и отправляет пользователю главное меню.
✅ Обрабатывает кнопку «Каталог», отправляя inline-клавиатуру с кнопкой «Смотреть товары».
✅ Обрабатывает callback-запрос, отправляя список товаров.


Обновляем bot.py

Теперь bot.py станет намного чище, так как обработчики вынесены в handlers.py:

import asyncio
import os
from aiogram import Bot, Dispatcher
from dotenv import load_dotenv
from handlers import router  # Импортируем обработчики команд

# Загружаем переменные окружения
load_dotenv()

# Получаем токен из .env
BOT_TOKEN = os.getenv("BOT_TOKEN")

if not BOT_TOKEN:
    raise ValueError("Ошибка: BOT_TOKEN не найден. Проверьте файл .env!")

# Создаем объекты бота и диспетчера
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()

# Подключаем обработчики команд
dp.include_router(router)

# Функция запуска бота
async def main():
    print("Бот запущен...")
    await bot.delete_webhook(drop_pending_updates=True)  # Удаляем старые обновления
    await dp.start_polling(bot)  # Запускаем бота

# Запускаем бота
if __name__ == "__main__":
    asyncio.run(main())

Что изменилось?

✅ bot.py теперь просто запускает бота – все обработчики перенесены в handlers.py.
✅ Используется dp.include_router(router), чтобы подключить обработчики команд.


Вывод

Теперь у нас есть:
✅ Готовая структура проекта, которая легко расширяется.
✅ Клавиатуры (keyboards.py) для взаимодействия с пользователем.
✅ Обработчики (handlers.py), которые реагируют на команды и нажатия кнопок.

Если вы все сделали правильно, то при нажатии /start внизу появляются две кнопки «Каталог» и «Корзина». При нажатии каталог появляется инлайн кнопка «Смотреть товары» и при нажатии на неё появляется список товаров.

Что дальше?

В следующей статье мы добавим базу данных, чтобы хранить товары и заказы. В итоге у нас получится полноценный Telegram-магазин! 🚀

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Чтобы оставить комментарий, пожалуйста, войдите или зарегистрируйтесь.