Vor nicht allzu langer Zeit habe ich vorgeschlagen, meinen Telegramm-Bot zu verwenden.
Telegrammbot - VeranstaltungsplanungsassistentNachdem 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:
- Registrieren Sie den Bot auf den Telegrammservern
- Erhalte Nachrichten, die an den Bot geschrieben wurden
- 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.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <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) {
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:
@BotFatherDie 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 anJetzt, 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ß :)