Uncategorized

aiogram python викторина ошибка в функции хэндлера после выбора ответа


Добавила викторину в Telegram bot, бот доходит до неё, выводит первый вопрос и при выборе ответа вылетает ошибка: TypeError: poll_answer() missing 2 required positional arguments: ‘state’ and ‘message’
Хотя эти аргументы есть в этой функции. Помогите! Если меняю аргументы местами, то в ошибке будут 2 других аргумента (без первого).

Правильный ответ храню в машине состояний и передаю для сравнения с выбором пользователя в следующий хэндлер.

Заранее ОГРОМНОЕ спасибо за ответ!

@dp.message_handler(state = Profile.subscribe)
async def poll(message: types.Message, state: FSMContext):
    correct =0#индекс правильного ответа
    #отправляем вопрос
    await bot.send_poll(message.chat.id, 'В1', ['o1p', 'o2', 'o3', 'o4'], type="regular", correct_option_id=correct, is_anonymous=False)
    await state.update_data(test1 = correct)#сохраняем индекс правильного ответа  в state
    await Profile.next()
    
@dp.poll_answer_handler()
async def poll_answer(message: types.Message, quiz_answer: types.PollAnswer, state : FSMContext):
    data = await state.get_data()
    # проверяем ответ
    if  quiz_answer.option_ids[0] == data['test1']:#сравниваем ответ пользователя с правильным
        await bot.send_message(quiz_answer.user.id, 'Отлично! Идём дальше')
        correct = 1
        # отправляем следующий вопрос
        await bot.send_poll(message.chat.id, 'В2', ['о1', 'о2p', 'о3', 'о4'], type="regular", correct_option_id=correct, is_anonymous=False)
        await state.update_data(test2 = correct)
        await Profile.next()
    else:
        await bot.send_message(quiz_answer.user.id, 'Жаль, но это неправильный ответ.')
    
@dp.poll_answer_handler()
async def poll_answer(message: types.Message, quiz_answer: types.PollAnswer, state: FSMContext):
    data = await state.get_data()
    # проверяем ответ
    if quiz_answer.option_ids[0] == data['test2']:
        correct = 2
        await bot.send_message(quiz_answer.user.id, 'Правильно! Идём дальше')
        # отправляем следующий вопрос
        await bot.send_poll(message.chat.id, 'В3', ['о1', 'о2', 'о3p', 'о4'], type="regular", correct_option_id=correct, is_anonymous=False)
        await state.update_data(test3 = correct)
        await Profile.next()
    else:
        await bot.send_message(quiz_answer.user.id, 'Ответ неверный. Попробуй ещё раз.')

@dp.poll_answer_handler()
async def poll_answer(message: types.Message, quiz_answer: types.PollAnswer, state: FSMContext):
    data = await state.get_data()
    # проверяем ответ
    if quiz_answer.option_ids[0]== data['test3']:
        await bot.send_message(quiz_answer.user.id, 'Супер!')
        await state.finish()
    else:
        await bot.send_message(quiz_answer.user.id, 'Неверно, давай ещё разок)')

ОБНОВЛЁННЫЙ КОД:

@dp.message_handler(Profile.subscribe)
async def poll(message: types.Message, state: FSMContext):
    correct =0#индекс правильного ответа
    #отправляем вопрос
    await bot.send_poll(message.chat.id, 'В1', ['o1p', 'o2', 'o3', 'o4'], type="regular", correct_option_id=correct, is_anonymous=False)
    await state.set_state(Profile.test1)
    await state.update_data(test1 = correct)#сохраняем индекс правильного ответа  в state
    
    
@dp.poll_answer_handler(Profile.test1)
async def poll_answer(message: types.Message, quiz_answer: types.PollAnswer, state : FSMContext):
    data = await state.get_data()
    # проверяем ответ
    if  quiz_answer.option_ids[0] == data['test1']:#сравниваем ответ пользователя с правильным
        await bot.send_message(quiz_answer.user.id, 'Отлично! Идём дальше')
        correct = 1
        # отправляем следующий вопрос
        await bot.send_poll(message.chat.id, 'В2', ['о1', 'о2p', 'о3', 'о4'], type="regular", correct_option_id=correct, is_anonymous=False)
        await state.set_state(Profile.test2)
        await state.update_data(test2 = correct)
    else:
        await bot.send_message(quiz_answer.user.id, 'Жаль, но это неправильный ответ.')
    
@dp.poll_answer_handler(Profile.test2)
async def poll_answer(message: types.Message, quiz_answer: types.PollAnswer, state: FSMContext):
    data = await state.get_data()
    # проверяем ответ
    if quiz_answer.option_ids[0] == data['test2']:
        correct = 2
        await bot.send_message(quiz_answer.user.id, 'Правильно! Идём дальше')
        # отправляем следующий вопрос
        await bot.send_poll(message.chat.id, 'В3', ['о1', 'о2', 'о3p', 'о4'], type="regular", correct_option_id=correct, is_anonymous=False)
        await state.set_state(Profile.test3)
        await state.update_data(test3 = correct)
    else:
        await bot.send_message(quiz_answer.user.id, 'Ответ неверный. Попробуй ещё раз.')

@dp.poll_answer_handler(Profile.test3)
async def poll_answer(message: types.Message, quiz_answer: types.PollAnswer, state: FSMContext):
    data = await state.get_data()
    # проверяем ответ
    if quiz_answer.option_ids[0]== data['test3']:
        await bot.send_message(quiz_answer.user.id, 'Супер!')
        await state.finish()
    else:
        await bot.send_message(quiz_answer.user.id, 'Неверно, давай ещё разок)')

ОШИБКА

raceback (most recent call last):
  File "/Users/maksimklimencuk/Downloads/astro/astro.py", line 61, in <module>
    async def start_chat(message: types.Message, state: FSMContext):
  File "/Users/maksimklimencuk/Library/Python/3.9/lib/python/site-packages/aiogram/dispatcher/dispatcher.py", line 560, in decorator
    self.register_message_handler(callback, *custom_filters,
  File "/Users/maksimklimencuk/Library/Python/3.9/lib/python/site-packages/aiogram/dispatcher/dispatcher.py", line 486, in register_message_handler
    self.message_handlers.register(self._wrap_async_task(callback, run_task), filters_set)
  File "/Users/maksimklimencuk/Library/Python/3.9/lib/python/site-packages/aiogram/dispatcher/handler.py", line 62, in register
    filters = get_filters_spec(self.dispatcher, filters)
  File "/Users/maksimklimencuk/Library/Python/3.9/lib/python/site-packages/aiogram/dispatcher/filters/filters.py", line 48, in get_filters_spec
    data.append(get_filter_spec(dispatcher, i))
  File "/Users/maksimklimencuk/Library/Python/3.9/lib/python/site-packages/aiogram/dispatcher/filters/filters.py", line 28, in get_filter_spec
    raise TypeError('Filter must be callable and/or awaitable!')
TypeError: Filter must be callable and/or awaitable!

Ругается вот на это место (satrt_chat):

@dp.message_handler(commands="start")
async def send_welcome(message: types.Message, state: FSMContext):
    await bot.send_message(chat_id=message.chat.id, text="Добро пожаловать! Представьтесь)", reply_markup=types.ReplyKeyboardRemove())
    await state.set_state(Profile.name)

@dp.message_handler(Profile.name)
async def start_chat(message: types.Message, state: FSMContext):
    name = message.text
    await state.update_data(profile_name=name)
    await bot.send_message(chat_id=message.chat.id, text=f'Приятно познакомиться, {name}!\n' f'Введите свою почту, а я отправлю🎁!')
    await state.set_state(Profile.mail)



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *