В aiogram пагинация часто используется для удобного представления данных пользователю, особенно когда информация разбита на множество страниц. Реализация пагинации включает в себя создание интерактивных кнопок для навигации по страницам и отображение текущей позиции в общем контексте данных
Пример ниже демонстрирует, как можно реализовать пагинацию в боте на aiogram с использованием inline кнопок для навигации.
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
API_TOKEN = 'ВАШ_TELEGRAM_BOT_TOKEN'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Предположим, у нас есть список элементов для пагинации
items = ["Элемент 1", "Элемент 2", "Элемент 3", "Элемент 4", "Элемент 5", "Элемент 6", "Элемент 7", "Элемент 8", "Элемент 9", "Элемент 10"]
ITEMS_PER_PAGE = 5
def get_page_keyboard(page: int = 1):
pages = (len(items) - 1) // ITEMS_PER_PAGE + 1
keyboard = InlineKeyboardMarkup(row_width=3)
if page > 1:
keyboard.insert(InlineKeyboardButton(text="<<", callback_data=f"page_{page - 1}"))
keyboard.insert(InlineKeyboardButton(text=f"Страница {page} из {pages}", callback_data="current_page"))
if page < pages:
keyboard.insert(InlineKeyboardButton(text=">>", callback_data=f"page_{page + 1}"))
return keyboard
def get_items_for_page(page: int = 1):
start = (page - 1) * ITEMS_PER_PAGE
end = start + ITEMS_PER_PAGE
return items[start:end]
@dp.message_handler(commands=['start', 'help'])
async def send_welcome(message: types.Message):
keyboard = get_page_keyboard()
await message.answer("Выберите страницу:", reply_markup=keyboard)
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('page_'))
async def page_callback(callback_query: types.CallbackQuery):
page = int(callback_query.data.split('_')[1])
keyboard = get_page_keyboard(page)
items_for_page = get_items_for_page(page)
text = "n".join(items_for_page)
await bot.edit_message_text(text=f"Элементы на странице:n{text}", chat_id=callback_query.message.chat.id, message_id=callback_query.message.message_id, reply_markup=keyboard)
if name == 'main':
executor.start_polling(dp, skip_updates=True)
Важные уточнения и объяснения:
1. Инициализация бота: Создается экземпляр бота и диспетчера с использованием токена API.
2. Разбиение на страницы: Список items содержит элементы, которые нужно отобразить. Константа ITEMS_PER_PAGE определяет, сколько элементов будет показано на одной странице.
3. Формирование клавиатуры: Функция get_page_keyboard создает клавиатуру для навигации по страницам. Она адаптируется в зависимости от текущей страницы, показывая кнопки для перехода вперед и назад, а также отображая номер текущей страницы и общее количество страниц.
4. Отображение элементов для текущей страницы: Функция get_items_for_page возвращает срез списка элементов, соответствующий текущей странице.
5. Обработчики команд и колбэков: Обработчик сообщений реагирует на команды /start и /help, отправляя пользователю приветственное сообщение с клавиатурой для навигации. Обработчик колбэк-запросов обрабатывает нажатия на кнопки пагинации, обновляя сообщение с соответствующими элементами страницы и клавиатурой.
Этот подход позволяет эффективно управлять пагинацией в Telegram ботах, используя aiogram, обеспечивая пользователю удобный интерфейс для навигации по данным.