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

Как передавать переменные в состоянии в AIOGRAM?

Недавно AIOGRAM обновился, и поменял некоторые методы. Раньше переменные между хэндлерами можно было передавать через state,proxy() вроде бы. А сейчас я попросту не знаю как это реализовать).
Читал документацию - https://docs.aiogram.dev/en/dev-3.x/dispatcher/fin... . Но к сожалению после нескольких попыток ничего не получилось, вываливаются ошибки).

Так всё же как реализовать передачу данных в переменных между хэндлерами?

Отрезок кода где нужно реализовать передачу данных:
@dp.message(Form.pay_crypto_amount)
async def pay_amount(message: Message, state: FSMContext) -> None:
    pay_amount_text = int(message.text)
    await state.update_data(pay_crypto_amount = pay_amount_text)
    await message.answer(f'— Amount: *{pay_amount_text} USD*\n\n* Select the currency you want to pay your bill with*', reply_markup=kb.crypto_choice, parse_mode='Markdown')
    
    # Get amount in crypto by fiat summ
    crypto = AioCryptoPay(token='MYTOKEN', network=Networks.MAIN_NET)
    amount = await crypto.get_amount_by_fiat(summ=pay_amount_text, asset='USDT', target='USD')
    invoice = await crypto.create_invoice(asset='USDT', amount=amount)
    
    await state.clear()   
    
    while True:
        if invoice.status == 'PAID':
             await message.answer(f'GOOD')
        elif invoice.status == 'EXPIRED':
            # Инвойс истек, и платеж не был выполнен
            await message.answer('Payment expired. Please try again.')
        else:
            # Платеж еще не выполнен, можно ожидать некоторое время и повторно проверить статус
            await asyncio.sleep(30)  # Подождите 30 секунд и проверьте статус снова  

@dp.callback_query(F.data == 'usdt')
async def cancel(callback: CallbackQuery, state: FSMContext):
    await callback.message.answer(ТУТ ДЛЯ ПРИМЕРА НУЖНО ПРОСТО ВЫВЕСТИ ПЕРЕМЕННУЮ pay_amount_text КОТОРУЮ Я ЗАДАЛ ВЫШЕ)


Нужно передать переменную pay_amount_text которую мы задаем в хэндлеры выше, в хэндлер который обрабатывает кнопку ("usdt"). Тут для примера я просто вывожу её назад в бота.
  • Вопрос задан
  • 929 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@k1nster Автор вопроса
В AIOGRAM поменялись методы. Решил эту проблему вот так:

await state.update_data(pay_amount_text = message.text)

# Тут ваш другой хэндлер
data = await state.get_data()
crypto_amount = int(data["pay_amount_text"])
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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