Async telebot. Ошибка в коде — нужно взять ответ пользователя в переменную

Рейтинг: 0Ответов: 0Опубликовано: 22.03.2023

Всем привет! Сделал на синхронного бота на telebot, работал как положено. Сейчас переписываю в асинх и основной код не выполняется с ошибкой.

23:32:58,745 (async_telebot.py:534 MainThread) ERROR - TeleBot:
"You are passing more data than the handler needs.
Check your handler: <class '__main__.MyStates'>"

Как должен работать бот:

  1. По команде 'tg' бот спрашивает фразу
  2. ждёт ответа от пользователя
  3. ответ пользователя забирается в переменную и выполняется ещё код
  4. на выходе из кода получаем переменную 'answer_db'
  5. Отдаём пользователю сообщением, в противном случае говорим что у него закончились "лимиты".

Что не получается? В синхроне вторая функция принимала ответ, но в асинх это не работает, я не смог найти в документации чем заменить и как это сделать.

В документации разобраться не хватает мозгов, подходящей статьи не нашёл ни в гугле, ни в яндексе.

В коде есть слово 'привет', через функцию над этим словом дебагер просто перепрыгивает в моём коде, привет тоже не печатает.

import asyncio
import sqlite3
from telebot import util
from telebot.async_telebot import AsyncTeleBot
from telebot.asyncio_handler_backends import State, StatesGroup
from telebot.asyncio_storage import StateMemoryStorage

token = "еtokentoken"
bot = AsyncTeleBot(token, state_storage=StateMemoryStorage())

@bot.message_handler(func=lambda message: True, commands=['gt'])
class MyStates(StatesGroup):
    answer_state = State()

async def get_themes(message, *args, **kwargs):
    mesg = bot.send_message(message.chat.id, text='Давай фразу: ')
    bot.set_state(MyStates.answer_state, message.from_user.id, message.chat.id)

    print('Привет..')
    bot.register_next_step_handler(mesg, action1)

async def action1(message):
    with bot.retrieve_data(message.chat.id) as data:
        data['answer_state'] = message.text = user_answer
    # user_answer = message.text
    id = message.from_user.id
    user_name = message.from_user.first_name

    # дальше код, в которую нужна переменная *answer_db*

        with bot.retrieve_data(MyStates.answer_state) as data:
            data['answer_state'] = message.text
        await bot.send_message(message.chat.id, text=answer_db)
        await bot.delete_state(message.from_user.id, message.chat.id)
    else:
        async with bot.retrieve_data(MyStates.answer_state) as data:
            await bot.send_message(message.chat.id,
                                   text=f'{user_name}, получай ответ')
        await bot.delete_state(message.from_user.id, message.chat.id)

asyncio.run(bot.polling(none_stop=True, allowed_updates=util.update_types))

Ответы

Ответов пока нет.