Python Telegram Pagination Bot

Recientemente, me enfrenté a la tarea de paginar una lista de elementos en un bot de telegramas. Y se sorprendió al descubrir que para una tarea aparentemente tan típica, PyPi no tiene una sola biblioteca. Por lo tanto, se decidió corregir esta molesta omisión y publicar su implementación.


Puede instalar el paquete desde PyPi ejecutando en la consola:


pip install python-telegram-bot-pagination

La clase InlineKeyboardPaginator del paquete telegram_bot_pagination facilita la obtención de un conjunto de botones en línea para navegar por las páginas de la lista. Es necesario transferir al constructor el número de páginas en las que se divide la lista de elementos, así como la página actual y el patrón para generar los datos devueltos presionando el botón bot. Después de eso, el paginador mismo formará el teclado necesario, que estará disponible a través de la propiedad de marcado.


from telegram_bot_pagination import InlineKeyboardPaginator

paginator = InlineKeyboardPaginator(
        10,
        current_page=1,
        data_pattern='elements#{page}'
    )

Ahora paginator.markup devolverá un objeto json para el campo reply_markup del método API sendMessage Telegram Bot. En este caso, se formarán cinco botones. Si el número de páginas es cinco o menos, entonces los botones corresponderán. Si solo hay una página, el marcado estará en blanco. Si hay más de cinco páginas, el teclado contendrá 5 botones para:


  • primera página;
  • pagina anterior;
  • página actual;
  • siguiente página;
  • última página.

Por ejemplo, si hay una serie de páginas de caracteres que contienen descripciones de los personajes de Harry Potter para crear un bot que muestre una lista de caracteres, necesitamos una función que envíe la página de la lista actual:


def send_character_page(message, page=1):
    paginator = InlineKeyboardPaginator(
        len(character_pages),
        current_page=page,
        data_pattern='character#{page}'
    )

    bot.send_message(
        message.chat.id,
        character_pages[page-1],
        reply_markup=paginator.markup,
        parse_mode='Markdown'
    )

Y el controlador de botones en el bot:



@bot.callback_query_handler(func=lambda call: call.data.split('#')[0]=='character')
def characters_page_callback(call):
    page = int(call.data.split('#')[1])
    bot.delete_message(
        call.message.chat.id,
        call.message.message_id
    )
    send_character_page(call.message, page)

* El ejemplo usa pyTelegramBotAPI para trabajar con el bot.


El código completo para el ejemplo se puede encontrar aquí .


El resultado, dependiendo del número de entradas en la lista, se verá así:





Gracias por la atención. Estaré contento con cualquier crítica constructiva.


All Articles