Bot de paginação de telegrama em Python

Recentemente, enfrentei a tarefa de paginar uma lista de elementos em um bot de telegrama. E ficou surpresa ao descobrir que, para uma tarefa aparentemente típica, o PyPi não possui uma única biblioteca. Portanto, foi decidido corrigir essa omissão irritante e publicar sua implementação.


Você pode instalar o pacote do PyPi executando no console:


pip install python-telegram-bot-pagination

A classe InlineKeyboardPaginator do pacote telegram_bot_pagination facilita a obtenção de um conjunto de botões em linha para navegar pelas páginas da lista. É necessário transferir para o construtor o número de páginas nas quais a lista de elementos está dividida, bem como a página e o padrão atuais para gerar dados retornados pressionando o botão bot. Depois disso, o próprio paginador formará o teclado necessário, que estará disponível através da propriedade markup.


from telegram_bot_pagination import InlineKeyboardPaginator

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

Agora paginator.markup retornará um objeto json para o campo reply_markup do método da API sendMessage Telegram Bot API. Nesse caso, cinco botões serão formados. Se o número de páginas for cinco ou menos, os botões serão correspondentes. Se houver apenas uma página, a marcação ficará em branco. Se houver mais de cinco páginas, o teclado conterá 5 botões para:


  • primeira página;
  • página anterior;
  • pagina atual;
  • próxima página;
  • última página.

Por exemplo, se houver uma série de páginas de caracteres contendo descrições de caracteres de Harry Potter para criar um bot que exibe uma lista de caracteres, precisamos de uma função que envie a página de lista atual:


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'
    )

E o manipulador de botão no 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)

* O exemplo usa pyTelegramBotAPI para trabalhar com o bot.


O código completo do exemplo pode ser encontrado aqui .


O resultado, dependendo do número de entradas na lista, terá a seguinte aparência:





Obrigado pela atenção. Ficarei feliz com qualquer crítica construtiva.


All Articles