@Odloman

Как исправить повторную отправку сообщения телеграм бота в коде Python Aiogram?

Не понимаю как здесь это исправить, через if не хватает мозгов сделать(то, что пробовал, не помогло), понимаю что в функции отправляется сообщение каждый раз когда вызывается Функция отображения, но сообщение остается наверху ( вроде как получается неправильно написана show_page) там как раз каждый раз при вызове колбека он отправляет сообщение.
В общем для меня пока логика выявления ошибок сложная, первый проект, извините
async def pages(message: types.Message):
    await show_pages(message.chat.id, page=0)

# Функция отображения 
async def show_pages(chat_id, page):
    start_index = page * numbers_per_page
    end_index = (page + 1) * numbers_per_page

    # Создаем клавиатуру для пагинации
    keyboard = InlineKeyboardMarkup(row_width=2)

    for items in pages_list[start_index:end_index]:
        keyboard.insert(InlineKeyboardButton(items, callback_data=','))

    if start_index > 0:
        keyboard.insert(InlineKeyboardButton('⬅ Назад', callback_data=f'paginate:{page-1}'))
    if end_index < len(pages_list):
        keyboard.insert(InlineKeyboardButton('Вперед ➡', callback_data=f'paginate:{page+1}'))

    sent_message = await bot.send_message(chat_id, text='Выберите страницу:', reply_markup=keyboard)
    return sent_message.message_id

# Обработчик кнопок
async def callback_handler(query: types.CallbackQuery):
    current_page = int(query.data.split(':')[1])
    message_id = await show_page(query.message.chat.id, page=current_page)
    # Редактируем сообщение вместо отправки нового
    await bot.edit_message_text(chat_id=query.message.chat.id, message_id=query.message.message_id, text='Выберите страницу:',
                                reply_markup=InlineKeyboardMarkup())
    # Не забываем подтвердить получение callback
    await query.answer()


659fe7260945d701187958.jpeg
  • Вопрос задан
  • 171 просмотр
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Включи голову и пройди программу по шагам.
# Функция отображения 
async def show_pages(chat_id, page):
    ...
    # тут ты отправляешь сообщение!
    sent_message = await bot.send_message(chat_id, text='Выберите страницу:', reply_markup=keyboard)
    return sent_message.message_id

# Обработчик кнопок
async def callback_handler(query: types.CallbackQuery):
    ...
    message_id = await show_page(query.message.chat.id, page=current_page)  # <-- show_page() отправляет сообщение!
    # Редактируем сообщение вместо отправки нового <-- не вместо, а после отправки нового
    await bot.edit_message_text(chat_id=query.message.chat.id, message_id=query.message.message_id, text='Выберите страницу:',
                                reply_markup=InlineKeyboardMarkup())  # <-- сносишь клавиатуру у старого сообщения


Я бы переписал show_page() так, чтобы она возвращала подготовленную для пагинации клавиатуру, а потом уже эту клавиатуру использовал в коде, который show_page() вызывает.
Альтернативно, переделай show_page() так, чтобы она всегда редактировала переданное ей существующее сообщение. Тогда при первом показе ты сначала отправляешь "Подождите..." а потом это сообщение отдаёшь для переделки show_page(). При последующих ты переиспользуешь это сообщение.
Но нужно иметь ввиду - вроде есть лимит времени на правку сообщения.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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