Как сделать проверку числа в callback? Aiogram
При нажатии кнопки пополнить баланс бот должен попросить ввести сумму на какое число пополнить баланс, а после проверить является ли числом введённая строка, я написал функцию, но при проверке бот проверяет своё же сообщение и выдаёт ошибку aiogram.utils.exceptions.Unauthorized: Forbidden: bots can't send messages to bots
Вот код:
@dp.callback_query_handler(text='top_up')
async def top_up_balance(call: types.CallbackQuery):
await bot.send_message(chat_id=call.from_user.id,text='Введите сумму на которую вы хотели бы пополнить ваш счёт!')
if is_int(call.message.text): #также пробовал isdigit()
await bot.send_message(chat_id=call.message.from_user.id, text='Здесь будет ссылка для оплаты')
else:
await bot.send_message(chat_id=call.message.from_user.id, text='Вы должны написать целое число на которое хотите пополнить ваш счёт!')
Ответы (1 шт):
как я понял, после нажатия кнопки, пользователь должен ввести сумму, напечатав это в сообщении. Для этого я использовал try и except. Твоя первая ошибка - это то что ты проверяешь сообщение от пользователя сразу внутри хендлера, где просишь ввести сумму. Надо писать отдельный хендлер, чтобы отдельный хендлер проверил это на наличие типа int. Так же надо подключить машину состояний, чтобы хендлер ожидал введенное число от пользователя и в случае невыполнения данного условия, просил заново ввести, теперь уже число. неправильно:
@dp.callback_query_handler(text='top_up')
async def top_up_balance(call: types.CallbackQuery):
await bot.send_message(chat_id=call.from_user.id,text='Введите сумму на которую вы хотели бы пополнить ваш счёт!')
if is_int(call.message.text): #также пробовал isdigit()
await bot.send_message(chat_id=call.message.from_user.id, text='Здесь будет ссылка для оплаты')
else:
await bot.send_message(chat_id=call.message.from_user.id, text='Вы должны написать целое число на которое хотите пополнить ваш счёт!')
правильно:
from aiogram.dispatcher import FSMContext
@dp.callback_query_handler(text='top_up')
async def top_up_balance(call: types.CallbackQuery):
await state.set_state("num")
await bot.send_message(chat_id=call.from_user.id,text='Введите сумму на которую вы хотели бы пополнить ваш счёт!')
@dp.message_handler(content_types=types.ContentTypes.ANY, , state="num")
async def got_it(message: types.Message, state: FSMContext):
try:
number = int(message.text)
await message.answer("Здесь будет ссылка для оплаты")
await state.finish()
except ValueError:
await message.answer("Вы должны написать целое число на которое хотите пополнить ваш счёт!")
Надеюсь я смог помочь, это мой первый ответ.