Есть ли у вас проблемы с использованием состояния машины в aiogram?

Я новичок в Python и недавно начал программировать. В качестве первой задачи я выбрал создание Telegram-бота. Я исправил многие другие ошибки, но с этой не могу справиться. Возможно, я рано начал изучать машину состояний. Пожалуйста, помогите мне. 

ОШИБКА:
```
File "D:\PythonProject1\main.py", line 62, in 
async def add_name(message: types.Message, state: FSMContext): 
File "D:\PythonProject1\.venv\lib\site-packages\aiogram\dispatcher\event\telegram.py", line 138, in wrapper 
self.register(callback, *filters, flags=flags, **kwargs) 
File "D:\PythonProject1\.venv\lib\site-packages\aiogram\dispatcher\event\telegram.py", line 68, in register 
raise UnsupportedKeywordArgument( 
aiogram.exceptions.UnsupportedKeywordArgument: Passing any additional keyword arguments to the registrar method is not supported. 
This error may be caused when you are trying to register filters like in 2.x version of this framework, if it's true just look at corresponding documentation pages. 
Please remove the {'state'} arguments from this call.
```

КОД:
```python
class Form(StatesGroup): 
    name = State() 
    soname = State() 

@start_router.message(lambda message: '???' in message.text.lower()) 
async def add_tg(message: types.Message, state: FSMContext): 
    # тут идет подключение к базе данных и добавление данных, думаю это не очень важно 
    await state.name.set() 

@dp.message(state=Form.name) 
async def add_name(message: types.Message, state: FSMContext): 
    user_name = message.text.strip() 
    async with aiosqlite.connect('base.db') as db: 
        db.execute('INSERT OR IGNORE INTO user (Name) VALUES("%s")' % (user_n
```
  • 5 января 2025 г. 5:13
Ответы на вопрос 1
Ошибка, с которой вы столкнулись, связана с тем, как вы регистрируете обработчики сообщений в библиотеке `aiogram`. Судя по сообщению об ошибке, вы передаёте дополнительные аргументы (`state`) в декоратор обработки сообщений, что не поддерживается в текущей версии `aiogram`.

Давайте разберём ваш код и исправим его:

1. Для регистрации обработчика для состояния, используйте тот же механизм, что и для обычных обработчиков, однако применяйте встроенные методы для указания состояния.

2. В вашем случае необходимо использовать `@dp.message_handler(state=Form.name)` вместо `@dp.message(state=Form.name)`.

Ваш исправленный код будет выглядеть примерно так:

```python
from aiogram import types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State

class Form(StatesGroup): 
    name = State() 
    soname = State() 

@start_router.message(lambda message: '???' in message.text.lower())
async def add_tg(message: types.Message, state: FSMContext):
    await Form.name.set()  # Устанавливаем состояние

@dp.message_handler(state=Form.name)  # Правильный декоратор
async def add_name(message: types.Message, state: FSMContext): 
    user_name = message.text.strip() 
    async with aiosqlite.connect('base.db') as db: 
        await db.execute('INSERT OR IGNORE INTO user (Name) VALUES(?)', (user_name,))  # Используйте параметризованный запрос
        await db.commit()  # Не забудьте зафиксировать изменения
    await state.finish()  # Завершаем состояние, если это необходимо
```

Также обратите внимание на следующие моменты:
- Используйте параметризированные запросы (`VALUES(?)`), чтобы избежать SQL-инъекций.
- Не забудьте использовать `await db.commit()`, чтобы зафиксировать транзакцию после внесения изменений в базу данных.
- Вы также можете вызвать `await state.finish()`, если хотите завершить состояние после обработчика. 

Таким образом, вы должны избавиться от ошибки, и всё должно заработать корректно!
Похожие вопросы