Задать вопрос
@Zaphkiel02

Как сделать ожидание ответа aiogram и где ошибка в коде?

Пишу бота который должен считать данные пользователя и отправить его администраторам на рассмотрение. Не могу написать сбор имени, даты рождения и т.д., программа зависает на просьбе ввести ФИО. Я новичок поэтому можно больше разъяснений.
bot = Bot(token)
dp = Dispatcher(bot)

dp = Dispatcher(bot, storage=MemoryStorage())
dp.middleware.setup(LoggingMiddleware())

# клавиши да нет
button_yes = InlineKeyboardButton("ДА", callback_data="answ_YES")
button_no = InlineKeyboardButton("НЕТ", callback_data="answ_NO")
inline_kb = InlineKeyboardMarkup().add(button_yes, button_no)


@dp.message_handler(commands=["start"])
async def start_command(message: types.message):
    await message.reply("Вас приветствует чат-бот Telegram ", reply=False)
    await message.reply("Внимание! Для получения сведений на"
                        " телефоне должно быть установлено приложение Telegram", reply=False)
    await message.reply("У вас установлено приложение Telegram?", reply_markup=inline_kb, reply=False)


@dp.message_handler(commands=["doc"], state=None)
async def documents(message: types.message):
    await message.reply("Для отправки запроса на получение Номера, нужно ввеести свои данные. Прошу указать:")
    await FMSUser.name.set()
    await message.reply("Фамилию Имя Отчество:")

# Ловим Имя
@dp.message_handler(content_types=["name"], state=FMSUser.name)
async def load_name(message: types.Message, state=FSMContext):
    await print("123")
    global Name
    Name = message.text
    await FMSUser.next()
    await message.reply("Введите день рождения:", reply=None)
    await print(Name)

# ловим день рождения
@dp.message_handler(state=FMSUser.date_of_birth)
async def load_date_of_birth(message: types.Message, state=FSMContext):
    Date_of_birth = message.text
    await print(Date_of_birth)
    await FMSUser.next()
    await message.reply("Введите ИНН:")

# ловим ИНН
@dp.message_handler(state=FMSUser.INN)
async def load_INN(message: types.Message, state=FSMContext):
    Inn = message.text
    await print(Inn)
    await FMSUser.next()
    await message.reply("Введите паспортные данные:")

# ловим паспортные данные
@dp.message_handler(state=FMSUser.passport)
async def load_passport(message: types.Message, state=FSMContext):
    Passport = message.text
    await print(Passport)
    await FMSUser.finish()

# реакция на нажатие кнопки
@dp.callback_query_handler(Text(startswith="answ_"))
async def callback_func(callback: types.CallbackQuery):
    answer = callback.data.split("_")[1]
    if answer == "YES":
        await callback.message.reply("Хорошо, продолжаем! Напишите команду "
                                     "/doc")
    elif answer == "NO":
        await callback.message.reply("Извините мы не сможем предоставить вам услугу!")
    await bot.answer_callback_query(callback.id)


if __name__ == '__main__':
    executor.start_polling(dp)
  • Вопрос задан
  • 1001 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
Нужно сначала отправлять сообщение, только потом менять состояние.
Если привести пример вашего кода, то
await message.reply("Фамилию Имя Отчество:")
await FMSUser.name.set()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Wispik
@Wispik
global Name
Зачем эта строка? У тебя нет глобальной переменной Name
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы