функция bot.register_next_step_handler() из TelagramBotAPI

Вроде чуть-чуть знаю библиотеку TelegramBotAPI, решил изучить aiogram, и сразу столкнулся с проблемой, что не знаю как сразу захватывать ответ пользователя после того как он ответил на вопрос бота. Так вот, в telebot за это отвечает функция bot.register_next_step_handler() А в aiogram есть функция с таким же действием? Нигде просто не смог найти.


Ответы (1 шт):

Автор решения: mrBars1k

Я и сам недавно столкнулся с этим, после перехода на Aiogram3. Обычно здесь не пишут готовые решения, если не предложены попытки, но я сам сталкивался с недопониманием, поэтому вот.

Здесь совершенно другой подход к решению таких задач. Вместе указания следующей функции, здесь используется FSM (машина состояний), в которой отслеживается текущее состояние, можно динамически их переключать и перенаправлять.

Для сравнения, я Вам дам два идентичных по функционалу кода, но на двух библиотеках для наглядности:

Telebot:

@bot.message_handler(commands=['start'])
def test(message):
    bot.send_message(message.chat.id, text='Пожалуйста, введите своё имя')

    bot.register_next_step_handler(message, new_func)

def new_func(message): 
    name = message.text
    bot.send_message(message.chat.id, text=f'{name} — какое красивое имя. Рад с Вами познакомится.')

Aiogram3:

import aiogram

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

class Form(StatesGroup):
    name = State() 

@dp.message(Command('start'))
async def test(message: Message, state: FSMContext):
    await message.answer("Пожалуйста, введите своё имя")
    await state.set_state(Form.name)

@dp.message(Form.name)
async def new_func(message: Message, state: FSMContext):
    name = message.text
    await message.answer(f"{name} — какое красивое имя. Рад с Вами познакомиться.")
    await state.clear()

Таким образом, Вы можете заранее объявить все нужны состояния, а затем указывать на какой переключится и затем очистить состояния, чтобы выйти из этого.

Полезные ссылки:

Неплохая статья

Есть вот такое видео-объяснение

Официальная документая

→ Ссылка