Задать вопрос
@MaxMaksimov

Как вызвать Callback без inline клавиатуры?

Я хочу встроить answer_callback_query в код бота, чтобы в случае некорректного ответа пользователя вызывалось уведомление по центру экрана, то есть "await bot.answer_callback_query(callback_query.id, text='Введенное время недействительно. \nЭто должно быть число от 1 до 366.', show_alert=True)".
Но есть проблема, это работает только с callback, а у меня бот не на inline keyboard, а на ReplyKeyboardMarkup. Глянул документацию, попробовал сам сделать callback:
# . . .

callback_query = types.CallbackQuery(id=str(uuid.uuid4()), from_user=message.from_user, chat_instace=message.chat.id, message=message, data='setTime')
await bot.answer_callback_query(callback_query.id, text='Введенное время недействительно. \nЭто должно быть число от 1 до 366.', show_alert=True)

Но такой вариант не сработал, ошибка aiogram.utils.exceptions.InvalidQueryID: Query is too old and response timeout expired or query id is invalid

Я думаю что id некорректный потому что он в переменной есть, но он не отправлен, по этому id неправильный, ведь его формально нет. Но я не нашел как вручную отправить callback, и возможно ли такое вообще.
Можете подсобить?
  • Вопрос задан
  • 195 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@codingoleg
Если вопрос только в поп-ап уведомлении, то в апи телеграма написано, что метод только для 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)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы