Ответ
Управлять состоянием пользователя без FSM (Finite State Machine) можно, сохраняя его вручную в каком-либо хранилище. Это подходит для простых сценариев, где не требуется сложная логика переходов между состояниями.
Способы хранения состояния:
- Словарь в памяти (In-memory Dictionary): Подходит только для отладки. Данные теряются при перезапуске бота.
- Кэш (Redis): Быстрый и эффективный способ. Состояние хранится в виде пар
user_id:state
с возможностью установки времени жизни (TTL). - База данных (SQLite, PostgreSQL): Надёжный способ для хранения долгоживущих состояний и связанных с ними данных.
Пример на aiogram
с хранением в словаре:
from aiogram import Bot, Dispatcher, types
# ВАЖНО: Этот способ не подходит для продакшена, т.к. данные теряются при перезапуске
user_states = {}
bot = Bot(token="YOUR_API_TOKEN")
dp = Dispatcher(bot)
# Шаг 1: Запускаем диалог и устанавливаем состояние
@dp.message_handler(commands=['register'])
async def start_registration(message: types.Message):
user_id = message.from_user.id
user_states[user_id] = "waiting_for_name"
await message.answer("Введите ваше имя:")
# Шаг 2: Обрабатываем сообщение в зависимости от текущего состояния
@dp.message_handler()
async def process_message(message: types.Message):
user_id = message.from_user.id
current_state = user_states.get(user_id)
if current_state == "waiting_for_name":
name = message.text
await message.answer(f"Отлично, {name}! Теперь введите ваш возраст.")
# Переводим пользователя в следующее состояние
user_states[user_id] = "waiting_for_age"
elif current_state == "waiting_for_age":
age = message.text
await message.answer(f"Регистрация завершена! Ваш возраст: {age}")
# Очищаем состояние после завершения диалога
del user_states[user_id]
Преимущества:
- Простота реализации для коротких диалогов.
- Полный контроль над логикой хранения.
Недостатки:
- Код быстро усложняется с ростом числа состояний.
- Требуется вручную реализовывать логику переходов и очистки состояний.
Для сложных ботов использование встроенных механизмов FSM (aiogram.fsm
) является предпочтительным.