Salam əziz dostlarım. Bəli, bəli, dostlar. Artıq bu silsilə məqalələrlə o qədər tanış olmuşam ki, mütəmadi olaraq şərhlərdə öz təşəkkürlərini yazan və/yaxud materialı oxuyub başa düşdüklərini göstərən insanlar artıq yaxınlaşıblar. Sən və mən hər iki tərəfdən eyni məqsədə doğru irəliləyirik. Sən başa düşmək istəyirsən, amma mən izah etmək istəyirəm. Və bizim eyni son məqsədimiz var - başdan sona qədər sizin üçün başa düşülən yazılı ərizə. Bu məqalədə təsvir edəcəyim şeylərin çoxu haqqında artıq eşitmisiniz. Sizə yeni və qeyri-adi bir şey deyəcəyimi düşünmürəm (lakin layihə çərçivəsində bunu bilmək/təkrar etmək lazımdır).
Yazda özüm üçün bir bot yazdım, buna görə də onun "naxışlarına" etibar edəcəyik.
Sonra bizdən bu bota ad vermək tələb olunur. Bu, test tapşırıqları üçün bir bot olduğundan, onun adı uyğun olacaq: [TEST] JavarushBot
İndi onu həmişə tapmaq üçün unikal bir ad verməyin vaxtı gəldi - istifadəçi adı: test_javarush_community
Yuxarıda dediyim kimi, _bot əlavə etməlisiniz. istifadəçi adı üçün şəkilçi, biz yenidən yazırıq: test_javarush_community_bot
Və budur! Bot yaradılıb. İndi istifadəçi adı və tokendən istifadə edərək layihəmizə qoşula bilər. Təbii ki, test serverinin rəvan işləməsi üçün mən bu botun işarəsini (əsasən bota daxil olmaq üçün parol) ictimai baxış üçün göstərməyəcəyəm.
Təsvirə əsaslanaraq, sadəcə olaraq yeni sinif yaratmalı, TelegramLongPollingBot-dan miras almalıyıq və bu sinfi SpringBoot-un Tətbiq Kontekstinə əlavə etməliyik. Tətbiq konteksti layihənin icrası üçün yaradılmış obyektlərin saxlandığı yerdir. Sinif əlavə etmək üçün annotasiyalardan birini istifadə etməlisiniz: @Component, @Service, @Repository, @Controller. Və ya konfiqurasiya sinfində (yəni Konfiqurasiya annotasiyası ilə qeyd olunan sinifdə) metod vasitəsilə yaradılıbsa @Bean annotasiyası. Başa düşürəm ki, bütün bunlar hələ də anlaşılmaz görünə bilər. Ancaq bunu anlamağa başlayanda görəcəksiniz ki, orada mürəkkəb bir şey yoxdur. Spring Boot-u tez başa düşmək üçün gözəl bir kitab tövsiyə edirəm - Spring In Action 5-ci nəşr. İstək olarsa, bu kitab əsasında silsilə məqalələr yaza bilərəm. Qayıdaq. JavarushTelegramBotApplication olan paketdə biz telegram botumuzu ehtiva edən bot paketini yaradırıq. Onun adı JavaRushTelegramBot olacaq :
SpringBoot-un əla annotasiyası var - @Value. Düzgün istifadə edilərsə, o, application.properties faylından dəyərləri çıxaracaq. Layihəni bununla yeniləyirik:
Jurnallardan botun işə düşdüyünü görürük. Beləliklə, Telegram-a getmək və bota yazmağın vaxtı gəldi:
Başlat düyməsini klikləyirik və dərhal cavab alırıq:
Yoxlamaq üçün bir az daha boşboğazlıq yazaq:
Və budur, bu anda JRTB-2 tapşırığımızın tamamlandığını söyləyə bilərik. . Burada hələ heç bir test yaza bilməzsiniz, ona görə də hər şeyi olduğu kimi buraxacağıq. Sonra yeni bir öhdəlik yaratmalısınız:
Öhdətin adına diqqət yetirin: yenə diqqətinizi buna cəlb edirəm. Öhdəlik əvvəlcə tapşırığın adını, sonra isə görülən işlərin daha ətraflı təsvirini ehtiva edir. Tapşırıq və Push... düyməsini basın və Yenidən Push düyməsini klikləməklə təsdiqləyin : Layihəmizə
keçin . Əvvəlki kimi, GitHub artıq yeni filialı görüb və əsas üçün çəkmə sorğusu yaratmağı təklif edir. Biz müqavimət göstərmirik və onu yaratmırıq: Həmişə olduğu kimi, biz artıq bir etiket, layihə seçmişik və onu mənə təyin etmişik. Nəhayət, Çekmə Sorğunu Yarat klikləyin. Quraşdırma başa çatana qədər bir az gözləyək - və budur, çəkmə sorğusu birləşməyə hazırdır:!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 16]()
Versiya 0.0.1-SNAPSHOT- dur . Bu vəzifə versiyasıdır. Və biz hər yeni həll edilmiş problemlə layihənin versiyasını yeniləyərək başlayacağıq. MVP-yə çatana qədər versiya -SNAPSHOT şəkilçisi ilə gələcək. Versiya sxemi nə olacaq? XYZ-SNAPSHOT Harada:
RELEASE_NOTES faylına keçin, burada hər yeni versiya ilə layihəyə edilən dəyişiklikləri təsvir edəcəyik:
İlk girişimiz. İndi, hər bir sonrakı versiya yeniləməsi ilə biz burada dəqiq nə baş verdiyini təsvir edəcəyik. Biz bu işi yerinə yetiririk, təsviri yazın: JRTB-2: layihənin yenilənmiş versiyası və RELEASE_NOTES-ə əlavə olunub Hər şey əvvəlki kimidir. Quraşdırmanın keçməsini gözləyirik və dəyişikliklərimizi birləşdirə bilərik. Yalnız burada bir az fərqli olacaq. Mən əmin olmaq istəyirəm ki, əsas filialdakı hər bir tapşırıq ayrı bir öhdəlikdir, ona görə də sadəcə birləşdirmə sorğusunu itələmək bizim üçün işləməyəcək. Git-də bütün öhdəlikləri bir yerə toplayan və onları birləşdirən git squash variantı var. Bu seçimi seçirik:
Squash and Merge klikləyin və sonda olacaq mesajı redaktə etmək təklif olunur:
Çox rahat və ən əsası, nə tələb olunur. Yeri gəlmişkən, bitbucket-də belə bir xüsusiyyət görməmişəm =/ Birləşməni təsdiqləyin. Qalan yeganə şey, lövhəmizdə tapşırığın statusunu Bitdi olaraq dəyişdirmək, çəkmə sorğusuna keçid ilə şərh yazmaq və onu bağlamaqdır:
Şuramız indi belə görünür:
Bunun üçün onlara təşəkkür edirəm! İndi nə etməli? Artıq onu git-dən silmək mümkün olmayacaq, çünki bu nişan olmadan yeni bir öhdəliyi yükləsəm də, o, yenə də köhnəsində qalacaq. Ancaq öhdəliyi silmək və geri qaytarmaq istəmirəm. Beləliklə, getdim və qeyd olunan BotFather-dən nişanı deaktiv etdim. İndi token var, lakin artıq etibarlı deyil. Məqaləni dərc etməzdən əvvəl onun bütün kodunu görmək üçün GitHub hesabıma abunə olun . Oxuduğunuz üçün hamınıza təşəkkür edirəm, tezliklə görüşərik.
JRTB-2 yazırıq
JRTB-0 tapşırığı ilə məqalədə etdiyimiz kimi edəcəyik :- Biz ctrl + t birləşməsindən istifadə edərək yerli layihədə əsas filialı yeniləyirik .
- Əsas filial əsasında biz yaradırıq:
- Bot əlavə edin.
- Biz görülən işlərin təsviri ilə yeni bir öhdəlik yaradırıq və onu GitHub-a itələyirik.
- Əsas filial üçün çəkmə sorğusu yaradın və yenidən yoxlayın. Quraşdırmanın keçməsini gözləyirik (github hərəkətləri), onu əsas filiala birləşdirin.
- Müvafiq tapşırığı bağlayın.
Telegram botu nədir
Biz tərtibatçılar teleqram botu ilə işləməyi belə təsəvvür edə bilərik: biz onlarla işləmək üçün onların müştərisindən istifadə edirik. İş üçün hazır kitabxanamız var . Bir sıra tədbirlər var, ondan sonra teleqram botu onun proqramımızla əlaqəli olduğunu biləcək. Və artıq proqram daxilində biz məktubları, əmrləri necə qəbul etməyi və bir şəkildə onları emal etməyi öyrənəcəyik. Teleqram botlarında əmr kimi bir şey var : o, “/” xətti ilə başlayır. Bundan sonra dərhal sözü birlikdə yazırıq və bu, əmr sayılacaq. Məsələn, hər kəsin bilməli olduğu iki əmr var:- /start — botla işləməyə başlayın;
- /stop - botla işi bitir.
BotFather ilə bot yaradın
Botu qoşmaq üçün əvvəlcə onu yaratmalısınız. Telegramın bir yanaşması var - özünəməxsus adı olan bot yaratmaq. O, həmçinin nişan (parol kimi işləyən böyük sətir) ilə müşayiət olunacaq. Mən artıq JavaRush üçün bot yaratmışam - @javarush_community_bot . Bu bot hələ də boşdur və heç nə edə bilmir. Əsas odur ki, adın sonunda _bot olmalıdır . Bunu necə edəcəyimizi göstərmək üçün funksionallığımızı sınayacağımız bir bot yaradacağam. Real layihələr baxımından bu, sınaq mühiti olardı. Bizim əsasımız isə istehsal mühiti olacaq (məhsul - istehsal, yəni layihənin icra olunacağı real mühit). Əlbəttə ki, başqa bir mühit əlavə etmək olardı - sandbox mühiti: ümumi sandbox, daha dəyişkən və bütün inkişaf iştirakçıları üçün əlçatandır. Ancaq bu, yalnız layihənin yaradılması mərhələsində vəziyyəti çətinləşdirəcək. Hələlik test üçün və sandbox mühiti üçün daha iki bot yaradaq. İlk addım Telegram-ın özündə bir bot yaratmaq (qeydiyyatdan keçmək) etməkdir. Biz botu tapmalıyıq: @BotFather və ona əmr yazmalıyıq: /newbot!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 4](https://cdn.javarush.com/images/article/da251e55-7d65-405d-8269-eae59ddec3fd/1080.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 5](https://cdn.javarush.com/images/article/cf774e29-d1bd-45ac-be63-4eec1ace7c8b/1080.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 6](https://cdn.javarush.com/images/article/bc2012c9-a5fd-409c-9afb-d731c2498ba9/1080.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 7](https://cdn.javarush.com/images/article/fb211e24-7ad5-4826-93ac-131f48bec30b/1080.jpeg)
Biz botu layihəyə bağlayırıq
Kitabxananı həmişəki kimi daxil etməyəcəyik, ancaq skeletimizdən - SpringBoot-dan dərhal faydalanacağıq. Onun Starter kimi bir işi var. Kitabxananı daxil etməklə, SpringBoot-a layihəni düzgün konfiqurasiya etmək istədiyimizi bildirmək üçün ondan istifadə edə bilərik. Bir çox yerdə təsvir olunan adi marşrutla getsək, belə bir şeyə malik olan bir yerdə konfiqurasiya yaratmalıyıq:ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
e.printStackTrace();
}
Burada botla əlaqə qura biləcəyiniz obyekt yaradılır. Bizim vəziyyətimizdə, bağlamaq istədiyimiz başlanğıc bizim üçün hər şeyi "başlıq altında" bir yerdə edəcək (bu həm də İT-də tez-tez istifadə olunan ifadənin tərcüməsidir - başlıq altında). Bu başlanğıc üçün bir keçid var . README.md faylından onun nə olduğunu, niyə və necə istifadə olunduğunu dərhal görə bilərsiniz. Onu qoşmaq üçün bu asılılığı yaddaşa əlavə etmək kifayətdir. Hamısı budur :) Budur tələb olunan asılılıq:
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-spring-boot-starter</artifactId>
<version>5.0.1</version>
</dependency>
Onu yaddaşımıza əlavə edirik. Versiyanı gözlənildiyi kimi quraşdırırıq və Maven layihəsini yeniləyirik. !["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 8](https://cdn.javarush.com/images/article/f4f45c30-c562-4961-b5c7-c08d60352a05/800.jpeg)
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;
}
}
Bu sinif mücərrəd idi və üç metod həyata keçirilməli idi. Onlar haqqında daha ətraflı danışaq:
- onUpdateReceived(Yeniləmə yeniləməsi) - bu, istifadəçilərdən mesajların çatacağı giriş nöqtəsidir. Bütün yeni məntiq buradan gələcək;
- getBotUsername() - burada qoşulacağımız botumuzun istifadəçi adını əlavə etməlisiniz;
- getBotToken() - və bu, müvafiq olaraq, bot nişanıdır.
- bot.username ;
- bot.token .
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 9](https://cdn.javarush.com/images/article/f49789c6-3378-42d7-9da2-c7e7ec38b72c/512.jpeg)
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;
}
}
Dəyişənin qiymətini annotasiyaya keçirdiyimizi görmək olar. SpringBoot bot obyektimizi yaratdıqda, dəyərlər xassələrdən götürüləcək (yenə ingilis dilindən izləmə kağızı - xüsusiyyətlər). Demək olar ki, oradayıq. Siz botun nəyəsə cavab verməsini təmin etməlisiniz. Buna görə də onUpdateReceived metodunu yeniləyək . Biz bota gələn mesajı götürüb geri ötürməliyik. Beləliklə, botun işlədiyini biləcəyik. Bunu etmək üçün lazım olanı təxminən və tez yazacağıq:
@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();
}
}
}
Burada hər şey olduqca sadədir: biz mesajın həqiqətən mövcud olduğunu yoxlayırıq, ona görə də mesajın özünü ( mesaj ) və yazışmaların baş verdiyi söhbət ID-sini ( chatId ) çıxarırıq . Sonra, mesaj göndərmək üçün bir obyekt yaradırıq SendMessage , mesajın özünü və söhbət identifikatorunu ona ötürür - yəni bota nə və hara göndərilməlidir. Bizdə artıq bu kifayətdir. Daha sonra JavarushTelegramBotApplication sinifində əsas metodu işlədirik və Telegram-da botumuzu axtarırıq: !["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 10](https://cdn.javarush.com/images/article/0e5175c2-2cea-4294-b6d8-2d7b42e5d0ec/1080.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 11](https://cdn.javarush.com/images/article/1bed4559-f9bf-43e5-b4b8-dcdd4eb4a2ed/512.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 12](https://cdn.javarush.com/images/article/392c2361-b04e-411e-8750-44ff8ac05b56/512.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 13](https://cdn.javarush.com/images/article/42578b38-d572-40a1-8c58-b56c9848dba3/512.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 14](https://cdn.javarush.com/images/article/fab24536-9f78-4d76-87aa-94662b19ad7b/512.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 15](https://cdn.javarush.com/images/article/bb41a8e6-2dee-4b14-be36-460e23b60ace/512.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 16](https://cdn.javarush.com/images/article/75880a98-5812-49e7-bc02-09d2d4fb5ff5/800.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 17](https://cdn.javarush.com/images/article/f63be8c4-31ec-47fb-af9b-dc621e0f3489/800.jpeg)
Versiyalaşdırma
Mən nədənsə versiyanı hazırlamağımız lazım olan məqamı qaçırdım. Bunun üçün filialımızda daha bir neçə dəyişiklik edəcəyik. Biz IDEA-ya qayıdırıq və yaddaşdakı layihə versiyasına baxırıq:!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 18](https://cdn.javarush.com/images/article/5637da0d-2fe8-4d59-8674-f1790d03a305/512.jpeg)
- X - əsas versiya yeniləməsi, tez-tez əvvəlki versiya ilə geriyə uyğunluq problemləri ehtiva edir;
- Y - çox böyük dəyişikliklər deyil, əvvəlki versiyaya tam uyğundur;
- Z aşkar etdiyimiz və təmir etdiyimiz qüsurların sayğacıdır.
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 19](https://cdn.javarush.com/images/article/44e2a45c-6291-4fdf-bda5-042e6a7ba595/800.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 20](https://cdn.javarush.com/images/article/138e13d9-499b-45d4-a2e7-e20d81cdf3a5/800.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 21](https://cdn.javarush.com/images/article/24112b77-07f4-4eb6-b649-5faf70bcf2d6/800.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 22](https://cdn.javarush.com/images/article/a583cdfc-9d42-4f03-b956-feeda0294423/800.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 23](https://cdn.javarush.com/images/article/d04861f7-8bc2-45c1-b589-6c9b328c2afb/800.jpeg)
!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 24](https://cdn.javarush.com/images/article/9a32e01a-6370-4fae-b8a5-ba7203aa5c89/800.jpeg)
Nəticə
Bu gün biz addım-addım teleqram bot yaratdıq və onu SpringBoot layihəmizdə tətbiq etdik. Bot işləyir və cavab verir. Xüsusiyyətlər vasitəsilə dərhal bot məlumatlarına giriş əldə etdik. Gələcək daha çox şey: biz böyük bir iş edəcəyik - JRTB-3-ü yerinə yetirəcəyik - layihəmiz üçün Komanda Modeli əlavə edəcəyik. Oh, daha bir şey ... Mən sizə demişdim ki, istifadə olunmasın deyə tokeni dərc etməyəcəm. Ancaq məqaləni gecə yarısına yaxın və işdən sonra yazdığım üçün anbarda etibarlı bir token yerləşdirdiyim məlum oldu və GitGuardian bu barədə mənə məktubda dedi:!["A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 25](https://cdn.javarush.com/images/article/573a85c7-ed5f-4f7a-84b4-daf515eedb33/512.jpeg)
GO TO FULL VERSION