JavaRush /Blog Java /Random-PL /Dodanie bota telegramowego do projektu - „Projekt Java od...
Roman Beekeeper
Poziom 35

Dodanie bota telegramowego do projektu - „Projekt Java od A do Z”

Opublikowano w grupie Random-PL
Witam Was moi drodzy przyjaciele. Tak, tak, dokładnie przyjaciele. Zaznajomiłem się już z tą serią artykułów tak bardzo, że osoby, które regularnie piszą w komentarzach swoje podziękowania i/lub pokazują, że przeczytały i zrozumiały materiał, już się do mnie zbliżyły. Ty i ja zmierzamy z obu stron do tego samego celu. Chcesz zrozumieć, ale ja chcę wyjaśnić. A my mamy ten sam ostateczny cel – pisemną aplikację, która będzie dla Ciebie zrozumiała od początku do końca. Być może słyszałeś już o większości tego, co opiszę w tym artykule. Nie sądzę, że powiem Wam coś nowego i niezwykłego (ale w ramach projektu trzeba to wiedzieć/powtórzyć). „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 1Wiosną napisałem dla siebie bota, więc będziemy polegać na jego „wzorach”.

Piszemy JRTB-2

Zrobimy to samo, co w artykule z zadaniem JRTB-0 :
  1. Aktualizujemy główną gałąź w projekcie lokalnym za pomocą kombinacji ctrl + t .„Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 2
  2. W oparciu o gałąź główną tworzymy:„Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 3
  3. Dodaj bota.
  4. Tworzymy nowy commit z opisem tego co zostało zrobione i wypychamy go do GitHuba.
  5. Utwórz żądanie ściągnięcia dla głównej gałęzi i sprawdź je ponownie. Czekamy na zakończenie kompilacji (akcje github), scalamy ją z główną gałęzią.
  6. Zamknij odpowiednie zadanie.

Co to jest bot telegramowy

My, programiści, możemy sobie wyobrazić pracę z botem telegramowym w ten sposób: do pracy z nimi używamy ich klienta. Mamy gotową bibliotekę do pracy. Istnieje zestaw działań, po których bot telegramowy będzie wiedział, że jest powiązany z naszym programem. A już w programie nauczymy się odbierać listy, polecenia i jakoś je przetwarzać. W botach telegramowych istnieje coś takiego jak polecenie : zaczyna się od ukośnika „/”. Następnie natychmiast piszemy to słowo razem, a to zostanie uznane za polecenie. Na przykład istnieją dwa polecenia, które każdy powinien znać:
  • /start — rozpocznij pracę z botem;
  • /stop - zakończ pracę z botem.
Resztę zrobimy sami. Pozwólcie, że od razu dokonam rezerwacji: zrobimy dokładnie to, co i w sposób, którego się nauczyłem. A pracując z botem jestem pewien, że da się to zrobić lepiej. A jeśli ktoś będzie chciał to zrobić, to będę tylko szczęśliwy i będę wspierał to przedsięwzięcie na wszelkie możliwe sposoby. Swoją drogą, pierwszą rzeczą, która byłaby fajna, byłoby, gdyby ktoś mi wyjaśnił, jak zaprogramować opis poleceń za pomocą kodu, a nie poprzez ustawienia bota w telegramie. Nie nauczyłem się tego. W naszym zasobie mamy kilka artykułów opisujących, jak stworzyć podstawowego bota: dzisiaj zrobimy coś podobnego. Jeśli masz więcej pytań, polecam przejrzeć ten artykuł.

Utwórz bota za pomocą BotFather

Aby połączyć bota, musisz go najpierw utworzyć. Telegram ma podejście - utworzenie bota z własną unikalną nazwą. Będzie mu również towarzyszyć token (duży ciąg znaków, który działa jak hasło). Stworzyłem już bota dla JavaRush - @javarush_community_bot . Ten bot jest nadal pusty i nie może nic zrobić. Najważniejsze jest to, że na końcu nazwy powinien znajdować się _bot . Aby pokazać jak to zrobić stworzę bota na którym będziemy testować naszą funkcjonalność. Jeśli chodzi o realne projekty, byłoby to środowisko testowe. A naszym głównym będzie środowisko prod (prod - produkcja, czyli środowisko rzeczywiste, na którym projekt będzie realizowany). Oczywiście byłoby możliwe dodanie kolejnego środowiska - środowiska sandbox: wspólnego sandboxa, bardziej zmiennego i dostępnego dla wszystkich uczestników rozwoju. Ale to tylko skomplikuje sytuację na etapie tworzenia projektu. Na razie utwórzmy jeszcze dwa boty do środowiska testowego i piaskownicy. Pierwszym krokiem jest utworzenie (zarejestrowanie) bota w samym Telegramie. Musimy znaleźć bota: @BotFather i napisać do niego komendę: /newbot„Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 4 Następnie jesteśmy proszeni o nadanie nazwy temu botowi. Ponieważ jest to bot do zadań testowych, jego nazwa będzie odpowiednia: [TEST] JavarushBot„Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 5 Teraz czas podać unikalną nazwę, pod którą zawsze można go znaleźć - jego nazwę użytkownika: test_javarush_community„Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 6 Jak powiedziałem powyżej, musisz dodać _bot przyrostek do nazwy użytkownika, więc piszemy jeszcze raz: test_javarush_community_bot„Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 7 I gotowe! Bot został stworzony. Teraz za pomocą nazwy użytkownika i tokena można go podłączyć do naszego projektu. Oczywiście dla sprawnego działania serwera testowego nie będę wyświetlał tokena (w zasadzie hasła dostępu do bota) tego bota do publicznego wglądu.

Podłączamy bota do projektu

Nie będziemy jak zwykle dołączać biblioteki, ale od razu skorzystamy z naszego szkieletu - SpringBoot. Ma coś takiego jak Starter. Dołączając bibliotekę, możemy za jej pomocą dać SpringBootowi znać, że chcemy poprawnie skonfigurować projekt. Gdybyśmy mieli pójść zwykłą trasą, która jest opisana w wielu miejscach, musielibyśmy gdzieś stworzyć konfigurację, która miałaby coś takiego:
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
  telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
  e.printStackTrace();
}
Tutaj tworzony jest obiekt, za pomocą którego można nawiązać połączenie z botem. W naszym przypadku rozrusznik, który chcemy podłączyć zrobi za nas wszystko gdzieś „pod maską” (to też tłumaczenie często używanego w IT wyrażenia – pod maską). Oto link do tego startera . Z pliku README.md od razu widać, co to jest, dlaczego i jak z niego korzystać. Aby go podłączyć wystarczy dodać tę zależność do pamięci. To wszystko :) Oto wymagana zależność:
<dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-spring-boot-starter</artifactId>
        <version>5.0.1</version>
    </dependency>
Dodajemy to do naszej pamięci. Instalujemy wersję zgodnie z oczekiwaniami i aktualizujemy projekt Maven. „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 8Bazując na opisie wystarczy utworzyć nową klasę, dziedziczyć z TelegramLongPollingBot i dodać tę klasę do kontekstu aplikacji naszego SpringBoota. Kontekst aplikacji to miejsce, w którym przechowywane są utworzone obiekty służące do uruchomienia projektu. Aby dodać klasę należy skorzystać z jednej z adnotacji: @Component, @Service, @Repository, @Controller. Lub adnotację @Bean, jeśli utworzono za pomocą metody w klasie konfiguracji (to znaczy w klasie oznaczonej adnotacją Konfiguracja). Rozumiem, że to wszystko może się jeszcze wydawać niezrozumiałe. Ale kiedy zaczniesz to rozgryźć, zobaczysz, że nie ma w tym nic skomplikowanego. Aby szybko zrozumieć Spring Boot, polecam fajną książkę - Spring In Action 5th Edition. Jeśli będzie chęć, mogę napisać serię artykułów na podstawie tej książki. Wracajmy. W pakiecie zawierającym JavarushTelegramBotApplication tworzymy pakiet bota , który będzie zawierał naszego bota telegramowego. Jego nazwa będzie brzmieć JavaRushTelegramBot :
package com.github.javarushcommunity.jrtb.bot;

import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Telegrambot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {

   @Override
   public void onUpdateReceived(Update update) {

   }

   @Override
   public String getBotUsername() {
       return null;
   }

   @Override
   public String getBotToken() {
       return null;
   }
}
Klasa ta była abstrakcyjna i należało zaimplementować trzy metody. Porozmawiajmy o nich bardziej szczegółowo:
  • onUpdateReceived(Aktualizacja aktualizacji) - jest to punkt wejścia, do którego będą przychodzić wiadomości od użytkowników. Stąd będzie pochodzić cała nowa logika;
  • getBotUsername() - tutaj musisz dodać nazwę użytkownika naszego bota, z którym się połączymy;
  • getBotToken() - i to jest odpowiednio token bota.
Zasadniczo przypomina login i hasło do witryny. Na razie nie będziemy bezpośrednio pisać tej wartości. Nazywa się to „hardkodowaniem” (to znaczy powiązaniem określonej wartości - jak zwykle kalką z angielskiego twardego kodu). Nie powinieneś tego robić. My pójdziemy w drugą stronę - zapiszemy te dane do klasy application.properties i stąd je odczytamy. Dlaczego jest to konieczne? Następnie, aby po uruchomieniu aplikacji móc ustawić te wartości zewnętrznie. Jest elastyczny, to prawda. Przejdź do pliku src/main/resources/application.properties. Tam wymyślimy nazwy tych zmiennych. Pliki z rozszerzeniem .properties odczytywane są jako struktura klucz-wartość oddzielona znakiem „=”, przy czym każda para stanowi osobną linię. Wymyśliłem więc takie zmienne:
  • bot.nazwa użytkownika ;
  • bot.token .
Tak to będzie wyglądać: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 9SpringBoot ma świetną adnotację - @Value. Jeśli zostanie użyty poprawnie, pobierze wartości z pliku application.properties. Aktualizujemy projekt o to:
package com.github.javarushcommunity.jrtb.bot;

import org.springframework.beans.factory.annotation.Value;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Telegram bot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {

   @Value("${bot.username}")
   private String username;

   @Value("${bot.token}")
   private String token;

   @Override
   public void onUpdateReceived(Update update) {

   }

   @Override
   public String getBotUsername() {
       return username;
   }

   @Override
   public String getBotToken() {
       return token;
   }
}
Widać, że do adnotacji przekazaliśmy wartość zmiennej. A kiedy SpringBoot utworzy nasz obiekt bota, wartości zostaną pobrane z właściwości (znowu kalka z angielskiego - właściwości). Prawie jesteśmy na miejscu. Musisz sprawić, żeby bot na coś odpowiedział. Dlatego zaktualizujmy metodę onUpdateReceived . Musimy odzyskać wiadomość, która przyszła do bota i przekazać ją z powrotem. W ten sposób będziemy wiedzieć, że bot działa. Aby to zrobić, z grubsza i szybko napiszemy, co jest potrzebne:
@Override
public void onUpdateReceived(Update update) {
   if(update.hasMessage() && update.getMessage().hasText()) {
       String message = update.getMessage().getText().trim();
       String chatId = update.getMessage().getChatId().toString();

       SendMessage sm = new SendMessage();
       sm.setChatId(chatId);
       sm.setText(message);

       try {
           execute(sm);
       } catch (TelegramApiException e) {
           //todo add logging to the project.
           e.printStackTrace();
       }
   }
}
Wszystko tutaj jest niezwykle proste: sprawdzamy, czy wiadomość naprawdę istnieje, dlatego wyodrębniamy samą wiadomość ( message ) oraz identyfikator czatu ( chatId ), w którym toczy się korespondencja. Następnie tworzymy obiekt do wysłania wiadomości SendMessage , przekazujemy do niego samą wiadomość oraz ID czatu – czyli co i gdzie wysłać botowi. Mamy już tego dość. Następnie uruchamiamy metodę main w klasie JavarushTelegramBotApplication i szukamy naszego bota w Telegramie: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 10Z logów widzimy, że bot został uruchomiony. Czas więc wejść na Telegram i napisać do bota: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 11Klikamy start i od razu otrzymujemy odpowiedź: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 12Napiszmy jeszcze trochę bzdur do sprawdzenia: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 13I tyle, w tym momencie możemy powiedzieć, że nasze zadanie JRTB-2 zostało zakończone . Tak naprawdę nie możesz jeszcze pisać tutaj żadnych testów, więc zostawimy wszystko tak, jak jest. Następnie musisz utworzyć nowe zatwierdzenie: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 14Zwróć uwagę na nazwę zatwierdzenia: ponownie zwracam na to twoją uwagę. Zatwierdzenie zawiera najpierw nazwę zadania, a następnie bardziej szczegółowy opis tego, co zostało wykonane. Kliknij Zatwierdź i Push... i potwierdź klikając ponownie Push : „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 15Przejdź do naszego projektu . Tak jak poprzednio, GitHub widział już nową gałąź i oferuje utworzenie żądania ściągnięcia dla main. Nie opieramy się i tworzymy: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 16Jak zwykle mamy już wybraną wytwórnię, projekt i przydzielono mi go. Na koniec kliknij opcję Utwórz żądanie ściągnięcia. Poczekajmy chwilę, aż kompilacja się zakończy — i to wszystko, żądanie ściągnięcia jest gotowe do połączenia:„Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 17

Wersjonowanie

Jakoś przeoczyłem moment, w którym musimy wykonać wersjonowanie. W tym celu dokonamy jeszcze kilku zmian w naszym oddziale. Wracamy do IDEA i sprawdzamy w pamięci wersję projektu: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 18Wersja to 0.0.1-SNAPSHOT . To jest wersja służbowa. A zaczniemy od aktualizacji wersji projektu z każdym nowym rozwiązanym problemem. Dopóki nie osiągniemy MVP, wersja będzie zawierała przyrostek -SNAPSHOT. Jaki będzie schemat wersjonowania? MIGAWKA XYZ Gdzie:
  • X - aktualizacja wersji głównej, często zawiera problemy z kompatybilnością wsteczną z poprzednią wersją;
  • Y - niezbyt duże zmiany, w pełni kompatybilne z poprzednią wersją;
  • Z to licznik usterek, które znaleźliśmy i naprawiliśmy.
Na tej podstawie będziemy mieli pierwszą wersję - 0.1.0-SNAPSHOT - czyli nie mieliśmy jeszcze większych aktualizacji, tylko wszystkiego po trochu i nie osiągnęliśmy jeszcze MVP, więc jest przyrostek -SNAPSHOT . Zmieńmy to w pamięci: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 19Przejdźmy do pliku RELEASE_NOTES, gdzie z każdą nową wersją będziemy opisywać zmiany w projekcie: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 20Nasz pierwszy wpis. Teraz przy każdej kolejnej aktualizacji wersji będziemy tutaj opisywać co dokładnie się wydarzyło. Popełniamy tę sprawę, piszemy opis: JRTB-2: zaktualizowana wersja projektu i dodana do RELEASE_NOTES Wszystko jest dokładnie takie samo jak wcześniej. Czekamy, aż kompilacja się zakończy i będziemy mogli scalić nasze zmiany. Tylko tutaj będzie trochę inaczej. Chcę się upewnić, że każde zadanie w gałęzi głównej jest oddzielnym zatwierdzeniem, więc samo wysłanie żądania ściągnięcia scalania nie będzie dla nas skuteczne. Git ma opcję git squash, która zbiera wszystkie zatwierdzenia w jedno i łączy je. Wybieramy tę opcję: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 21Kliknij Squash and Merge, a my zaproponujemy edycję wiadomości, która na końcu będzie: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 22Bardzo wygodna i co najważniejsze, na co jest zapotrzebowanie. Swoją drogą, nie widziałem takiej funkcji na bitbuckecie =/ Potwierdź połączenie. Pozostało już tylko zmienić status zadania na Wykonane w naszej tablicy, napisać komentarz z linkiem do pull requestu i zamknąć go: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 23Nasza tablica wygląda teraz tak:„Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 24

Wniosek

Dzisiaj krok po kroku stworzyliśmy bota telegramowego i zaimplementowaliśmy go w naszym projekcie SpringBoot. Bot działa i udziela odpowiedzi. Natychmiast uzyskaliśmy dostęp do danych bota poprzez właściwości. Więcej przed nami: zrobimy duży kawałek - wykonamy JRTB-3 - dodając wzorzec poleceń do naszego projektu. Aha, jeszcze jedno... Mówiłem, że nie opublikuję tokena, żeby nie został wykorzystany. Ponieważ jednak pisałem artykuł bliżej północy i po pracy, okazało się, że umieściłem w repozytorium ważny token, a GitGuardian powiedział mi o tym w liście: „Projekt Java od A do Z”: dodanie bota telegramowego do projektu - 25Dziękuję im za to! Co zrobić teraz? Nie będzie już możliwe usunięcie go z gita, ponieważ nawet jeśli prześlę nowe zatwierdzenie bez tego tokena, nadal pozostanie ono w starym. Ale nie chcę usuwać i wycofywać zatwierdzenia. Poszedłem więc i dezaktywowałem token ze wspomnianego już BotFather. Teraz token tam jest, ale nie jest już ważny. Subskrybuj moje konto GitHub , aby zobaczyć cały kod przed opublikowaniem artykułu. Dziękuję wszystkim za przeczytanie, do zobaczenia wkrótce.

Lista wszystkich materiałów wchodzących w skład serii znajduje się na początku artykułu.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION