Как в телеграмм боте на aiogram сделать чтобы бот реагировал на второе сообщение в условие?
У меня есть бот который решает задачи по геометрии.Например,пользователь введет площадь круга,бот отправляет ему сообщение "Напишите радиус круга",потом у меня возникает вопрос как взять этот радиус круга.Через if проверить я не могу, а как отдельную функцию тоже не получиться,потому что там не только площадь круга.
@dp.message_handler(content_types=types.ContentTypes.TEXT)
async def mess(message:types.Message, state: FSMContext):
if message.text=="Площадь круга":
await bot.send_message(message.chat.id,'Напишите радиус круга')
user_data = await state.get_data()
r=float(message.text)
await message.answer(f"Площадь круга равна " + str(area_of_circle(r)))
Ответы (3 шт):
import logging
from aiogram import Bot, Dispatcher, executor, types
from aiogram.dispatcher import FSMContext
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import State, StatesGroup
class DataInput(StatesGroup):
r = State()
bot = Bot(token="#токен")
dp = Dispatcher(bot, storage=MemoryStorage())
@dp.message_handler(commands=['radius'])
async def hello(message: types.Message):
await bot.send_message(message.from_user.id, 'Напишите радиус круга')
await DataInput.r.set()
@dp.message_handler(state=DataInput.r)
async def radius(message: types.Message, state: FSMContext):
r = message.text
await message.answer(f"Площадь круга равна " + str(area_of_circle(r)))
await state.finish()
if __name__ == '__main__':
executor.start_polling(dp,skip_updates=True)
Я использую вложенную функцию на которую вещаю декоратор Когда срабатывает декоратор команды, вызывается функция которая задает вопрос пользователю, после чего ожидает ответа и работает декоратор сообщения, который ловит текст, после выполнения вложенной функции. будет выполнен return
@dispatcher.message_handler(commands=['convert_usd_rub'])
async def convert_usd_rub(message: types.Message):
await bot.send_message(message.chat.id, 'Какую сумму вы хотите перевести из USD в RUB?')
@dispatcher.message_handler()
async def usd_rub(message: types.Message):
r = requests.get('https://www.cbr-xml-daily.ru/daily_json.js')
r = r.json()
r = r.get('Valute')
usd = r.get('USD')
usd = usd.get('Value')
usd = "%.2f" % usd
number = re.search("\d+\.\d+", message.text, flags=0)
try:
if number is None:
number = str(message.text + '.00')
conver = float(usd) * float(number)
now = datetime.datetime.now()
date = now.strftime("%Y-%m-%d %H:%M")
conver = "%.2f" % conver
await bot.send_message(message.chat.id, f'Курс валют: {number}$ это {conver}₽\nКурс актуален на {date}')
else:
conver = float(usd) * float(number.group())
conver = "%.2f" % conver
now = datetime.datetime.now()
date = now.strftime("%Y-%m-%d %H:%M")
await bot.send_message(message.chat.id, f'Курс валют: {number.group()}$ это {conver}₽\nКурс актуален на {date}')
except:
await bot.send_message(message.chat.id,f'Введено не корректное значение: {message.text}')
return
Если я правильно понял тебя и ты хочешь сделать через if то вот. После return бот больше не принимает команды. Все введенные данные будут сохраняться в список data который можно вернуть пользователю или распарсить как тебе нужно. После чего ты можешь вызвать класс и передать туда данные
@dispatcher.message_handler(commands=['match'])
async def match(message: types.Message):
await bot.send_message(message.chat.id, 'Какую команду выполнить?')
data = []
@dispatcher.message_handler()
async def text(message: types.Message):
if message.text == "1":
data.append(1)
await bot.send_message(message.chat.id,'Привет')
elif message.text == "2":
data.append(2)
await bot.send_message(message.chat.id, "Пока")
elif message.text == "3":
class_a = a().aa(data)
data.append(class_a)
await bot.send_message(message.chat.id,data)
else:
return
class a():
def aa(self, arr ):
b = []
for i in arr:
b.append(str(i) + 'класс АААААА')
return b