Как принимать только целочисленные числа aiogram?
Вот код
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, InputFile
import re
import pygsheets
from states import Form
path=''
gc = pygsheets.authorize(service_account_file=path)
sh = gc.open('pythontest')
wks = sh[0]
bot = Bot(token='')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
data = []
Estimilated_UK_sizes = {
0: "AA",
1: "A",
2: "B",
3: "C",
4: "D",
5: "DD",
6: "E",
7: "F",
8: "FF",
9: "G",
10: "GG",
11: "H",
12: "HH",
13: "J",
14: "JJ",
15: "K",
16: "KK",
17: "L",
18: "LL",
19: "M",
20: "MM",
21: "N",
24: "OO",
}
@dp.message_handler(Command('start'))
async def start(message: types.Message):
data.clear()
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
button_1 = types.KeyboardButton(text="Запустить")
keyboard.add(button_1)
await message.answer("Добро пожаловать на онлайн \n Я виртуальный помощник от \n Жми «запустить» и мы начнем", reply_markup=keyboard)
await Form.name.set()
@dp.message_handler(lambda message: message.text == "Запустить", state=Form.name)
async def process_name(message: types.Message, state: FSMContext):
await message.answer("Как я могу к тебе обращаться?")
await Form.age.set()
@dp.message_handler(state=Form.age)
async def process_age(message: types.Message, state: FSMContext):
data.append(message.text)
await message.answer(f"Отлично, {message.text} подскажи пожалуйста, сколько тебе лет?")
await Form.F.set()
@dp.message_handler(state=Form.F)
async def process_F(message: types.Message, state: FSMContext):
data.append(message.text)
await message.answer(f"Выбери свой тип Ф___ и напиши ответ цифрой (от 1-6)")
await Form.Forma.set()
@dp.message_handler(state=Form.Forma)
async def process_Forma(message: types.Message, state: FSMContext):
data.append(message.text)
await message.answer(f"Превосходно! Давай перейдем к твоей ____ выбери свою форму___(от 1-12))")
await Form.Position.set()
@dp.message_handler(state=Form.Position)
async def process_surname(message: types.Message, state: FSMContext):
data.append(message.text)
await message.answer(f"Выбери расположение……..\n(Фото с выбором 1 или 2)")
await Form.OPGinhale.set()
@dp.message_handler(state=Form.OPGinhale)
async def process_OPGinhale(message: types.Message, state: FSMContext):
data.append(message.text)
await message.answer("Супер! До консультации и подарочной скидки 20% на остался последний шаг")
await message.answer("Сделай замеры ОПГ вдох")
await Form.OPGouthale.set()
@dp.message_handler(state=Form.OPGouthale)
async def process_OPGouthale(message: types.Message, state: FSMContext):
data.append(message.text)
await message.answer("Сделай замеры ОПГ выдох")
await Form.OG.set()
@dp.message_handler(state=Form.OG)
async def process_OG(message: types.Message, state: FSMContext):
await message.answer("Сделай замеры ОГ")
data.append(message.text)
await Form.end.set()
@dp.message_handler(state=Form.end)
async def process_end(message: types.Message, state: FSMContext):
await message.answer("Спасибо за ответы!")
data.append(message.text)
print(data)
FirstFormula = int(data[5]) - 8
SecondFormula = (int(data[7]) - int(data[5])) / 2.54
SecondFormula = int(SecondFormula)
print(FirstFormula, SecondFormula)
if SecondFormula in Estimilated_UK_sizes:
size = Estimilated_UK_sizes[SecondFormula]
data.append(str(FirstFormula) + size)
data.append(message.from_user.id)
data.append(message.from_user.full_name)
print(data)
wks.append_table(data, start='A2', end=None,
dimension='ROWS', overwrite=False)
await state.finish()
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Некоторые хэндлеры должны принимать только числа и если это не число то бот отправляет сообщение по типу "Введите только числами". Пишу потому что не получается.
UPD.
@dp.message_handler(state=Form.F)
async def process_F(message: types.Message, state: FSMContext):
# data.append(message.text)
# await message.answer(f"Выбери свой тип Ф___ и напиши ответ цифрой (от 1-6)")
# await Form.Forma.set()
async with state.proxy() as data:
data['F'] = message.text
if data['F'].isdigit():
await message.answer(f"Выбери свой тип Ф___ и напиши ответ цифрой (от 1-6)")
await Form.Forma.set()
else:
await message.answer('введи целое положительное число')
Ответ бота [13.07.2023 23:36] Выбери свой тип Ф___ и напиши ответ цифрой (от 1-6)
Рамиль, [13.07.2023 23:36] ы
[13.07.2023 23:36] Превосходно! Давай перейдем к твоей ____ выбери свою форму___(от 1-12))
UPD2. Вот код
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, InputFile
import re
import pygsheets
from states import Form
path='studious-rhythm-390907-798ae3194f44.json'
gc = pygsheets.authorize(service_account_file=path)
sh = gc.open('pythontest')
wks = sh[0]
bot = Bot(token='')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
data = []
Estimilated_UK_sizes = {
0: "AA",
1: "A",
2: "B",
3: "C",
4: "D",
5: "DD",
6: "E",
7: "F",
8: "FF",
9: "G",
10: "GG",
11: "H",
12: "HH",
13: "J",
14: "JJ",
15: "K",
16: "KK",
17: "L",
18: "LL",
19: "M",
20: "MM",
21: "N",
24: "OO",
}
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
button_1 = types.KeyboardButton(text="Запустить")
keyboard.add(button_1)
await message.answer("Добро пожаловать на онлайн \n Я виртуальный помощник от \n Жми «запустить» и мы начнем", reply_markup=keyboard)
await Form.name.set()
@dp.message_handler(lambda message: message.text == "Запустить", state=Form.name)
async def process_start(message: types.Message, state: FSMContext):
await message.answer("Как я могу к тебе обращаться?")
await Form.name.set()
@dp.message_handler(state=Form.name)
async def process_name(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['name'] = message.text
await message.answer(f"Отлично, {message.text}, подскажи пожалуйста, сколько тебе лет?")
await Form.age.set()
@dp.message_handler(state=Form.age)
async def process_age(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['age'] = message.text
if data['age'].isdigit():
await message.answer(f"Выбери свой тип Ф___ и напиши ответ цифрой (от 1-6)")
await Form.F.set()
else:
await message.answer('введи целое положительное число')
@dp.message_handler(state=Form.F)
async def process_f(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['f'] = message.text
if data['f'].isdigit() and 1 <= int(data['f']) <= 6:
await message.answer(f"Превосходно! Давай перейдем к твоей ____ выбери свою форму___(от 1-12)")
await Form.Position.set()
else:
await message.answer('введи число от 1 до 6')
@dp.message_handler(state=Form.Position)
async def process_position(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['Forma'] = message.text
if data['Forma'].isdigit() and 1 <= int(data['Forma']) <= 12:
await message.answer(f"Выбери расположение……..\n(Фото с выбором 1 или 2)")
await Form.OPGinhale.set()
else:
await message.answer('введи число от 1 до 12')
@dp.message_handler(state=Form.OPGinhale)
async def process_OPGinhale(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['Position'] = message.text
await message.answer("Супер! До консультации и подарочной скидки 20% на остался последний шаг")
await message.answer("Сделай замеры ОПГ вдох")
await Form.OPGouthale.set()
@dp.message_handler(state=Form.OPGouthale)
async def process_OPGouthale(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['OPGinhale'] = message.text
await message.answer("Сделай замеры ОПГ выдох")
await Form.OG.set()
@dp.message_handler(state=Form.OG)
async def process_OG(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['OPGouthale'] = message.text
await message.answer("Сделай замеры ОГ")
await Form.end.set()
@dp.message_handler(state=Form.end)
async def process_end(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['OG'] = message.text
await message.answer("Спасибо за ответы!")
async with state.proxy() as data:
FirstFormula = int(data['OPGinhale']) - 8
SecondFormula = (int(data['OG']) - int(data['OPGinhale'])) / 2.54
SecondFormula = int(SecondFormula)
print(FirstFormula, SecondFormula)
if SecondFormula in Estimilated_UK_sizes:
size = Estimilated_UK_sizes[SecondFormula]
data["Formula"] = (str(FirstFormula) + size)
data["ID"] = message.from_user.id
data["UserName"] = message.from_user.full_name
print(data)
wks.append_table(data, start='A2', end=None,
dimension='ROWS', overwrite=False)
await state.finish()
Вот ошибка
85 3
FSMContextProxy state = 'Form:end', data = {'name': 'asd', 'age': '12', 'f': '1', 'Forma': '2', 'Position': '3', 'OPGinhale': '93', 'OPGouthale': '89', 'OG': '101', 'Formula': '85C', 'ID': 1915805542, 'UserName': 'Рамиль'}
Task exception was never retrieved
future: <Task finished name='Task-47' coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=KeyError(0)>
Traceback (most recent call last):
File "C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
File "C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
File "C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
File "C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
return await self.message_handlers.notify(update.message)
File "C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
File "c:\Users\Ramil\Desktop\Telegram\Order\main.py", line 148, in process_end
wks.append_table(data, start='A2', end=None,
File "C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\pygsheets\utils.py", line 214, in wrapper
return func(*args, **kwargs)
File "C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\pygsheets\worksheet.py", line 1138, in append_table
if type(values[0]) != list:
File "C:\Users\Ramil\Desktop\Telegram\Order\.venv\lib\site-packages\aiogram\dispatcher\storage.py", line 439, in __getitem__
return self._data[item]
KeyError: 0
Источник: Stack Overflow на русском