CodeGym/Java-Blog/Random-DE/Erstellen eines Telegram-Bots in Java: von der Konzeption...
Autor
Edward Izraitel
Software Engineer at Champions Oncology

Erstellen eines Telegram-Bots in Java: von der Konzeption bis zur Bereitstellung

Veröffentlicht in der Gruppe Random-DE
Was sind Bots? Mehr dazu können Sie hier lesen . Zunächst müssen Sie die offizielle Dokumentation der Bibliothek lesen, die zur Entwicklung von Telegram-Bots verwendet wird (im Folgenden die „API“). Es ist hier zu finden .
Erstellen eines Telegram-Bots in Java: von der Konzeption bis zur Bereitstellung – 1
Alles dort ist sehr zugänglich und klar. Es scheint, wir können einfach Code schreiben und uns freuen! Aber es ist nicht so einfach. Nachdem ich viel Zeit mit der Suche verbracht habe, habe ich kleine Wissensschnipsel über die Bot-Entwicklung gefunden, zum Beispiel, wie man eine Tastatur herstellt, wie man mit einem... umgehtCallbackQuery, und so weiter. Allerdings habe ich keine vollständige und erschöpfende Anleitung für die Java-Bot-Entwicklung gefunden. Das hat mich dazu veranlasst, diesen Artikel zu schreiben. Es gibt viele Websites, auf denen Sie Ihren eigenen, einfach einsetzbaren Bot erstellen können. Tatsache ist jedoch, dass die meisten der erstellten Bots Referenzinformationen und dergleichen bereitstellen. Unser Bot ist eine vollwertige Webanwendung. Sie können eine Datenbank binden, verschiedene API-Anfragen ausführen, Websites analysieren, komplexe Berechnungen durchführen und mehr. Die Möglichkeiten sind nur durch Ihre Vorstellungskraft begrenzt. Ich hoffe, dass das oben Gesagte dazu beigetragen hat, klarzustellen, worüber ich schreiben werde. Es ist sehr einfach, einen Bot bei Telegram zu registrieren. Dieser Vorgang ist in der oben verlinkten Dokumentation ausführlich beschrieben. Für unsere Anwendung müssen Sie lediglich den Namen des Bots und den Token kennen, den Sie bei der Registrierung des Bots erhalten. Grundsätzlich, Ein Bot ist lediglich eine konsolenbasierte Webanwendung. Es gibt kein Frontend, sondern nur reine Befehlsverarbeitung. Wenn du es meistern willstGehen Sie in den Ruhezustand oder lernen Sie, wie man JSON analysiert , dann ist dies das richtige Projekt für Sie. Beginnen wir mit dem Hinzufügen einer Abhängigkeit zu pom.xml(ich gehe davon aus, dass Sie Maven verwenden). Das können Sie so machen:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Erstellen Sie dann eine BotKlasse, die die Klasse erbt TelegramLongPollingBot, und überschreiben Sie ihre Methoden:
public class Bot extends TelegramLongPollingBot {

    /**
     * Method for receiving messages.
     * @param update Contains a message from the user.
     */
    @Override
    public void onUpdateReceived(Update update) {
    String message = update.getMessage().getText();
    sendMsg(update.getMessage().getChatId().toString(), message);
    }

    /**
     * Method for creating a message and sending it.
     * @param chatId chat id
     * @param s The String that you want to send as a message.
     */
    public synchronized void sendMsg(String chatId, String s) {
        SendMessage sendMessage = new SendMessage();
        sendMessage.enableMarkdown(true);
        sendMessage.setChatId(chatId);
        sendMessage.setText(s);
        try {
            sendMessage(sendMessage);
        } catch (TelegramApiException e) {
            log.log(Level.SEVERE, "Exception: ", e.toString());
        }
    }

    /**
     * This method returns the bot's name, which was specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        return "BotName";
    }

    /**
     * This method returns the bot's token for communicating with the Telegram server
     * @return the bot's token
     */
    @Override
    public String getBotToken() {
        return "BotToken";
    }
}
Und nun der Inhalt der mainMethode:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
getBotUsername()Nachdem Sie die Methoden und eingegeben haben getBotToken(), starten Sie den Bot. Im Moment leitet es einfach alle Nachrichten, die wir an es senden, an uns weiter, eine Art „ Spiegel “. Das funktioniert so: Wenn Sie die Anwendung starten, sendet sie alle n Sekunden Anfragen an den Telegram-Server unter der folgenden URL: https://api.telegram.org/BotToken/getMe , wobei BotToken das Token Ihres Bots ist . Als Antwort erhält es JSON mit allen Nachrichten. OnUpdateReceived(Update update)Jede dieser Nachrichten wird von der Bibliothek verarbeitet und als eine an die Methode übergebenUpdateObjekt. Und damit arbeiten wir. Hier liegt das Schöne an Telegram-Bots: Sie können auf jedem Computer ausgeführt werden. Zum Testen reicht es aus, die Anwendung zu starten, und Sie müssen sie nicht nach jeder Änderung auf dem Host bereitstellen. Das ist sehr praktisch. Natürlich können Sie einen Bot so konfigurieren, dass er mit Webhooks funktioniert. Eine Anleitung dazu finden Sie im Internet. Der Einfachheit halber verwenden wir LongPolling. Die Art und Weise, wie Nachrichten verarbeitet werden und was Sie als Antwort senden, wird nur durch die Fähigkeiten der Sprache und der Bibliothek begrenzt. Alles andere liegt bei Ihnen. Sie können einen Bot erstellen, der YouTube-Videos für Sie durchsucht. Sie können einen Bot erstellen, der Ihnen jeden Tag sendet, was Sie sich selbst senden, wie eine Zeitkapsel von vor einem Jahr. Oder Sie können lernen, sich in CRM-Systeme zu integrieren und Bots für kleine Unternehmen zu erstellen – Ihrer Fantasie sind keine Grenzen gesetzt. Weiter geht's. Diejenigen, die Bots verwendet haben, wissen, dass es praktisch ist, mit ihnen über Befehle zu interagieren, die mit dem /Zeichen „ “ beginnen, z. B. /start. Aber es gibt einen bequemeren Weg: Knöpfe. Es gibt zwei Arten von Schaltflächen: Schaltflächen, die unter einem Eingabefeld angezeigt werden ( ReplyKeyboardMarkup) und Schaltflächen, die sich direkt unter der Nachricht befinden, mit der sie verknüpft sind (InlineKeyboardMarkup). Sie können sich anhand der Beschreibungen in der Dokumentation ein grundlegendes Verständnis davon verschaffen.

AntwortenKeyboardMarkup

In Wirklichkeit handelt es sich hierbei um ein Array von Schaltflächen-Arrays: List<KeyboardRow <KeyboardButton>>. Hier ist ein Beispielcode, der eine Tastatur erstellt:
public synchronized void setButtons(SendMessage sendMessage) {
        // Create a keyboard
        ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
        sendMessage.setReplyMarkup(replyKeyboardMarkup);
        replyKeyboardMarkup.setSelective(true);
        replyKeyboardMarkup.setResizeKeyboard(true);
        replyKeyboardMarkup.setOneTimeKeyboard(false);

        // Create a list of keyboard rows
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First keyboard row
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first keyboard row
        keyboardFirstRow.add(new KeyboardButton("Hi"));

        // Second keyboard row
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add the buttons to the second keyboard row
        keyboardSecondRow.add(new KeyboardButton("Help");

        // Add all of the keyboard rows to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and assign this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
Wir rufen diese Methode in der sendMsg()Methode auf, nachdem wir ihr eine Nachricht übergeben haben. So richten wir eine Tastatur für diese Nachricht ein. Wenn wir diese Nachricht an den Benutzer senden, sieht er den Text unserer Nachricht und zwei Schaltflächen mit der Aufschrift „Hallo“ und „Hilfe“ untereinander. Wenn auf eine dieser Schaltflächen geklickt wird, wird dem Bot eine Nachricht mit dem Schaltflächentext gesendet. Wenn der Client also auf „Hilfe“ klickt , erhält der Bot eine Nachricht mit „Hilfe“. Für den Bot sieht es so aus, als hätte der Client selbst „Hilfe“ geschrieben und den Text an den Bot gesendet. Und dann verarbeiten Sie die Nachrichten.

InlineKeyboardMarkup

Dies ist auch ein Array von Arrays. Es ähnelt dem vorherigen Markup, die Logik funktioniert hier jedoch etwas anders. Diese Art von Tastatur ist an eine bestimmte Nachricht gebunden und existiert nur für diese. Hier ist eine Methode zum Einrichten einer Inline-Tastatur:
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
Erstellen Sie eine Listinnerhalb der Listund fügen Sie die Inline-Schaltfläche zur ersten Zeile hinzu. Diese Schaltfläche kann eine URL, einen Link zu einem Kanal oder eine CallbackQuery, worüber ich etwas später schreiben werde, enthalten. Hier legen wir den Text unserer Schaltfläche fest, der dem Benutzer angezeigt wird, und legen dann die Daten fest, die an den Bot gesendet werden. In unserem Beispiel sieht der Benutzer „Hallo“, und wenn die Taste gedrückt wird, wird die Nummer 17 an den Bot gesendet. Das ist unser CallbackQuery. Ein paar Worte dazu CallbackQuery. Um diese Daten vom UpdateObjekt zu erhalten, müssen Sie ausführen update.getCallbackQuery(). Diese Methode gibt eine zurück CallbackQuery, über die Sie auf die an den Bot übergebenen Daten zugreifen können. Versuchen Sie nicht, diese Daten über die Methode abzurufen update.getMessage().getText()– Sie erhalten eine NullPointerException.
@Override
    public void onUpdateReceived(Update update) {
        if(update.hasMessage()) {
            ThreadClass thread = new ThreadClass(update.getMessage());
        } else  if(update.hasCallbackQuery()) {
            AnswerCallbackThread answerThread = new AnswerCallbackThread(update.getCallbackQuery());
        }
    }
Wenn eine Nachricht vorliegt, senden wir sie zur Verarbeitung an einen neuen Thread. Wenn es eine gibt CallbackQuery, senden wir sie zur Verarbeitung an den entsprechenden Thread. Sie können eine Antwort an eine senden CallbackQuery. Jedes Objekt in Telegram hat seine eigene ID. Um eine Antwort an ein bestimmtes Objekt zu senden CallbackQuery, müssen Sie lediglich dessen ID kennen, die wir vom entsprechenden Objekt erhalten. Um eine Antwort zu senden, rufen wir diese Methode auf:
public synchronized void answerCallbackQuery(String callbackId, String message) {
        AnswerCallbackQuery answer = new AnswerCallbackQuery();
        answer.setCallbackQueryId(callbackId);
        answer.setText(message);
        answer.setShowAlert(true);
        try {
            answerCallbackQuery(answer);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
WICHTIG:Der Text in einer Antwort auf eine CallbackQuerydarf nicht länger als 200 Zeichen sein! Nach dem Senden einer solchen Antwort wird dem Client ein Popup-Fenster mit der Nachricht angezeigt. Dieses Fenster kann einige Sekunden nach seinem Erscheinen verschwinden oder bestehen bleiben, bis der Benutzer auf OK drückt. Um den Modus zu wechseln, rufen wir die answer.setShowAlert(true)Methode auf. Wenn Sie truean die Methode übergeben, bleibt das Fenster bestehen, bis OK gedrückt wird. Wenn Sie false übergeben, verschwindet es nach 5 Sekunden. Dies sind alle Grundfunktionen der Telegram Bot-Bibliothek . Wenn Sie möchten, können Sie Dinge wie das Senden von Multimedia, Geolokalisierung usw. lernen. Fahren wir mit der Bereitstellung unseres Bots auf einer Hosting-Plattform fort. Für mein Projekt habe ich Heroku ausgewählt. Ich denke, es ist eine ziemlich praktische Hosting-Plattform mit eigener CLI. Es ist kostenlos, aber bei diesem Plan geht Ihr Bot in den Ruhezustand, wenn er 30 Minuten lang keine Anfragen erhält. Es wird aktiviert, wenn eine Anfrage eingeht. Dies geschieht so schnell, dass Sie es nicht einmal bemerken (es sei denn natürlich, die Datenbankverbindung wird nicht neu gestartet). Der kostenlose Plan ist durch eine 5-MB-Datenbank, 100 MB Speicherplatz, 2 TB Daten pro Monat und 1 Prüfstand begrenzt. Ein Dyno ist Ihre laufende Anwendung. Ich möchte gleich sagen, dass es die Bereitstellung war, die mir Schwierigkeiten bereitete, da ich meine Anwendungen noch nie zuvor bereitgestellt hatte. Während der Bereitstellung benötigt Heroku eine Datei namens Procfile (ohne Erweiterung). Wir erstellen es im Projektstamm. Darin schreiben wir worker: sh target/bin/workerBot, wobei workerBot der in angegebene Name ist pom.xml. Ein SchDas vom Maven Application Assembler Plugin (appassembler-maven-plugin) generierte Skript wird gestartet. Das Skript beschreibt, wie eine kompilierte JAR-Datei gestartet wird. Der Name der zu startenden Klasse wird zwischen <mainClass>und angegeben </mainClass>, während der Name des Skripts zwischen <name>und </name>in angegeben wird pom.xml:
...
<build>
    <plugins>
        ...
       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.1.1</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory>
                <programs>
                    <program>
                        <mainClass>com.home.server.TelegramBot</mainClass>
                        <name>workerBot</name>
                    </program>
                </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Bevor Sie diesen Vorgang starten, sollten Sie sich bei Heroku registrieren und sowohl Git als auch die Heroku-CLI installieren . Wenn Ihre Anwendung eine Datenbank benötigt, vergessen Sie nicht, die erforderliche Datenbank hinzuzufügen, wenn Sie eine neue Anwendung erstellen. Darüber hinaus müssen Sie den Host, den Benutzernamen, das Passwort und den Port für Ihre Datenbank ermitteln und diese dann in Ihrer Anwendung angeben. Erstellen Sie als Nächstes vor der Bereitstellung Ihr Projekt mit Maven .
mvn clean install
Zuerst gehen wir in unser Projektverzeichnis und initialisieren das Repository mit dem Befehl git init. Dann fügen wir unser Projekt zu diesem Repository hinzu.
git add .
Anschließend übernehmen wir die Änderungen
git commit -m "First commit in the project"
Als nächstes müssen Sie sich bei Heroku anmelden. Schreiben Sie Folgendes in die Befehlszeile
heroku login
Geben Sie die Anmeldeinformationen ein, die Sie bei der Registrierung erstellt haben. Bestimmen Sie anschließend die URL Ihres Repositorys auf Heroku. Dies tun Sie in den Einstellungen. Dann schreiben wir
git remote add heroku [url]
Für Ihr Repository wird ein Remote-Heroku-Repository hinzugefügt. Als nächstes schreiben wir
git push heroku master
Dann warten wir … Wenn die Anwendung erfolgreich bereitgestellt wird, führen Sie den folgenden Befehl aus
heroku ps:scale worker=1
Und schon ist Ihre Anwendung betriebsbereit. Ist dies nicht der Fall, schauen Sie sich die Protokolle sorgfältig an. Höchstwahrscheinlich ist Ihre Anwendung aufgrund eines Fehlers fehlgeschlagen. Vielen Dank, dass Sie einen so langen Artikel gelesen haben. Ich hoffe, dass jemand es nützlich findet und dass es Ihnen in den Bereichen, die mir während der Entwicklung Probleme bereitet haben, viel Zeit sparen wird.
Kommentare
  • Beliebt
  • Neu
  • Alt
Du musst angemeldet sein, um einen Kommentar schreiben zu können
Auf dieser Seite gibt es noch keine Kommentare