Создание файла с клавиатурами (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_catalog
, button_cart
, button_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-магазин! 🚀
Пока нет комментариев. Будьте первым!