Ответ
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предоставляет временное хранилище для данных, собранных в ходе диалога. - Контроль диалога: Позволяет создавать нелинейные сценарии с ветвлениями и возвратами.