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ć). Wiosną 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 :- Aktualizujemy główną gałąź w projekcie lokalnym za pomocą kombinacji ctrl + t .
- W oparciu o gałąź główną tworzymy:
- Dodaj bota.
- Tworzymy nowy commit z opisem tego co zostało zrobione i wypychamy go do GitHuba.
- 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ą.
- 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.
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 Następnie jesteśmy proszeni o nadanie nazwy temu botowi. Ponieważ jest to bot do zadań testowych, jego nazwa będzie odpowiednia: [TEST] JavarushBot Teraz czas podać unikalną nazwę, pod którą zawsze można go znaleźć - jego nazwę użytkownika: test_javarush_community Jak powiedziałem powyżej, musisz dodać _bot przyrostek do nazwy użytkownika, więc piszemy jeszcze raz: test_javarush_community_bot 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. Bazują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.
- bot.nazwa użytkownika ;
- bot.token .
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: Z logów widzimy, że bot został uruchomiony. Czas więc wejść na Telegram i napisać do bota: Klikamy start i od razu otrzymujemy odpowiedź: Napiszmy jeszcze trochę bzdur do sprawdzenia: I 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: Zwróć 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 : Przejdź 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: Jak 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:
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: Wersja 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.
GO TO FULL VERSION