CodeGym/Java blog/Tilfældig/Oprettelse af en telegrambot i Java: fra idé til implemen...
John Squirrels
Niveau
San Francisco

Oprettelse af en telegrambot i Java: fra idé til implementering

Udgivet i gruppen
Så hvad er bots? Det kan du læse mere om her . For at starte skal du gennemgå den officielle dokumentation for det bibliotek, der bruges til at udvikle Telegram-bots (herefter "API"). Den kan findes her .
Oprettelse af en telegrambot i Java: fra idé til implementering - 1
Alt der er meget tilgængeligt og overskueligt. Det ser ud til, at vi bare kan skrive kode og glæde os! Men det er ikke så enkelt. Efter at have brugt meget tid på at søge, har jeg fundet godbidder af viden om botudvikling, for eksempel hvordan man laver et tastatur, håndterer enCallbackQuery, og så videre. Men jeg fandt ikke en komplet, udtømmende guide til Java-botudvikling. Det fik mig til at skrive denne artikel. Der er mange websteder, hvor du kan oprette din egen let implementerbare bot. Men faktum er, at de fleste af de oprettede bots giver referenceoplysninger og lignende. Vores bot er en fuldgyldig webapplikation. Du kan binde en database, udføre forskellige API-anmodninger, analysere websteder, udføre komplekse beregninger og mere. Mulighederne er kun begrænset af din fantasi. Jeg håber, at ovenstående har været med til at tydeliggøre, hvad jeg skal skrive om. Det er meget nemt at registrere en bot på Telegram. Denne proces er beskrevet detaljeret i den dokumentation, der er linket til ovenfor. Til vores ansøgning skal du kun kende bottens navn og det token, du modtager, når du registrerer botten. I bund og grund, en bot er blot en konsolbaseret webapplikation. Der er ingen frontend, kun ren kommandobehandling. Hvis du vil mestreGå i dvale eller lær at analysere JSON , så er dette projektet for dig. Lad os starte med at tilføje en afhængighed til pom.xml(jeg antager, at du bruger Maven). Du kan gøre det sådan her:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Opret derefter en Botklasse, der arver TelegramLongPollingBotklassen, og tilsidesæt dens metoder:
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";
    }
}
Og nu indholdet af metoden main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Når du har udfyldt getBotUsername()og getBotToken()metoderne, skal du starte botten. Indtil videre omdirigerer den bare til os alle meddelelser, vi sender til den, ligesom et " spejl ". Det fungerer sådan her: når du starter applikationen, begynder den at sende anmodninger til Telegram-serveren hver n. sekund på følgende URL: https://api.telegram.org/BotToken/getMe , hvor BotToken er din bots token . Som svar modtager den JSON, der indeholder alle meddelelserne. Hver af disse meddelelser behandles af biblioteket og sendes til OnUpdateReceived(Update update)metoden som enUpdateobjekt. Og det er det, vi arbejder med. Heri ligger skønheden ved Telegram-bots: de kan køre på enhver computer, test af det kræver bare at starte applikationen, og du behøver ikke at implementere det til værten efter hver ændring. Dette er meget praktisk. Selvfølgelig kan du konfigurere en bot til at arbejde ved hjælp af webhooks. Du kan finde vejledninger til det på internettet. For nemheds skyld bruger vi LongPolling. Hvordan beskeder behandles, og hvad du sender som svar, er kun begrænset af sprogets og bibliotekets muligheder. Alt andet er op til dig. Du kan lave en bot, der søger efter YouTube-videoer for dig. Du kan lave en bot, der sender dig det, du sender dig selv hver dag, som en tidskapsel fra et år siden. Eller du kan lære at integrere med CRM-systemer og lave bots til små virksomheder – du er kun begrænset af din fantasi. Komme videre. De, der har brugt bots, ved, at det er praktisk at interagere med dem ved hjælp af kommandoer, der starter med tegnet " /", f.eks /start. Men der er en mere bekvem måde: knapper. Der er to slags knapper: dem, der vises under et inputfelt ( ReplyKeyboardMarkup) og knapper, der er direkte under den besked, de er knyttet til (InlineKeyboardMarkup). Du kan få en grundlæggende forståelse af dem fra deres beskrivelser i dokumentationen.

ReplyKeyboardMarkup

I virkeligheden er dette en række knap-arrays: List<KeyboardRow <KeyboardButton>>. Her er et eksempel på kode, der skaber et tastatur:
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);
    }
Vi kalder denne metode i sendMsg()metoden, efter at have sendt den en besked. Sådan konfigurerer vi et tastatur til den besked. Når vi sender denne besked til brugeren, vil han se teksten i vores besked og 2 knapper, der siger "Hej" og "Hjælp" , den ene under den anden. Når der klikkes på en af ​​disse knapper, får botten en besked, der indeholder knapteksten. Så hvis klienten klikker på "Hjælp" , vil botten modtage en besked med "Hjælp". For botten vil det se ud til, at klienten selv skrev "Hjælp" og sendte teksten til botten. Og så behandler du beskederne.

InlineKeyboardMarkup

Dette er også en række arrays. Det ligner den tidligere Markup, men logikken fungerer lidt anderledes her. Denne type tastatur er knyttet til en bestemt besked og eksisterer kun for den. Her er en metode til at konfigurere et indbygget 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);
    }
Opret en Listi List, og tilføj inline-knappen til den første række. Denne knap kan indeholde en URL, et link til en kanal eller en CallbackQuery, som jeg skriver om lidt senere. Det er her, vi indstiller vores knaps tekst, som er, hvad brugeren vil se, og derefter indstiller vi de data, der sendes til botten. I vores eksempel ser brugeren "Hej", og når der trykkes på knappen vil tallet 17 blive sendt til botten. Dette er vores CallbackQuery. Et par ord vedr CallbackQuery. For at få disse data fra objektet Updateskal du udføre update.getCallbackQuery(). Denne metode returnerer en CallbackQuery, hvorfra du kan få adgang til de data, der sendes til botten. Forsøg ikke at få disse data gennem update.getMessage().getText()metoden – du får en 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());
        }
    }
Hvis der er en besked, sender vi den til en ny tråd til behandling; hvis der er en CallbackQuery, sender vi til den relevante tråd til behandling. Du kan sende et svar til en CallbackQuery. Hvert objekt i Telegram har sit eget id. For at sende et svar til en specifik CallbackQuery, skal du blot kende dens id, som vi får fra det tilsvarende objekt. For at sende et svar kalder vi denne metode:
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();
        }
    }
VIGTIG:Teksten i et svar på a CallbackQuerymå ikke være længere end 200 tegn! Efter at have sendt et sådant svar, vil klienten se et pop op-vindue, der indeholder meddelelsen. Dette vindue kan forsvinde et par sekunder efter det vises, eller det kan fortsætte, indtil brugeren trykker på OK. For at skifte tilstand kalder vi answer.setShowAlert(true)metoden. Hvis du går over truetil metoden, fortsætter vinduet, indtil der trykkes på OK. Hvis du passerer falsk, så forsvinder det efter 5 sekunder. Disse er alle Telegram Bot-bibliotekets grundlæggende funktioner. Hvis du vil, kan du lære ting som at sende multimedier, geolocation osv. Lad os gå videre til at implementere vores bot til en hostingplatform. Til mit projekt valgte jeg Heroku. Jeg synes, det er en ret praktisk hostingplatform med sin egen CLI. Det er gratis, men på denne plan vil din bot gå i dvale efter 30 minutter uden at have modtaget nogen anmodninger. Den vågner, når en anmodning modtages. Dette sker så hurtigt, at du ikke engang bemærker det (medmindre, selvfølgelig, databaseforbindelsen ikke genstarter). Den gratis plan er begrænset af en 5 MB database, 100 MB diskplads, 2 TB data om måneden og 1 dyno. En dyno er din kørende applikation. Jeg vil med det samme sige, at det var implementeringen, der voldte mig vanskeligheder, da jeg aldrig havde implementeret mine applikationer før. Under installationen kræver Heroku en fil med navnet Procfile (uden en udvidelse). Vi opretter det i projektroden. Indeni skriver vi worker: sh target/bin/workerBot, hvor workerBot er navnet angivet i pom.xml. En shscript, genereret af Maven Application Assembler Plugin (appassembler-maven-plugin), vil starte. Scriptet beskriver, hvordan man starter en kompileret jar-fil. Navnet på den klasse, der skal startes, er angivet mellem <mainClass>og </mainClass>, mens navnet på scriptet er angivet mellem <name>og </name>i 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>
Før du starter denne proces, bør du registrere dig på Heroku og installere både Git og Heroku CLI . Hvis din applikation har brug for en database, så glem ikke at tilføje den nødvendige database, når du opretter en ny applikation. Yderligere skal du bestemme værten, brugernavnet, adgangskoden og porten til din database og derefter angive dem i din ansøgning. Dernæst, før du implementerer, skal du bygge dit projekt ved hjælp af Maven .
mvn clean install
Først går vi til vores projektmappe og initialiserer depotet med kommandoen git init. Så føjer vi vores projekt til dette lager.
git add .
Så forpligter vi ændringerne
git commit -m "First commit in the project"
Dernæst skal du logge ind på heroku. Skriv følgende på kommandolinjen
heroku login
Indtast de legitimationsoplysninger, du oprettede under registreringen. Derefter skal du bestemme dit depots URL på heroku. Det gør du i indstillingerne. Så skriver vi
git remote add heroku [url]
Et fjerntliggende heroku-lager er tilføjet til dit lager. Dernæst skriver vi
git push heroku master
Så venter vi ... hvis applikationen implementeres med succes, skal du udføre følgende kommando
heroku ps:scale worker=1
Og det er det, din applikation er oppe og køre. Hvis det ikke er det, så se omhyggeligt på loggene. Det er højst sandsynligt, at en fejl i din applikation har fået den til at mislykkes. Tak fordi du læste en så lang artikel. Jeg håber, nogen vil finde det nyttigt, og at det vil spare dig for en masse tid på de områder, der gav mig problemer under udviklingen.
Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu