Как убрать клавиатуру бота (aiogram)?

Рейтинг: 2Ответов: 1Опубликовано: 19.02.2023

Встала задача, чтобы при нажатии обычной кнопки передачи геопозиции бот отвечал сообщением с инлайн-кнопками, но при этом пропадала кнопка передачи геопозиции. В await message.answer я могу либо указывать инлайн-клавиатуру, либо удаление обычной клавиатуры:

await message.answer("text", reply_markup=markup)

либо

await message.answer("text", reply_markup=types.ReplyKeyboardRemove())

Как я могу это объединить?

Ответы

▲ 2Принят

Вот Вам вариант решения, возможно он не самый оптимальный, но, все же, является действенным и полностью соответствует Вашему запросу.

Код выполняет следующий алгоритм: 1) Пользователь инициирует /start и получает обычную кнопку "Отправить геопозицию"; 2) Пользователь решается на это не самое безопасное действие и отправляет свою геопозицию; 3) Ваш добропорядочный бот оправляет пользователю сообщенние с его геопозицией (в этом тестовом примере); 4) К этому сообщению бот прикрепляет 2 инлайн кнопки; 5) В тоже время бот выполняет процедуру удаления обычной кнопки "Отправить геопозицию".

Для пользователя пункты 3-5 происходят одновременно :)

P.s. После нажатия кнопки /start кнопка возвращается во своя оси. И можно смело выполнять все заново.

from aiogram import Bot, Dispatcher, types
from aiogram.types import ParseMode
from aiogram.utils import exceptions, executor

API_TOKEN = '{Ваш токен}'



bot = Bot(token=API_TOKEN, parse_mode=ParseMode.HTML)
dp = Dispatcher(bot)

# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def start_handler(message: types.Message):
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button = types.KeyboardButton(text="Отправить геопозицию", request_location=True)
    keyboard.add(button)
    await message.answer("Добро пожаловать! Нажмите кнопку, чтобы отправить свою геопозицию.", reply_markup=keyboard)

# Обработчик получения геопозиции
@dp.message_handler(content_types=types.ContentType.LOCATION)
async def location_handler(message: types.Message):
    latitude = message.location.latitude
    longitude = message.location.longitude

    keyboard = types.InlineKeyboardMarkup()
    button1 = types.InlineKeyboardButton(text="Первая кнопка", callback_data='btn1')
    button2 = types.InlineKeyboardButton(text="Вторая кнопка", callback_data='btn2')
    keyboard.add(button1, button2)

    keyboard_to_delete = types.ReplyKeyboardRemove() 
    await message.answer(f"Ваша геопозиция: {latitude}, {longitude}", reply_markup=keyboard)
    try:
        # Пытаемся удалить кнопку "Отправить геопозицию"
        await bot.delete_message(chat_id=message.chat.id, message_id=message.message_id - 1)
    except exceptions.MessageToDeleteNotFound:
        # Если кнопка уже удалена, то продолжаем выполнение кода

        pass

# Обработчик нажатий на кнопки инлайн-клавиатуры
@dp.callback_query_handler(lambda callback_query: True)
async def callback_handler(callback_query: types.CallbackQuery):
    if callback_query.data == 'btn1':
        await bot.answer_callback_query(callback_query.id, "Вы нажали первую кнопку.")
    elif callback_query.data == 'btn2':
        await bot.answer_callback_query(callback_query.id, "Вы нажали вторую кнопку.")


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)