Как исправить ошибку aiogram.exceptions.TelegramBadRequest: Telegram server says - Bad Request: message to delete not found*?

  1. Высылается инлайн клавиатура1 с кнопкой '❌'-отмена
  2. За ней высылается стикер1
  3. При нажатии на кнопку '❌' стикер1 удаляется и инлайн клавиатура1 исчезает и появляется на её месте инлайн клавиатура2 с кнопкой '✅'-переход в инлайн клавиатуру1
  4. При нажатии на кнопку '✅' инлайн клавиатуры2, инлайн клавиатура2 исчизает и на её месте появляется инлайн клавиатура1 и высылается стикер1, и так до бесконечности.

У меня возникает такая ошибка при повторном удалении стикера:

TelegramBadRequest(method=method, message=description)
aiogram.exceptions.TelegramBadRequest: Telegram server says - Bad Request: message to delete not found* 

Вот мой код:

@router.callback_query(F.data == '1)Жанры+')# Кнопка 
async def hello(callback_query: CallbackQuery):
    await callback_query.answer('') 
    await callback_query.message.edit_text('?Какой Като ты выберешь??', reply_markup=kb.Anime_genres_sections)#клавиатура1
    d_t = await callback_query.message.reply_sticker(
        'CAACAgIAAxkBAAIB0WZsRdBt8YTsYqppVF15ASsWZp1YAAKgTAACoPxhS49-ChSO_O50NQQ') # Высылается стикер1
    if F.data == '2Отмена':
        async def otm2():
            await otm2()

        @router.callback_query(F.data == '2Отмена')#Кнопка отмены❌
        async def otm2(callback: CallbackQuery):
            await callback.message.edit_text('Виды жанров:',
                                             reply_markup=kb.Onongi_Announcements_Top_100_Anime_genres)#клавиатура2
            try:
               await d_t.delete()# Удаление стикера1
            except TelegramBadRequest:
                print('Sticker was delete!')#Обработка этой ошибки

Ответы (1 шт):

Автор решения: Medvedev

В самом тексте указана причина возникновения ошибки.

Переменную d_t вы создаете в функции hello, а применять пытаетесь в функции otm2. Что бы исправить ошибку вам необходимо придумать как передавать значения d_t в функцию otm2. Либо передавать в аргументах функции, либо делать глобальной, либо что то ещё, что вам больше нравится.

Далее, эта непонятная конструкция вообще ни к чему, её можно смело убрать.

if F.data == '2Отмена':
    async def otm2():
        await otm2()

У вас стоит обработчик callback_query который реагирует на нажатие конкретной инлайн кнопки и вызывает функцию otm2. Если же хотите обрабатывать все колбеки в одной функции, тогда следует записать так:

@router.callback_query() # будет срабатывать при нажатии любой инлайн кнопки
async def call_func(callback: CallbackQuery):

    if F.data == '2Отмена': # перебираете data и запускаете нужную функцию
        await otm2() # запускает функцию

    elif F.data == 'другие кнопки':
        pass # и далее по аналогии

Но в таком случае обработчики других колбеков должны быть либо выше этой функции, либо сами функции должны вызываться из общего обработчика колбеков.

Надеюсь логика стала понятней

→ Ссылка