Мне всегда интересно изучать новые возможности программирования и применять их на практике. Недавно я столкнулся с задачей создания inline-пагинации для Telegram-бота на фреймворке aiogram. Я хотел иметь возможность выводить результаты поиска пользователя поэтапно с помощью кнопок ″Вперед″ и ″Назад″‚ где каждая страница содержит по 6 результатов.Как и обычно‚ я начал с создания экземпляра класса Bot и Dispatcher aiogram⁚
python
bot Bot(tokenTELEGRAM_TOKEN)
dp Dispatcher(bot)
Затем я создал две функции⁚ одну для отправки результатов поиска и другую для обработки inline-кнопок. Для этого в aiogram используется декоратор `@dp.callback_query_handler`‚ который вызывает функцию при нажатии на кнопку.python
@dp.callback_query_handler(text″prev_page″)
async def prev_page_handler(call⁚ types.CallbackQuery)⁚
# Обработка нажатия на кнопку ″Назад″
# Отправка предыдущей страницы результатов поиска
@dp.callback_query_handler(text″next_page″)
async def next_page_handler(call⁚ types.CallbackQuery)⁚
# Обработка нажатия на кнопку ″Вперед″
# Отправка следующей страницы результатов поиска
Теперь давайте разберемся с функцией‚ которая будет отправлять результаты поиска пользователю. Я решил передавать результаты поиска в виде списка значений в аргументе функции.python
async def send_search_results(results⁚ list‚ chat_id⁚ int‚ message_id⁚ int)⁚
chunked_results [results[i⁚i 6] for i in range(0‚ len(results)‚ 6)]
pages_count len(chunked_results)
# Проверяем‚ что текущий message_id существует и находится в базе данных
# Обновляем текст сообщения с новыми результатами поиска
# Если страница не последняя‚ добавляем кнопку ″Вперед″
if pages_count > 1 and current_page ! pages_count⁚
inline_keyboard.row(InlineKeyboardButton(″Вперед″‚ callback_data″next_page″))
# Если страница не первая‚ добавляем кнопку ″Назад″
if pages_count > 1 and current_page ! 1⁚
inline_keyboard.row(InlineKeyboardButton(″Назад″‚ callback_data″prev_page″))
# Отправляем сообщение с результатами поиска и кнопками пагинации
await bot.edit_message_reply_markup(chat_idchat_id‚ message_idmessage_id‚ reply_markupinline_keyboard)
В этой функции я разбиваю список результатов поиска на части по 6 значений и храню их в `chunked_results`. Затем я вычисляю общее количество страниц с помощью `pages_count`.
Для каждой страницы я добавляю встроенные кнопки ″Вперед″ и ″Назад″ в зависимости от текущей страницы.
В конце я отправляю сообщение с результатами поиска и соответствующими кнопками пагинации.Теперь осталось только вызвать функцию `send_search_results` извне с нужным списком результатов поиска‚ chat_id (идентификатор чата) и message_id (идентификатор сообщения).python
results [1‚ 2‚ 3‚ 4‚ 5‚ 6‚ 7‚ 8‚ 9‚ 10‚ 11‚ 12‚ 13‚ 14‚ 15]
# Отправляем первую страницу результатов поиска
await send_search_results(results‚ chat_id‚ message_id)
Вот и все! Я успешно создал inline-пагинацию для Telegram-бота на aiogram с кнопками ″Вперед″ и ″Назад″. Теперь пользователь может легко просматривать результаты поиска по шагам‚ не загромождая экран сообщениями.
Я очень доволен результатом и готов использовать эту пагинацию в своих будущих проектах. Надеюсь‚ моя статья поможет и вам в создании такой функциональности для ваших ботов на основе aiogram!