Bot de pagination de télégramme Python

Récemment, j'ai eu la tâche de paginer une liste d'éléments dans un bot de télégramme. Et elle a été surprise de constater que pour une tâche aussi apparemment typique, PyPi n'a pas une seule bibliothèque. Par conséquent, il a été décidé de corriger cette omission ennuyeuse et de publier sa mise en œuvre.


Vous pouvez installer le package depuis PyPi en exécutant dans la console:


pip install python-telegram-bot-pagination

La classe InlineKeyboardPaginator du package telegram_bot_pagination facilite l'obtention d'un ensemble de boutons en ligne pour naviguer dans les pages de liste. Il est nécessaire de transférer au constructeur le nombre de pages dans lesquelles la liste des éléments est divisée, ainsi que la page actuelle et le modèle pour générer les données retournées en appuyant sur le bouton bot. Après cela, le paginateur lui-même formera le clavier nécessaire, qui sera disponible via la propriété de balisage.


from telegram_bot_pagination import InlineKeyboardPaginator

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

Maintenant, paginator.markup renverra un objet json pour le champ reply_markup de la méthode API sendMessage Telegram Bot. Dans ce cas, cinq boutons seront formés. Si le nombre de pages est de cinq ou moins, alors les boutons seront en conséquence. S'il n'y a qu'une seule page, le balisage sera vide. S'il y a plus de cinq pages, le clavier contiendra 5 boutons pour:


  • première page;
  • page précédente;
  • page actuelle;
  • page suivante;
  • dernière page.

Par exemple, s'il existe un tableau de pages de caractères contenant des descriptions de personnages de Harry Potter pour créer un bot qui affiche une liste de caractères, nous avons besoin d'une fonction qui envoie la page de liste actuelle:


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

Et le gestionnaire de boutons dans le 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)

* L'exemple utilise pyTelegramBotAPI pour travailler avec le bot.


L'exemple de code complet se trouve ici .


Le résultat, selon le nombre d'entrées dans la liste, ressemblera à ceci:





Merci pour l'attention. Je serai heureux de toute critique constructive.


All Articles