CodeGym/Blog Java/Aleatoriu/Crearea unui Telegram Bot în Java: de la concepție până l...
John Squirrels
Nivel
San Francisco

Crearea unui Telegram Bot în Java: de la concepție până la implementare

Publicat în grup
Deci, ce sunt boții? Puteți citi mai multe despre asta aici . Pentru a începe, trebuie să revizuiți documentația oficială pentru biblioteca utilizată pentru a dezvolta roboții Telegram (denumit în continuare „API”). Acesta poate fi găsit aici .
Crearea unui Telegram Bot în Java: de la concepție până la implementare - 1
Totul acolo este foarte accesibil și clar. Se pare că putem doar să scriem cod și să ne bucurăm! Dar nu este atât de simplu. După ce am petrecut mult timp căutând, am găsit cunoștințe despre dezvoltarea unui robot, de exemplu, cum să faci o tastatură, cum să manevrezi unCallbackQuery, si asa mai departe. Dar, nu am găsit un ghid complet și exhaustiv pentru dezvoltarea botului Java. Asta m-a determinat să scriu acest articol. Există o mulțime de site-uri web pe care vă puteți crea propriul bot ușor de implementat. Dar adevărul este că majoritatea boților creați oferă informații de referință și altele asemenea. Botul nostru este o aplicație web cu drepturi depline. Puteți lega o bază de date, puteți executa diverse solicitări API, puteți analiza site-uri web, puteți efectua calcule complexe și multe altele. Posibilitățile sunt limitate doar de imaginația ta. Sper că cele de mai sus au ajutat la clarificarea despre ce voi scrie. Este foarte ușor să înregistrezi un bot pe Telegram. Acest proces este descris în detaliu în documentația legată de mai sus. Pentru aplicația noastră, trebuie să cunoașteți doar numele botului și tokenul pe care îl primiți la înregistrarea botului. Pe scurt, un bot este doar o aplicație web bazată pe consolă. Nu există front-end, doar procesare pură a comenzilor. Dacă vrei să stăpâneștiHibernați sau învățați cum să analizați JSON , atunci acesta este proiectul pentru dvs. Să începem prin a adăuga o dependență la pom.xml(presupun că utilizați Maven). Puteți face asta astfel:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Apoi creați o Botclasă care moștenește TelegramLongPollingBotclasa și suprascrieți metodele acesteia:
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";
    }
}
Și acum conținutul metodei main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
După completarea metodelor getBotUsername()și getBotToken(), porniți botul. Deocamdată, doar redirecționează către noi orice mesaje pe care le trimitem către el, ca o „ oglindă ”. Funcționează astfel: atunci când porniți aplicația, aceasta începe să trimită cereri către serverul Telegram, o dată la n secunde, la următoarea adresă URL: https://api.telegram.org/BotToken/getMe , unde BotToken este token-ul botului dvs. . Ca răspuns, primește JSON care conține toate mesajele. Fiecare dintre aceste mesaje este procesat de bibliotecă și este transmis metodei OnUpdateReceived(Update update)ca unUpdateobiect. Și cu asta lucrăm. Aici constă frumusețea roboților Telegram: aceștia pot rula pe orice computer, testarea necesită doar pornirea aplicației și nu trebuie să o implementați pe gazdă după fiecare modificare. Acest lucru este foarte convenabil. Desigur, puteți configura un bot să funcționeze folosind webhook-uri. Puteți găsi instrucțiuni pentru asta pe Internet. Pentru simplitate, vom folosi LongPolling. Modul în care sunt procesate mesajele și ceea ce trimiteți ca răspuns sunt limitate doar de capacitățile limbii și ale bibliotecii. Orice altceva depinde de tine. Puteți crea un bot care va căuta videoclipuri YouTube pentru dvs. Poți crea un bot care să-ți trimită ceea ce îți trimiți în fiecare zi, ca o capsulă a timpului de acum un an. Sau poți învăța să te integrezi cu sistemele CRM și să faci roboți pentru întreprinderile mici - ești limitat doar de imaginația ta. Trecând peste. Cei care au folosit boți știu că este convenabil să interacționați cu aceștia folosind comenzi care încep cu caracterul " /", de exemplu, /start. Dar există o modalitate mai convenabilă: butoanele. Există două tipuri de butoane: cele care apar sub un câmp de introducere ( ReplyKeyboardMarkup) și butoane care sunt direct sub mesajul la care sunt legate (InlineKeyboardMarkup). Puteți obține o înțelegere de bază a acestora din descrierile lor din documentație.

ReplyKeyboardMarkup

În realitate, aceasta este o matrice de matrice de butoane: List<KeyboardRow <KeyboardButton>>. Iată un exemplu de cod care creează o 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);
    }
Numim această metodă în sendMsg()metodă, după ce i-am transmis un mesaj. Așa am configurat o tastatură pentru acel mesaj. Când trimitem acest mesaj utilizatorului, acesta va vedea textul mesajului nostru și 2 butoane care spun „Salut” și „Ajutor” , unul sub celălalt. Când se face clic pe unul dintre aceste butoane, bot-ului i se trimite un mesaj care conține textul butonului. Deci, dacă clientul face clic pe „Ajutor” , botul va primi un mesaj cu „Ajutor”. Bot-ului i se va părea că clientul însuși a scris „Ajutor” și a trimis textul către bot. Și apoi procesezi mesajele.

InlineKeyboardMarkup

Aceasta este, de asemenea, o serie de matrice. Este similar cu Markup-ul anterior, dar logica funcționează puțin diferit aici. Acest tip de tastatură este atașat unui anumit mesaj și există doar pentru acesta. Iată o metodă pentru configurarea unei tastaturi inline:
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);
    }
Creați un Listîn interiorul List, și adăugați butonul inline la primul rând. Acest buton poate conține o adresă URL, un link către un canal sau un CallbackQuery, despre care voi scrie puțin mai târziu. Aici setăm textul butonului nostru, care este ceea ce va vedea utilizatorul, apoi setăm datele care vor fi trimise către bot. În exemplul nostru, utilizatorul vede „Bună”, iar atunci când butonul este apăsat, numărul 17 va fi trimis către bot. Acesta este al nostru CallbackQuery. Câteva cuvinte referitoare la CallbackQuery. Pentru a obține aceste date de la Updateobiect, trebuie să executați update.getCallbackQuery(). Această metodă returnează un CallbackQuery, din care puteți accesa datele transmise botului. Nu încercați să obțineți aceste date prin update.getMessage().getText()metoda - veți obține un 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());
        }
    }
Dacă există un mesaj, îl trimitem la un fir nou pentru procesare; dacă există un CallbackQuery, trimitem la firul corespunzător pentru procesare. Puteți trimite un răspuns la un CallbackQuery. Fiecare obiect din Telegram are propriul id. Pentru a trimite un răspuns la un anumit CallbackQuery, trebuie doar să știți id-ul acestuia, pe care îl obținem de la obiectul corespunzător. Pentru a trimite un răspuns, numim această metodă:
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();
        }
    }
IMPORTANT:Textul dintr-un răspuns la a CallbackQuerynu trebuie să aibă mai mult de 200 de caractere! După trimiterea unui astfel de răspuns, clientul va vedea o fereastră pop-up care conține mesajul. Această fereastră poate dispărea la câteva secunde după ce apare sau poate persista până când utilizatorul apasă OK. Pentru a comuta între moduri, numim answer.setShowAlert(true)metoda. Dacă treceți truela metodă, fereastra persistă până când se apasă OK. Dacă treci fals, atunci acesta dispare după 5 secunde. Acestea sunt toate caracteristicile de bază ale bibliotecii Telegram Bot . Dacă doriți, puteți afla lucruri precum cum să trimiteți multimedia, geolocalizare etc. Să trecem la implementarea botului nostru pe o platformă de găzduire. Pentru proiectul meu, am ales Heroku. Cred că este o platformă de găzduire destul de convenabilă, cu propriul CLI. Este gratuit, dar pe acest plan botul tău va hiberna după 30 de minute de când nu a primit nicio solicitare. Se va trezi la primirea unei cereri. Acest lucru se întâmplă atât de repede, încât nici nu vei observa (cu excepția cazului în care, desigur, conexiunea la baza de date nu repornește). Planul gratuit este limitat de o bază de date de 5 MB, 100 MB de spațiu pe disc, 2 TB de date pe lună și 1 dyno. Un dyno este aplicația dvs. care rulează. Voi spune imediat că implementarea a fost cea care mi-a cauzat dificultăți, deoarece nu mi-am implementat niciodată aplicațiile înainte. În timpul implementării, Heroku necesită un fișier numit Procfile (fără extensie). Îl creăm în rădăcina proiectului. În interior, scriem worker: sh target/bin/workerBot, unde workerBot este numele specificat în pom.xml. Un shscriptul, generat de pluginul Maven Application Assembler (appassembler-maven-plugin), se va lansa. Scriptul descrie cum se lansează un fișier jar compilat. Numele clasei de lansat este specificat între <mainClass>și </mainClass>, în timp ce numele scriptului este dat între <name>și </name>în 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>
Înainte de a începe acest proces, ar trebui să vă înregistrați pe Heroku și să instalați atât Git , cât și Heroku CLI . Dacă aplicația dvs. are nevoie de o bază de date, atunci nu uitați să adăugați baza de date necesară atunci când creați o nouă aplicație. Mai mult, trebuie să determinați gazda, numele de utilizator, parola și portul pentru baza de date și apoi să le indicați în aplicație. Apoi, înainte de implementare, construiți proiectul folosind Maven .
mvn clean install
Mai întâi, mergem la directorul nostru de proiect și inițializam depozitul cu comanda git init. Apoi adăugăm proiectul nostru la acest depozit.
git add .
Apoi facem schimbările
git commit -m "First commit in the project"
Apoi, trebuie să vă conectați la Heroku. Scrieți următoarele pe linia de comandă
heroku login
Introduceți acreditările pe care le-ați creat în timpul înregistrării. După aceea, determinați adresa URL a depozitului dvs. pe Heroku. Faceți acest lucru în setări. Apoi scriem
git remote add heroku [url]
Un depozit heroku la distanță este adăugat pentru depozitul dvs. În continuare scriem
git push heroku master
Apoi așteptăm... dacă aplicația se implementează cu succes, executați următoarea comandă
heroku ps:scale worker=1
Și asta este tot, aplicația ta este în funcțiune. Dacă nu este, priviți cu atenție jurnalele. Cel mai probabil, o eroare în aplicația dvs. a cauzat eșecul acesteia. Vă mulțumesc că ați citit un articol atât de lung. Sper că cineva îl va găsi util și că vă va economisi mult timp în zonele care mi-au dat probleme în timpul dezvoltării.
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu