TelegramBot-Anweisungen zum Erstellen grundlegender Funktionen für den Bot. (Teil 1)

Vor nicht allzu langer Zeit habe ich vorgeschlagen, meinen Telegramm-Bot zu verwenden.

Telegrammbot - Veranstaltungsplanungsassistent

Nachdem ich in PM viele Fragen erhalten hatte, wurde mir klar, dass die Frage der Erstellung von Bots für Telegramm sehr beliebt ist.

Sie fragten mich nach dem Quellcode des Bots, fragten mich nach konkreten Beispielen für die Implementierung verschiedener Bot-Funktionen und baten mich, eine Art von Funktionalität für die Arbeit mit dem Bot und den Nachrichten vorzuschlagen.

Ich habe mich dazu entschlossen, eine Reihe von Artikeln zu schreiben, in denen ich die grundlegenden Dinge zeigen möchte, die Sie benötigen, um Ihren Bot zu schreiben.
Java, Maven, TelegramAPI, Lombok und Log4j erwarten Sie.
Wen kümmert es - bitte unter der Katze ...

Und ich gehe direkt von der Trumpfkarte aus :)

Was wurde im vorherigen Artikel angefordert.

Die Quellcodes für das Projekt finden Sie hier .

In der " master " -Verzweigung gibt es die endgültige Version des Bots, die wir zusammen mit Ihnen schreiben, um neue Artikel zu erstellen.

Die vollständige Quelle für diesen Artikel befindet sich im Zweig " Part1-Base ".

In diesem Teil erstellen wir mit Ihnen eine grundlegende Vorlage, die Folgendes ermöglicht:

  1. Registrieren Sie den Bot auf den Telegrammservern
  2. Erhalte Nachrichten, die an den Bot geschrieben wurden
  3. antworten Sie auf den Befehl / start

Erstellen Sie ein Standard-Maven-Projekt


( Ich werde die Handbücher zur Arbeit mit der Entwicklungsumgebung und den grundlegenden Dingen der Java-Programmierung vermissen. All diese Dinge sind recht einfach zu googeln. Und wenn es nicht klappt, schreibe Fragen ).

Mal sehen, welche Abhängigkeiten wir in diesem Projekt benötigen.

Zuallererst ist dies Lombok . Was ist das und warum - lesen Sie zum Beispiel hier .

Und achten Sie darauf, einen Logger hinzuzufügen. Ich benutze log4j und werde Ihnen ein wenig später zeigen, wie nützlich es beim Debuggen dieser Anwendung ist und wie Sie die Funktionsweise von TelegramAPI besser verstehen.

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 

Und weil Wir schreiben einen Bot für Telegram, dann die Bibliothek selbst aus Telegram:

 <dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>3.5</version> </dependency> 

Die Struktur der POM-Datei finden Sie hier.
Die Struktur der Datei pom.xml ist hier zu sehen.

Als nächstes fügen wir die Basisklasse Bot.java hinzu , die alle unsere Interaktionen mit Telegrammdiensten implementiert. Wir werden mit LongPolling, as arbeiten Diese Methode erfordert keine Verschlüsselungszertifikate und kann von jedem Computer mit Java an Bord gestartet werden.

Dazu erben wir von der TelegramLongPollingBot- Klasse und implementieren die grundlegenden Methoden:

public void onUpdateReceived (Update Update)
public String getBotUsername ()
public String getBotToken ()

Und von uns aus müssen wir eine Prozedur hinzufügen, die unseren Bot mit TelegramAPI verbindet:

public void botConnect ()

 import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.apache.log4j.Logger; import org.telegram.telegrambots.TelegramBotsApi; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; @AllArgsConstructor @NoArgsConstructor public class Bot extends TelegramLongPollingBot { private static final Logger log = Logger.getLogger(Bot.class); final int RECONNECT_PAUSE =10000; @Setter @Getter String userName; @Setter @Getter String token; @Override public void onUpdateReceived(Update update) { // TODO: 11/18/2019     log.debug("new Update recieve"); } @Override public String getBotUsername() { return userName; } @Override public String getBotToken() { return token; } public void botConnect() { TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); try { telegramBotsApi.registerBot(this); log.info("TelegramAPI started. Look for messages"); } catch (TelegramApiRequestException e) { log.error("Cant Connect. Pause " + RECONNECT_PAUSE / 1000 + "sec and try again. Error: " + e.getMessage()); try { Thread.sleep(RECONNECT_PAUSE); } catch (InterruptedException e1) { e1.printStackTrace(); return; } botConnect(); } } } 

Im Prinzip alles. Dieser Code kann eine Verbindung zu Telegrammservern herstellen und zeichnet nach Empfang der an ihn adressierten Nachrichten Informationen in der Protokolldatei auf, die das Update erhalten hat.

Lassen Sie uns eine Klasse erstellen, die unsere Anwendung ausführt.

Dies wird von der Klasse App.java erledigt. Link zur Datei: hier

 package com.example.telegrambot; import com.example.telegrambot.bot.Bot; import org.apache.log4j.Logger; import org.telegram.telegrambots.ApiContextInitializer; public class App { private static final Logger log = Logger.getLogger(App.class); public static void main(String[] args) { ApiContextInitializer.init(); Bot test_habr_bot = new Bot("test_habr_bot", "1012522162:AAHLvPVqKF48LdqnsvS3l5YrJfvFey6dBa0"); test_habr_bot.botConnect(); } } 

Wie Sie sehen, benötigen wir für den Bot nur den „Bot-Namen“ und den „Token“, die wir im Konstruktor unserer Bot-Klasse übergeben.

Sie können den Namen und den Token für den Bot vom Vater aller Bots erhalten :), indem Sie ihm in einem Telegramm schreiben.
Sein Spitzname: @BotFather
Die Kommunikation mit ihm ist sehr einfach und prägnant.

Auf Befehl
/ newbot

Als Ergebnis sollten Sie diesen Dialog erhalten:



Sie schreiben hier auch, dass dies genauer ist. Zeigen Sie diese Informationen niemandem, da sonst jemand anderes in der Lage ist, Ihren Bot zu steuern. :)

Sie werden sagen, dass ich nicht sehr genau bin ... Vielleicht, aber der Vater von Bots ermöglicht es uns, Token zu ändern und solche zu widerrufen, die öffentlich zugänglich sind. Wenn Sie versuchen, eine Verbindung mit meinen Daten herzustellen, wird die folgende Meldung angezeigt:

 2019-12-04 13:44:25,252[DEBUG][main ][ com.example.telegrambot.bot.Bot] - Bot token: 1012522162:AAF5D49N4NreEJfCk0aOsC-UnmIu_GLkoyc 2019-12-04 13:44:26,613[ERROR][main ][ com.example.telegrambot.bot.Bot] - Cant Connect. Pause 10sec and try again. Error: Error removing old webhook 

Mit meinen Daten können Sie also keine Verbindung herstellen. Registrieren Sie Ihre. Geben Sie neue Daten in der Klasse App.java an

Jetzt, indem wir die Hauptmethode in der App-Klasse ausführen, lassen wir unseren Bot eine Verbindung herstellen und warten auf neue Nachrichten. Er wird uns über seine Aktionen und Versuche in der Konsole schreiben.

Log4j


Denken Sie daran, dass ich oben über das Hilfsprogramm der log4j-Bibliothek gesprochen habe. Und hier öffnet sich für die Neugierigen ein Klondike mit nützlichen Daten.

Die Datei log4j.properties enthält bereits grundlegende Einstellungen für die Protokollierung und bestimmte Protokollierungsstufen für Klassen von Drittanbietern und für diejenigen, die in unserem Bot funktionieren.

 log4j.rootLogger= error, file log4j.logger.com.example.telegrambot.App = debug, stdout log4j.logger.com.example.telegrambot.bot.Bot = debug, stdout 

Die Grundstufe der Protokollierung wird als Fehler angezeigt.

Für Bot- und App-Klassen wird die Protokollausgabe auf Debug-Ebene angezeigt.

Was sind diese Ebenen und wie unterscheiden sie sich - Sie können leicht in Google finden.

Wenn Sie sehen möchten, wie und in welcher Reihenfolge die Telegrammbibliothek alle Ihre Aktionen ausführt, schalten Sie den allgemeinen Protokollierungsmodus auf eine niedrigere Ebene: info oder debug.

Und wenn Sie die Anwendung starten, werden Sie in der Konsole sehen, wie viele interessante Dinge während des Verbindungsaufbaus und der Arbeit passieren. Wie oft werden Ihre Funktionen mit dem Bot-Namen und dem Token abgefragt.

Die Protokollierungsstufen ändern sich mit dieser Zeile:
Um die Protokolle entsprechend der Info-Ebene abzurufen, geben Sie Folgendes ein:

 log4j.rootLogger= info, file 

Für die Debug-Ebene wie folgt:

 log4j.rootLogger= debug, file 

Und zum Schluss


Jetzt haben wir einen Bot: Er verbindet, zeigt uns schöne Protokolle und meldet, dass Nachrichten auf ihn zukommen.

Aber oben habe ich dir versprochen, dass der Bot auf den Startbefehl reagiert. Lassen Sie uns die Prozedur, die für die Verarbeitung empfangener Nachrichten verantwortlich ist, ein wenig ändern.

 @Override public void onUpdateReceived(Update update) { log.debug("Receive new Update. updateID: " + update.getUpdateId()); Long chatId = update.getMessage().getChatId(); String inputText = update.getMessage().getText(); if (inputText.startsWith("/start")) { SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Hello. This is start message"); try { execute(message); } catch (TelegramApiException e) { e.printStackTrace(); } } } 

Wie Sie dem Code entnehmen können, macht der Bot Folgendes:

  • Es erhält ein Update und trägt seine ID-Nummer in das Protokoll ein.
  • Ruft die Chat-ID und den Text der Nachricht aus der übertragenen Nachricht ab
  • Überprüft, ob dieser Text ein "/ start" -Befehl ist
  • Bei einem erfolgreichen Vergleich wird eine Antwortnachricht erstellt und mit der zuvor erhaltenen ID an den Chat gesendet

Ich hoffe, Sie finden es nützlich und interessant.

In Zukunft werde ich Ihnen zeigen, wie es in meinen Bots implementiert ist:

  • Einsatz verschiedener Teams
  • Binden dieser Befehle an Handler
  • Multithreading: Unabhängiges Empfangen und Senden von Nachrichten
  • Nachrichtenformatierung
  • arbeite mit tasten und callbacks
  • Bearbeiten alter Beiträge

Auf dieser Basis arbeiten jetzt 2 meiner Bots für mich in der Öffentlichkeit.

Eine Sache, die Sie kennen, ist ein Veranstaltungsplanungsassistent .

Und der zweite - Cheeky Movie Fan . Er liebt Filme und weiß viel über sie. Und noch mehr teilt er gerne sein Wissen mit Ihnen. Er leitet seinen Kanal in einem Telegramm , in dem er entscheidet, welche Filme er mag und Ihnen anbietet. Er weiß, wie man individuelle Auswahlen nach Genres erstellt und ein Abonnement für personalisierte Empfehlungen erstellt. Er weiß, wie man solche Meisterwerke findet, von denen man noch nie gehört hat, und er wusste nicht einmal, wie solche Filme überhaupt zu finden sind.

Glauben Sie zum Beispiel, dass es Filme mit einer so „wilden“ Kombination von Genres gibt wie Dokumentarfilm, Horror oder Komödie?

Aber der Bot auf Kommando

      2010- 

Er wird sagen, dass von 2010 bis heute sechs solcher Filme gedreht wurden :)

Wie Sie mit ähnlichen Befehlen arbeiten, wie Sie Zeichenfolgen und Befehlsfolgen analysieren, werden wir in den folgenden Veröffentlichungen mit Ihnen besprechen.

Vielen Dank für Ihre Aufmerksamkeit. Programmieren macht Spaß :)

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


All Articles