Как правильно указать аргумент в деклораторе '@dp.message_handler()', чтобы я мог записать в переменную число отправленное пользователем (aiogram)
Мне нужно положить число отправленное пользователем в переменную, но при вызове функции, ее вызов повторяется и бот не вызывает следующую функцию
@dp.message_handler(lambda message: message.text == 'Я ее знаю!' or message.text == 'Теперь я знаю!')
async def weight_know(message: types.Message):
await bot.send_message(message.from_user.id, 'Тогда проинформируйте меня.\n\nP.S. пишите только числа, без физических величин, иначе конечный результат приведет к ошибке. [Последующих вопросов это тоже касается].')
# --- Growth and The Weight
@dp.message_handler()
async def growth(message: types.Message):
# Adding weight to the database
global user_weight
user_weight = message.text
await bot.send_message(message.from_user.id, 'А сейчас мне нужен ваш рост')
# --- Growth and Age ---
@dp.message_handler()
async def age(message: types.Message):
global user_growth
user_growth = message.text
await bot.send_message(message.from_user.id, 'И под конец я должен узнать ваш возраст.')
Результат сейчас:
Желаемый результат:
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
Вот. Если есть вопросы задавайте.
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State
import config
bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
class FSM_Input(StatesGroup):
weight = State()
growth = State()
age = State()
@dp.message_handler(text=['Я ее знаю!', 'Теперь я знаю!'])
async def start(message: types.Message):
await message.answer(
'Тогда проинформируйте меня о вашем весе.\n\n'
'P.S. пишите только числа, без физических величин.'
'[Последующих вопросов это тоже касается].')
# запускаем стейт, теперь будут срабатывать только те хендлеры
# которые в фильтре имеют state=FSM_Input.weight
await FSM_Input.weight.set()
# делаем проверку число ли то что ввел юзер и стоит ли нужное на состояние
@dp.message_handler(lambda msg: msg.text.isdigit(), state=FSM_Input.weight)
async def get_weight(message: types.Message, state: FSMContext):
# записываем данные в стейт, после мы сможем получить их
async with state.proxy() as data:
data["weight"] = message.text
await message.answer('А сейчас мне нужен ваш рост')
# функция которая запускает следующий стейт в FSM_Input
# в целом можно просто каждый руками сетить, вот так
# await FSM_Input.growth.set()
await FSM_Input.next()
@dp.message_handler(lambda msg: msg.text.isdigit(), state=FSM_Input.growth)
async def get_growth(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data["growth"] = message.text
await message.answer('А сейчас мне нужен ваш возраст')
await FSM_Input.next()
@dp.message_handler(lambda msg: msg.text.isdigit(), state=FSM_Input.age)
async def get_age(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data["age"] = message.text
await message.answer(f'Ваш вес: {data["weight"]}\n'
f'Ваш рост: {data["growth"]}\n'
f'Ваш возраст: {data["age"]}\n')
await state.finish()
# теперт после этой строки стейт сброшен, и все данные в нем удалены
# заранее сделайте с ними что-то иначе они будут утеряны
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)


