Python-Telegramm-Paginierungsbot

Vor kurzem stand ich vor der Aufgabe, eine Liste von Elementen in einem Telegrammbot zu paginieren. Und sie war überrascht, dass PyPi für eine solche scheinbar typische Aufgabe keine einzige Bibliothek hat. Daher wurde beschlossen, dieses ärgerliche Versäumnis zu korrigieren und seine Umsetzung zu veröffentlichen.


Sie können das Paket von PyPi installieren, indem Sie es in der Konsole ausführen:


pip install python-telegram-bot-pagination

Die InlineKeyboardPaginator-Klasse aus dem Paket telegram_bot_pagination erleichtert das Abrufen einer Reihe von Inline-Schaltflächen zum Navigieren durch die Listenseiten. Es ist erforderlich, die Anzahl der Seiten, in die die Liste der Elemente unterteilt ist, sowie die aktuelle Seite und das aktuelle Muster zum Generieren von Daten, die durch Drücken der Bot-Taste zurückgegeben werden, an den Designer zu übertragen. Danach bildet der Paginator selbst die erforderliche Tastatur, die über die Markup-Eigenschaft verfügbar ist.


from telegram_bot_pagination import InlineKeyboardPaginator

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

Jetzt gibt paginator.markup ein json-Objekt für das Feld reply_markup der API-Methode sendMessage Telegram Bot zurück. In diesem Fall werden fünf Schaltflächen gebildet. Wenn die Anzahl der Seiten fünf oder weniger beträgt, werden die Schaltflächen entsprechend angezeigt. Wenn nur eine Seite vorhanden ist, ist das Markup leer. Wenn mehr als fünf Seiten vorhanden sind, enthält die Tastatur 5 Tasten für:


  • erste Seite;
  • vorherige Seite;
  • aktuelle Seite;
  • Nächste Seite;
  • letzte Seite.

Wenn beispielsweise ein Array von Charakterseiten mit Beschreibungen von Harry-Potter-Charakteren vorhanden ist, um einen Bot zu erstellen, der eine Liste von Charakteren anzeigt, benötigen wir eine Funktion, die die aktuelle Listenseite sendet:


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

Und der Button-Handler im 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)

* Das Beispiel verwendet pyTelegramBotAPI, um mit dem Bot zu arbeiten.


Den vollständigen Code für das Beispiel finden Sie hier .


Das Ergebnis sieht abhängig von der Anzahl der Einträge in der Liste folgendermaßen aus:





Vielen Dank für Ihre Aufmerksamkeit. Ich werde mich über jede konstruktive Kritik freuen.


All Articles