Какую роль выполняет FSM в библиотеке aiogram

Ответ

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

Без FSM бот не помнит контекст: каждый новый handler обрабатывает сообщение независимо. FSM позволяет "вести" пользователя по заранее определенному сценарию, переключая его из одного состояния в другое.

Пример: Анкетирование пользователя

from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup

# 1. Определяем состояния
class UserPoll(StatesGroup):
    name = State()      # Состояние для ожидания имени
    age = State()       # Состояние для ожидания возраста
    feedback = State()  # Состояние для ожидания отзыва

# ... (инициализация бота и диспетчера)

# 2. Вход в сценарий (установка первого состояния)
@dp.message_handler(commands=['poll'])
async def start_poll(message: types.Message):
    await UserPoll.name.set() # Устанавливаем состояние 'name'
    await message.answer("Как вас зовут?")

# 3. Обработка ответа в состоянии 'name'
@dp.message_handler(state=UserPoll.name)
async def process_name(message: types.Message, state: FSMContext):
    async with state.proxy() as data: # Сохраняем данные в FSMContext
        data['name'] = message.text
    await UserPoll.next() # Переключаемся на следующее состояние ('age')
    await message.answer("Сколько вам лет?")

# 4. Обработка ответа в состоянии 'age' и завершение
@dp.message_handler(state=UserPoll.age)
async def process_age(message: types.Message, state: FSMContext):
    # ... (сохранение возраста)
    await state.finish() # Завершаем сценарий и сбрасываем состояние
    await message.answer("Спасибо за участие!")

Ключевые преимущества:

  • Структурированная логика: Код для каждого шага диалога изолирован в своем handler.
  • Хранение данных: FSMContext предоставляет временное хранилище для данных, собранных в ходе диалога.
  • Контроль диалога: Позволяет создавать нелинейные сценарии с ветвлениями и возвратами.