Создание Telegram бота на aiogram с регистрацией через FSM и SQLite

    В этой статье мы подробно разберём, как написать Telegram бота на Python с использованием библиотеки aiogram. Вы научитесь реализовывать пошаговую регистрацию пользователей через FSM (Finite State Machine), сохранять данные в базу данных SQLite и обрабатывать команды. Материал будет полезен как новичкам, так и разработчикам, желающим структурировать свой код.

    Что такое FSM в aiogram и зачем он нужен

    FSM (Finite State Machine) - это конечный автомат, который позволяет боту запоминать, на каком этапе диалога находится пользователь. В aiogram для этого используются классы StatesGroup и State. Например, при регистрации можно последовательно запрашивать имя, класс и другие данные, не теряя контекст после каждого сообщения.

    Подготовка проекта и установка зависимостей

    Для работы вам понадобятся:

    • Python 3.8+
    • Библиотека aiogram - установите через pip install aiogram
    • Модуль sqlite3 (встроен в Python)

    Создайте файл bot.py и импортируйте необходимые компоненты:

    from aiogram import F, Router
    from aiogram.filters import CommandStart, Command
    from aiogram.types import Message
    from aiogram.fsm.state import StatesGroup, State
    from aiogram.fsm.context import FSMContext
    import sqlite3

    Структура кода: роутеры и команды

    Разделим логику на роутер router, который будет обрабатывать все сообщения. Подключите роутер к диспетчеру в основном файле. Рассмотрим основные команды:

    Команда /start

    Запускает бота и выводит приветственное сообщение. Пользователю предлагается ввести /devtopeople для продолжения.

    @router.message(CommandStart())
    async def cmd_start(message: Message):
    await message.answer('Привет! Ты попал в телеграм бота по игре про ВОВ. Пропиши команду /devtopeople')

    Команда /devtopeople

    Отвечает пользователю и предлагает ознакомиться с информацией о создателе через /info или перейти к помощи через /help.

    Команда /help

    Выводит инструкцию: для начала игры нужно ввести /StartGame. Также предупреждает о сборе данных (имя и TG ID) и гарантирует их безопасность.

    Команда /StartGame - запуск регистрации через FSM

    При вводе /StartGame бот переводит пользователя в состояние Reg.name и спрашивает имя. После ответа - запрашивает класс. Данные сохраняются в FSMContext и затем записываются в базу данных.

    @router.message(Command('StartGame'))
    async def reg1(message: Message, state: FSMContext):
    await state.set_state(Reg.name)
    await message.answer('Начинаем! Как тебя зовут?')

    Работа с базой данных SQLite

    Подключение к базе происходит в начале файла: db = sqlite3.connect('DataBase.db'). После получения данных от пользователя выполняется вставка в таблицу result. Важно: в примере используется небезопасная подстановка значений через f-строки - в реальном проекте применяйте параметризованные запросы (например, cur.execute('INSERT INTO result(name) VALUES(?)', (data['name'],))).

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

    После регистрации состояние очищается командой await state.clear(). В конце работы база данных закрывается: db.close(). Обратите внимание, что закрытие БД в конце файла может быть преждевременным - лучше использовать контекстный менеджер или закрывать при завершении бота.

    Заключение

    Мы рассмотрели базовый шаблон Telegram бота на aiogram с регистрацией через FSM и сохранением в SQLite. Этот код можно расширять: добавлять клавиатуры, новые состояния, проверку данных и логирование. Используйте FSM для любых многошаговых сценариев - это упрощает разработку и делает бота более надёжным.

    Часто задаваемые вопросы