Создание 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 для любых многошаговых сценариев - это упрощает разработку и делает бота более надёжным.