Wir entwickeln einen Telegramm-Bot zum Verfolgen von Filmen auf NodeJS und TypeScript



Es ist Ihnen passiert, dass Sie vor Beginn des Films ins Kino kommen und Trailer anschauen, während einige von ihnen ziemlich stark an Ihnen festhalten und Sie sich das Versprechen geben, diesen Film zu sehen, wenn er nicht im Kino ist, dann zumindest später, wenn er zum Download zur Verfügung steht ? Ich wage es vorzuschlagen, dass ja. Aber oft endet es damit, dass Sie es erfolgreich vergessen und diesen Film im besten Fall versehentlich finden, indem Sie durch die Liste der bereits veröffentlichten Filme scrollen.

Ich bin oft auf ein solches Problem gestoßen und habe beschlossen, es mit Eve - Telegram-bot zu erstellen, was mir hilft, die Veröffentlichungen meiner Lieblingsfilme nicht zu vergessen. Was ist es, wie es funktioniert und wie es entwickelt wurde, können Sie unter dem Schnitt lesen!



Vorwort


Dieser Artikel ist keine detaillierte Anleitung zum Erstellen von Telegramm-Bots. Und obwohl ich im Verlauf des Artikels häufig auf mein Projekt verweise, ist der Zweck dieses Materials eine Geschichte über die Entwicklung im Allgemeinen, nämlich die Auswahl der Technologien, Schlüsselpunkte und Fallstricke, auf die ich gestoßen bin.

Warum?


Wie ich oben schrieb, vergesse ich oft, mir die Filme anzuschauen, deren Trailer mir gefallen hat. Ich habe lange über eine Lösung für dieses Problem nachgedacht. Das erste, was mir einfiel, war die Erstellung einer nativen Anwendung für Smartphones, aber seitdem Ich habe dies noch nie zuvor getan, es würde viel Zeit in Anspruch nehmen und nicht die Tatsache, dass das Endergebnis meine Bedürfnisse sowie die Bedürfnisse potenzieller Benutzer befriedigen würde.

Die nächste Idee war, eine PWA zu erstellen. Es ist eine interessante Option, um sich mit der Technologie vertraut zu machen, aber ich habe beschlossen, sie für die Zukunft zu belassen. Gleichzeitig benutze ich Telegramm schon lange und habe während dieser ganzen Zeit genug Bots gesammelt, die mir das Leben in regelmäßigen Abständen ein wenig erleichtern. Nachdem ich alle Vor- und Nachteile abgewogen hatte, entschied ich, dass diese Plattform perfekt für diese Idee ist.

Technologieauswahl


Wenn Sie Github nach Telegramm-Bots durchsuchen, können Sie sehen, dass die meisten davon in Python geschrieben sind. Python ist wirklich eine großartige Sprache und großartig für diese Idee, aber ich wollte dieses Projekt speziell auf NodeJS + TypeScript implementieren. Bei Anwendung der entsprechenden Filter stieß ich auf zwei recht beliebte Tools: Node-Telegramm-Bot-API und Telegraf.js .

Vor dieser Erfahrung in der Entwicklung von Bots hatte ich keine, daher war bei der Auswahl dieser beiden nicht klar, welche Parameter betrachtet werden sollten. Nachdem ich mir die Dokumentation angesehen und die Probleme für jede der Bibliotheken durchgesehen hatte, entschied ich mich für Telegraf.js. Ausschlaggebend war die Verfügbarkeit von Middleware, die auf die gleiche Weise wie im beliebten Express.js-Framework gestaltet ist. Telegraf.js hat auch einen häufigeren Update-Verlauf und eine gut strukturierte Dokumentation, was darauf hindeutet, dass die Entwickler genügend Anstrengungen unternehmen, um das Tool zu verbessern. Darüber hinaus enthält es Tipps für TypeScript, was definitiv ein Plus für den ausgewählten Stapel ist.

Telegraf.js


Telegraf.js ist die Hauptbibliothek, in der das Projekt geschrieben wurde. Es werden verschiedene interessante Ansätze verwendet, mit denen Sie komplexe Bots erstellen und gleichzeitig die Einfachheit des Codes beibehalten können. Nachfolgend sind die interessantesten Mechanismen aufgeführt:

  • Middleware - Ja, dies sind dieselben Middleware, die in Express.js verfügbar sind. Wenn der Benutzer etwas an den Bot sendet, durchläuft die Nachricht zuerst alle registrierten Middlewares und gelangt anschließend zum Controller. Middlewares können den Kontext ändern und die Ausführung der Anforderung unterbrechen, beispielsweise wenn ein normaler Benutzer versucht, in den Bereich für Administratoren zu gelangen. Telegraf.js bietet sofort einige äußerst nützliche Middlewares, die Sie jedoch auch selbst verwenden können. Middlewares gelten nämlich als Killer-Features von Telegraf.js
  • Sitzungen - Sitzungen, in denen Informationen gespeichert werden können, die nicht an den Controller gebunden sind. Sie können eine Analogie zu globalen Variablen geben, auf die von überall im Bot aus zugegriffen werden kann. Eine sehr praktische Sache, die zum Beispiel zur Lokalisierung verwendet wird. Es ist möglich, Sitzungen in verschiedenen Modi zu speichern - DB, Redis, lokale Dateien usw.
  • Webooks - der Bot kann in zwei Modi arbeiten - Long Polling oder Webhooks . Und obwohl sie gleich schnell arbeiten, ist es besser, die zweite Option in einer Produktionsumgebung zu verwenden. Somit muss der Bot nicht auf den Telegrammserver klopfen, sondern erhält alle Updates selbst.

    Wichtig: Voraussetzung für Webhooks ist die Unterstützung des SSL / TLS-Servers. Stellen Sie außerdem sicher, dass der Port, auf dem Webhook ausgeführt wird, offen und von außen zugänglich ist.
  • Markup - Mit dieser Klasse können Sie dem Bot beibringen, in Markup / Markdown-Markup zu antworten. Dies ist wichtig, wenn Sie beispielsweise ein HTML-Spiel erstellen. In meinem Projekt habe ich es jedoch nur für fett / kursiven Text verwendet.
  • Stage ist ein äußerst interessantes Modul, das mir geholfen hat, meine Nerven und einige Stunden Entwicklungszeit zu bewahren. Hier werde ich näher darauf eingehen.
    Der Bot kann Nachrichten vom Benutzer abhören und je nach Art oder Inhalt der Nachricht an den einen oder anderen Controller umleiten, der seine Funktion ausführt und eine Antwort an den Benutzer sendet. Es sieht so aus:

    bot.hears('hello', async ctx => { await ctx.reply('Hello!'); }); 

    Es funktioniert einfach: Wenn Sie dem Bot Hallo schreiben, antwortet er einfach Hallo! Wenn wir diesen Aspekt der Arbeit kennen, wollen wir uns vorstellen, wie der Bot bei der Suche nach Filmen arbeiten kann:

    1. Der Benutzer schreibt, dass er zur Suche nach Filmen gehen möchte;
    2. Der Benutzer gibt den Namen des Films an.
    3. Der Bot gibt eine Liste von Filmen zurück und fordert den Benutzer auf, den ausgewählten Film in seiner Bibliothek zu speichern.
    4. ...

    Achtung, eine Frage! Wie kann ein Bot unterscheiden, wenn ein Benutzer ihm schreibt, dass er nach einem Film suchen möchte, und wenn er den Namen des Films schreibt, nach dem gesucht werden soll?

    Ja, Sie können jeden gesendeten Text als Namen des Films verwenden, aber wir möchten den Bot mit Blackjack und Nutten zu einer guten Schnittstelle machen.

    Und hier kommen die Szenen (Bühnen) ins Spiel! Am einfachsten lässt sich dies anhand des obigen Beispiels erkennen. Wenn der Benutzer sagt, dass er zur Suche nach Filmen gehen möchte, starten wir die Szene. Innerhalb dieser Szene gibt es separate Texthandler - bot.hears (...). Somit beziehen sich alle nachfolgenden Nachrichten direkt auf die Suche nach Filmen, bis der Benutzer eine Nachricht zum Beenden schreibt und die Szene verlässt. Danach werden die Handler in dieser Szene deaktiviert, bis der Benutzer wieder dorthin zurückkehrt. Als nächstes werde ich beschreiben, wie ich Szenen verwendet habe, um die Ereignisbehandlung so einfach wie möglich zu gestalten.


Projektstruktur


Es besteht der Verdacht, dass sich der Artikel als ziemlich umfangreich herausstellen wird, und deshalb werde ich einige Punkte weglassen, um ihn nicht noch weiter auszudehnen. Damit der Bot beispielsweise funktioniert, müssen Sie zunächst das Telegramm-Bot-API-Token abrufen. Informationen dazu finden Sie in der offiziellen Telegrammdokumentation oder in der Dokumentation zu Telegraf.js.

Die Dateistruktur des Projekts ist wie folgt:

Projektstruktur


Es funktioniert wie folgt:

  • src / controller - das sind genau die szenen, über die es oben geschrieben wurde. In diesem Projekt ist jede Szene eine separate Steuerung, die die entsprechenden Anforderungen verarbeitet.
  • src / locales - Übersetzungen für verschiedene Sprachen. Telegraf.js macht es relativ einfach, dem Bot mithilfe von Middlewares eine Lokalisierung hinzuzufügen.
  • src / models - Modelle für MongoDB.
  • src / types - Tipps für TypeScript. Leider haben nicht alle im Projekt verwendeten Bibliotheken Standardzeiten.
  • src / util - verschiedene Hilfsfunktionen , die in verschiedenen Teilen des Projekts verwendet werden. Hier können Sie sehen, wie die Verfügbarkeit des Films zum Herunterladen, zur Sitzungsverwaltung, zum Erstellen von Tastaturen, zur Fehlerbehandlung und für vieles mehr funktioniert.
  • src / bot.ts - die Hauptdatei, in der die gesamte Vorbereitung und der Start des Bots durchgeführt werden.
  • src / telegram.ts - In diesem Fall erstellen wir ein Objekt der Telegram-Klasse aus der Telegraf.js-Bibliothek. Mit diesem Objekt können wir zuerst Nachrichten mit ihrer ID an Benutzer senden und nicht warten, bis sie etwas schreiben. In diesem Projekt senden wir dem Benutzer beispielsweise eine Nachricht, dass der Film, den er verfolgt hat, bereits heruntergeladen werden kann. Natürlich bietet dieses Objekt viel mehr Funktionen.
  • Alles andere sind Konfigurationen für verschiedene Teile des Projekts, die in diesem Artikel nicht behandelt werden.

Initialisierung und Start


Wenn wir die Struktur des Projekts herausgefunden haben, wollen wir sehen, wie der Bot tatsächlich startet. Um den Artikel zu verkürzen, werde ich hier nicht den gesamten Code einfügen, sondern nur über die wichtigsten Momente meiner Meinung nach sprechen. Sie können den vollständigen Code im Repository sehen, dessen Link am Ende des Artikels verfügbar ist.

Alles beginnt mit der Verbindung zur Datenbank, in der Informationen zu Benutzern und den von ihnen verfolgten Filmen gespeichert sind. Nach einer erfolgreichen Verbindung registrieren wir alle im Projekt verwendeten Szenen, legen Parameter für die Lokalisierung fest und fügen mehrere Middlewares hinzu - Verarbeitungssitzungen, Lokalisierung, Einrichten von Szenen sowie einige unserer eigenen. Einer von ihnen empfängt beispielsweise alle Informationen über den Benutzer gemäß seiner ID und fügt sie dem Kontext hinzu, der in den Controllern verwendet wird. Nach all den grundlegenden Vorbereitungen starten wir den Bot entweder im Entwicklungsmodus (Long Polling) oder im Produktionsmodus (Webhooks).

Wichtig: Wenn Sie verschiedene Methoden zum Empfangen von Updates verwenden (Long Polling und Webhooks), löschen Sie beim Starten des Bots im Long Polling-Modus zuerst den abhörenden Webhook mithilfe der GET-Anforderung unter api.telegram.org/botYOUR_TOKEN/deleteWebhook . Andernfalls funktioniert der Bot möglicherweise nicht richtig.

Benutzereingaben verarbeiten


Hurra! Der Bot funktioniert, ist mit der Datenbank verbunden und bereit, Nachrichten von Benutzern zu empfangen. Aber wie macht man es richtig?

Zunächst ist es für Benutzer bequem, die integrierte Telegrammtastatur zu verwenden. Wenn Sie auf die Schaltflächen auf dieser Tastatur klicken, werden Nachrichten mit dem Inhalt dieser Schaltflächen gesendet. Als Nächstes fügen wir einfach Handler für diesen Text hinzu und führen bestimmte Aktionen aus.

Die Datei bot.ts enthält solche Handler. Da der Bot zwei Sprachen unterstützt, können die Schaltflächen auch unterschiedlichen Text enthalten - in Russisch und Englisch. Telegraf-i18n verfügt über eine Übereinstimmungsfunktion, mit der Sie auf dieselbe Schaltfläche in verschiedenen Sprachen klicken können.

Die meisten Handler in bot.ts führen eine einzige Funktion aus - sie starten den Benutzer in die entsprechende Szene. Wir haben also mehrere Abschnitte - Suche nach Filmen, meiner Sammlung, Einstellungen und Kontakten. Jeder Abschnitt hat eine eigene Szene und eine eigene Schaltfläche. Wenn Sie darauf klicken, wechselt der Benutzer zur entsprechenden Szene.

Wichtig: Fügen Sie unbedingt einen Handler hinzu, der den Benutzer von der Szene befreit, da er sonst Gefahr läuft, für immer dort zu bleiben! Es ist auch nützlich, einen allgemeinen Befehl zu erstellen (/ saveme wird im Bot verwendet), der jeder Szene und der Hauptdatei hinzugefügt wird. Dieser Befehl dient zum Beenden einer beliebigen Szene sowie zum Zurücksetzen der Benutzereinstellungen.

Und jetzt möchte der Benutzer zur Suche nach Filmen gehen. Durch Klicken auf die entsprechende Schaltfläche verschieben wir sie in die Suchszene. Der Einfachheit halber verfügt jede Szene über einen eigenen Ordner mit Dateien, von denen jede eine bestimmte Funktion ausführt.

Innerhalb der Szene können Sie Ihre Middlewares verwenden, die sich in der Datei middlewares.ts befinden. Wenn Sie beispielsweise Middleware in der Suchszene verwenden, können Sie einfach alle Informationen zum Film an die entsprechenden Methoden weiterleiten, anstatt jedes Mal dieselbe Funktion in ihnen auszuführen.

Telegramm hat auch eine Inline-Tastatur. Vielleicht sind Sie auf Nachrichten mit Stimmen gestoßen, unter denen sich mehrere durchscheinende Schaltflächen befinden, und wenn Sie auf eine davon klicken, ändert sich die Anzahl der Stimmen. Diese Schaltflächen sind die Inline-Tastatur

So sieht es bei Eva aus


Jede Schaltfläche enthält Informationen. Wenn Sie auf die Schaltfläche klicken, werden diese an den entsprechenden Handler übertragen. Die Größe der übertragenen Informationen sollte 64 Bytes nicht überschreiten! Um dem Bot das Abhören von Tastenklicks beizubringen, müssen wir sie mit bot.action (/ trigger /, callback) registrieren. Der erste Parameter enthält alle Daten, die an die Schaltfläche gebunden wurden. Ich habe mich für Aktionen wie Redux entschieden, bei denen an jede Schaltfläche ein Objekt der Form {a: actionName, p: payload} angehängt ist. Bei der Registrierung von Listenern können wir ein einfaches RegExp verwenden, zum Beispiel: bot.action (/ actionName /, callBack). Alle Handler für die Inline-Tastatur befinden sich in den Dateien action.ts.

Darüber hinaus gibt es in einigen Szenen helpers.ts-Dateien, die kleine Funktionen enthalten, die zum Entladen der verbleibenden Dateien herausgenommen wurden. Zum größten Teil gibt es Tastaturgeneratoren für verschiedene Aktionen des Benutzers.

Lokalisierung


Da dies ein wichtiges Thema ist, halte ich es für gesondert zu erwähnen. Wie ich bereits sagte, enthält Telegraf.js eine ziemlich große Anzahl von Middlewares, von denen eines Telegraf-i18n ist . Das Repository enthält detaillierte Anweisungen und ich hatte keine besonderen Probleme damit, aber ich werde trotzdem ein paar Worte dazu hinzufügen, wie dies in diesem Projekt funktioniert.

Es gibt einen Gebietsschema-Ordner, in dem sich die zu lokalisierenden Dateien befinden, bei denen es sich um ein JSON-Objekt der Form {"key": "translation"} handelt. Wo immer wir verschiedene Sprachen verwenden müssen, verwenden wir die Methode aus dieser Bibliothek, wo wir die benötigte Übersetzung per Schlüssel übertragen und am Ausgang die entsprechende Übersetzung erhalten. In einer Sitzung können Informationen zur vom Benutzer ausgewählten Sprache gespeichert werden. Erwähnenswert auch noch einmal über die Tasten. In derselben Bibliothek befindet sich eine Übereinstimmungsfunktion. Wenn sich der Text auf der Schaltfläche je nach Sprache ändert, können Sie mit dieser Funktion den richtigen Listener aufhängen.

Wichtig: Wenn Sie die Lokalisierung verwenden und einen Bot in TypeScript schreiben möchten, vergessen Sie nicht, den Übersetzungsordner zu tsconfig.json hinzuzufügen, da sonst der Code nicht kompiliert wird. Zum Beispiel:

 "include": ["src/locales/*.json"] 

Fazit


Vielen Dank für das Lesen bis zum Ende! In diesem Artikel habe ich versucht, den Prozess der Erstellung eines Telegramm-Bots als Ganzes so detailliert wie möglich zu beschreiben, ohne eine starke Bindung an mein Projekt zu haben. Ich hoffe, dass Sie nach dem Lesen dieses Artikels und dem Studium des Quellcodes für Eve ganz einfach einen Bot erstellen können, der Ihnen helfen kann.

Wie versprochen können Sie sich den Quellcode auf GitHub ansehen und Eve hier in Aktion ausprobieren. Für Kritik und Verbesserungsvorschläge bin ich sehr dankbar.

Ich möchte auch den Abschnitt in der Dokumentation von Telegraf.js mit interessanten Open-Source-Projekten erwähnen, die Sie sich ansehen und von Architektur und Lösungen inspirieren lassen können. Ich möchte wiederum einen von ihnen erwähnen - The Guard Bot . Ein wirklich großer und gut gemachter Bot, von dem ich einige Lösungen für meine Entwicklung ausgeliehen habe.

Und im Moment habe ich alles gesagt, was ich wollte, ich werde gerne Ihre Fragen, Vorschläge und Kommentare beantworten!

Source: https://habr.com/ru/post/de443876/


All Articles