Если вопрос только в поп-ап уведомлении, то в апи телеграма написано, что метод только для Inline клавиатур. Поэтому aiogram вам ничем не поможет. Если нужна проверка входящих данных, то можно использовать один из или все три варианта: 1. Машина состояний. 2. Функция проверки в аргументах декоратора. 3. Middleware для более сложных случаев. Вот вам 1 и 2 вариант:
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import ReplyKeyboardMarkup
from aiogram.contrib.fsm_storage.memory import MemoryStorage
bot = Bot('')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=MemoryStorage())
state_time = 'setTime'
kb = ReplyKeyboardMarkup(row_width=10, one_time_keyboard=True)
btns = (types.KeyboardButton(str(btn)) for btn in range(1, 31))
kb.add(*btns)
@dp.message_handler(commands=['start'])
async def dp_choose_user(message: types.Message):
await message.answer('Введите день:', reply_markup=kb)
await dp.current_state().set_state(state_time) # Вход в состояние ввода даты
@dp.message_handler(lambda message: message.text.isdigit() and 1 <= int(message.text) <= 30, state=state_time)
async def dp_choose_action(message: types.Message):
await message.answer(text=f'Вы выбрали {message.text}')
await dp.current_state().reset_state() # Выход из состояния ввода даты
@dp.message_handler(state=state_time)
async def dp_choose_action(message: types.Message):
await message.answer(text='Ошибка ввода даты. Введите еще раз.', reply_markup=kb)
executor.start_polling(dp)