CodeGym/Blog Java/Random-PL/Tworzenie Telegram Bota w Javie: od koncepcji do wdrożeni...
Autor
Edward Izraitel
Software Engineer at Champions Oncology

Tworzenie Telegram Bota w Javie: od koncepcji do wdrożenia

Opublikowano w grupie Random-PL
Czym więc są boty? Możesz przeczytać więcej na ten temat tutaj . Aby rozpocząć, musisz przejrzeć oficjalną dokumentację biblioteki używanej do tworzenia botów Telegram (dalej „API”). Można go znaleźć tutaj .
Tworzenie Telegram Bota w Javie: od koncepcji do wdrożenia - 1
Wszystko jest tam bardzo przystępne i przejrzyste. Wygląda na to, że możemy po prostu napisać kod i cieszyć się! Ale to nie takie proste. Po spędzeniu mnóstwa czasu na szukaniu, znalazłem strzępki wiedzy na temat tworzenia botów, na przykład, jak zrobić klawiaturę, obsługiwaćCallbackQuery, i tak dalej. Ale nie znalazłem kompletnego, wyczerpującego przewodnika dotyczącego tworzenia botów Java. To skłoniło mnie do napisania tego artykułu. Istnieje wiele stron internetowych, na których można stworzyć własnego, łatwego do wdrożenia bota. Ale faktem jest, że większość tworzonych botów dostarcza informacji referencyjnych i tym podobnych. Nasz bot to pełnoprawna aplikacja internetowa. Możesz powiązać bazę danych, wykonywać różne żądania API, analizować strony internetowe, wykonywać złożone obliczenia i nie tylko. Możliwości są ograniczone tylko przez twoją wyobraźnię. Mam nadzieję, że powyższe pomogło wyjaśnić, o czym będę pisać. Zarejestrowanie bota w Telegramie jest bardzo łatwe. Proces ten jest szczegółowo opisany w dokumentacji, do której link znajduje się powyżej. W przypadku naszej aplikacji wystarczy znać nazwę bota i token, który otrzymasz podczas rejestracji bota. Zasadniczo, bot to po prostu aplikacja internetowa oparta na konsoli. Nie ma interfejsu, tylko czyste przetwarzanie poleceń. Jeśli chcesz opanowaćHibernuj lub naucz się parsować JSON , to jest projekt dla Ciebie. Zacznijmy od dodania zależności do pom.xml(zakładam, że używasz Mavena). Możesz to zrobić tak:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Następnie utwórz Botklasę, która dziedziczy TelegramLongPollingBotklasę i zastąp jej metody:
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";
    }
}
A teraz zawartość metody main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Po wypełnieniu metod getBotUsername()i getBotToken()uruchom bota. Na razie po prostu przekierowuje do nas wszelkie wiadomości, które do niego wysyłamy, coś w rodzaju „ lustrzanego ”. Działa to tak: gdy uruchamiasz aplikację, zaczyna wysyłać żądania do serwera Telegram co n sekund pod następującym adresem URL: https://api.telegram.org/BotToken/getMe , gdzie BotToken to token twojego bota . W odpowiedzi otrzymuje JSON zawierający wszystkie wiadomości. Każdy z tych komunikatów jest przetwarzany przez bibliotekę i przekazywany do OnUpdateReceived(Update update)metody jako plikUpdateobiekt. I właśnie z tym pracujemy. Na tym polega piękno botów Telegrama: mogą działać na dowolnym komputerze, testowanie wymaga jedynie uruchomienia aplikacji i nie trzeba wdrażać go na hoście po każdej zmianie. Jest to bardzo wygodne. Oczywiście możesz skonfigurować bota do pracy z wykorzystaniem webhooków. Wskazówki na ten temat można znaleźć w Internecie. Dla uproszczenia użyjemy LongPolling. Sposób przetwarzania wiadomości i to, co wysyłasz w odpowiedzi, jest ograniczone jedynie możliwościami języka i biblioteki. Wszystko inne zależy od Ciebie. Możesz stworzyć bota, który będzie przeszukiwał dla Ciebie filmy z YouTube. Możesz zrobić bota, który będzie wysyłał Ci to, co sam wysyłasz codziennie, jak kapsułę czasu sprzed roku. Możesz też nauczyć się integrować z systemami CRM i tworzyć boty dla małych firm — ogranicza Cię tylko wyobraźnia. Iść dalej. Ci, którzy korzystali z botów, wiedzą, że wygodnie jest wchodzić z nimi w interakcję za pomocą poleceń rozpoczynających się od znaku „ /”, na przykład /start. Ale jest wygodniejszy sposób: przyciski. Istnieją dwa rodzaje przycisków: te, które pojawiają się pod polem wprowadzania ( ReplyKeyboardMarkup) oraz przyciski, które znajdują się bezpośrednio pod wiadomością, z którą są powiązane (InlineKeyboardMarkup). Możesz uzyskać podstawowe informacje na ich temat z ich opisów w dokumentacji.

OdpowiedzKlawiaturaMarkup

W rzeczywistości jest to tablica tablic przycisków: List<KeyboardRow <KeyboardButton>>. Oto przykładowy kod tworzący klawiaturę:
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);
    }
Metodę tę nazywamy w sendMsg()metodzie, po przekazaniu jej komunikatu. W ten sposób ustawiliśmy klawiaturę dla tej wiadomości. Gdy wyślemy tę wiadomość do użytkownika, zobaczy on treść naszej wiadomości i 2 przyciski z napisami „Cześć” i „Pomoc” , jeden pod drugim. Po kliknięciu jednego z tych przycisków bot otrzymuje wiadomość zawierającą tekst przycisku. Tak więc, jeśli klient kliknie „Pomoc” , bot otrzyma wiadomość z „Pomoc”. Botowi będzie się wydawać, że sam klient napisał „Pomoc” i wysłał tekst do bota. Następnie przetwarzasz wiadomości.

InlineKeyboardMarkup

Jest to również tablica tablic. Jest podobny do poprzedniego znacznika, ale tutaj logika działa trochę inaczej. Ten typ klawiatury jest dołączony do konkretnej wiadomości i istnieje tylko dla niej. Oto metoda konfigurowania wbudowanej klawiatury:
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);
    }
Utwórz w Listobrębie Listi dodaj przycisk wbudowany do pierwszego wiersza. Ten przycisk może zawierać adres URL, link do kanału lub CallbackQuery, o czym napiszę nieco później. Tutaj ustawiamy tekst naszego przycisku, czyli to, co zobaczy użytkownik, a następnie ustawiamy dane, które zostaną przesłane do bota. W naszym przykładzie użytkownik widzi „Cześć”, a po naciśnięciu przycisku liczba 17 zostanie wysłana do bota. to jest nasze CallbackQuery. Kilka słów dot CallbackQuery. Aby uzyskać te dane z Updateobiektu, musisz wykonać update.getCallbackQuery(). Ta metoda zwraca CallbackQuery, z którego można uzyskać dostęp do danych przekazywanych do bota. Nie próbuj uzyskać tych danych za pomocą update.getMessage().getText()metody — otrzymasz plik 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());
        }
    }
Jeśli jest wiadomość, wysyłamy ją do nowego wątku w celu przetworzenia; jeśli istnieje CallbackQuery, wysyłamy do odpowiedniego wątku do przetworzenia. Możesz wysłać odpowiedź do CallbackQuery. Każdy obiekt w Telegramie ma swój własny identyfikator. Aby wysłać odpowiedź do konkretnego CallbackQuery, wystarczy znać jego id, które otrzymujemy z odpowiedniego obiektu. Aby wysłać odpowiedź, wywołujemy tę 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();
        }
    }
WAŻNY:Tekst w odpowiedzi na a CallbackQuerynie może być dłuższy niż 200 znaków! Po wysłaniu takiej odpowiedzi klient zobaczy wyskakujące okienko zawierające treść wiadomości. To okno może zniknąć kilka sekund po jego wyświetleniu lub może pozostać, dopóki użytkownik nie naciśnie OK. Aby przełączyć tryby, wywołujemy answer.setShowAlert(true)metodę. Jeśli przejdziesz truedo metody, okno pozostanie, dopóki nie zostanie naciśnięty przycisk OK. Jeśli zdasz fałsz, zniknie po 5 sekundach. To są wszystkie podstawowe funkcje biblioteki Telegram Bot . Jeśli chcesz, możesz nauczyć się takich rzeczy, jak przesyłanie multimediów, geolokalizacja itp. Przejdźmy do wdrożenia naszego bota na platformę hostingową. Do mojego projektu wybrałem Heroku. Myślę, że jest to dość wygodna platforma hostingowa z własnym CLI. To nic nie kosztuje, ale w tym planie twój bot przejdzie w stan hibernacji po 30 minutach od otrzymania żadnych żądań. Obudzi się po otrzymaniu żądania. Dzieje się to tak szybko, że nawet tego nie zauważysz (o ile oczywiście połączenie z bazą danych nie zostanie ponownie uruchomione). Bezpłatny plan jest ograniczony przez 5 MB bazy danych, 100 MB miejsca na dysku, 2 TB danych miesięcznie i 1 hamownię. Dyna to Twoja działająca aplikacja. Od razu powiem, że to wdrożenie sprawiało mi trudności, ponieważ nigdy wcześniej nie wdrażałem swoich aplikacji. Podczas wdrażania Heroku wymaga pliku o nazwie Procfile (bez rozszerzenia). Tworzymy go w katalogu głównym projektu. Wewnątrz piszemy worker: sh target/bin/workerBot, gdzie workerBot to nazwa określona w pom.xml. Sz _skrypt, wygenerowany przez Maven Application Assembler Plugin (appassembler-maven-plugin), zostanie uruchomiony. Skrypt opisuje, jak uruchomić skompilowany plik jar. Nazwa uruchamianej klasy jest podawana pomiędzy <mainClass>i </mainClass>, natomiast nazwa skryptu jest podawana pomiędzy <name>i </name>w 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>
Przed rozpoczęciem tego procesu powinieneś zarejestrować się na Heroku i zainstalować zarówno Git , jak i Heroku CLI . Jeśli Twoja aplikacja wymaga bazy danych, nie zapomnij dodać wymaganej bazy danych podczas tworzenia nowej aplikacji. Ponadto musisz określić hosta, nazwę użytkownika, hasło i port dla swojej bazy danych, a następnie wskazać je w swojej aplikacji. Następnie, przed wdrożeniem, zbuduj swój projekt za pomocą Maven .
mvn clean install
Najpierw przechodzimy do naszego katalogu projektu i inicjalizujemy repozytorium poleceniem git init. Następnie dodajemy nasz projekt do tego repozytorium.
git add .
Następnie zatwierdzamy zmiany
git commit -m "First commit in the project"
Następnie musisz zalogować się do heroku. Napisz następujące polecenie w wierszu poleceń
heroku login
Wprowadź poświadczenia utworzone podczas rejestracji. Następnie określ adres URL swojego repozytorium na heroku. Robisz to w ustawieniach. Potem piszemy
git remote add heroku [url]
Zdalne repozytorium heroku zostało dodane do twojego repozytorium. Dalej piszemy
git push heroku master
Następnie czekamy… jeśli aplikacja zostanie pomyślnie wdrożona, wykonaj następujące polecenie
heroku ps:scale worker=1
I to wszystko, Twoja aplikacja jest uruchomiona. Jeśli nie, przejrzyj uważnie logi. Najprawdopodobniej błąd w Twojej aplikacji spowodował jej awarię. Dziękuję za przeczytanie tak długiego artykułu. Mam nadzieję, że komuś się to przyda i zaoszczędzi dużo czasu w obszarach, które sprawiały mi problemy podczas tworzenia.
Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy