JavaRush /Java Blogu /Random-AZ /Layihəyə teleqram botunun əlavə edilməsi - "A-dan Z-yə Ja...
Roman Beekeeper
Səviyyə

Layihəyə teleqram botunun əlavə edilməsi - "A-dan Z-yə Java layihəsi"

Qrupda dərc edilmişdir
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). "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 1Yazda özüm üçün bir bot yazdım, buna görə də onun "naxışlarına" etibar edəcəyik.

JRTB-2 yazırıq

JRTB-0 tapşırığı ilə məqalədə etdiyimiz kimi edəcəyik :
  1. Biz ctrl + t birləşməsindən istifadə edərək yerli layihədə əsas filialı yeniləyirik ."A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 2
  2. Əsas filial əsasında biz yaradırıq:"A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 3
  3. Bot əlavə edin.
  4. 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.
  5. Ə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.
  6. 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.
Qalanını özümüz edəcəyik. İcazə verin, dərhal rezervasiya edim: öyrəndiyim şeyi dəqiq və şəkildə edəcəyik. Və botla işləyərkən əminəm ki, daha yaxşısını etmək mümkün olacaq. Əgər kimsə bunu etmək istəsə, mən yalnız xoşbəxt olacağam və bu cəhdi hər cür dəstəkləyəcəm. Yeri gəlmişkən, ilk növbədə kimsə mənə əmrlərin təsvirini teleqramdakı bot parametrləri vasitəsilə deyil, kod vasitəsilə necə proqramlaşdırmağı izah etsə, gözəl olardı. Mən bunu öyrənməmişəm. Resursumuzda əsas botun necə qurulacağını təsvir edən bir neçə məqaləmiz var: bu gün oxşar bir şey edəcəyik. Daha çox sualınız varsa, bu məqaləni nəzərdən keçirməyi məsləhət görürəm.

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 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"A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 5 İndi onu həmişə tapmaq üçün unikal bir ad verməyin vaxtı gəldi - istifadəçi adı: test_javarush_community"A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 6 Yuxarıda dediyim kimi, _bot əlavə etməlisiniz. istifadəçi adı üçün şəkilçi, biz yenidən yazırıq: test_javarush_community_bot"A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 7 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.

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 - 8Tə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 :
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.
Əslində bu, bir sayt üçün giriş və parol kimidir. Hələlik bu dəyəri açıq şəkildə yazmayacağıq. Buna "hardcoding" deyilir (yəni müəyyən bir dəyəri bağlamaq - həmişə olduğu kimi, İngilis dilinin sərt kodundan izləmə kağızı). Bunu etməməlisən. Biz başqa yolla gedəcəyik - bu məlumatları application.properties sinfinə yazacağıq və buradan oxuyacağıq. Bu niyə lazımdır? Sonra, proqram başlayanda bu dəyərləri xaricdən təyin edə bilək. Çevikdir, düzdür. src/main/resources/application.properties faylına keçin. Orada bu dəyişənlər üçün adlar tapacağıq. .properties uzantısı olan fayllar “=” ilə ayrılmış açar-dəyər strukturu kimi oxunur, hər bir cüt ayrıca sətirdir. Beləliklə, mən bu dəyişənlərlə gəldim:
  • bot.username ;
  • bot.token .
O, belə görünəcək: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 9SpringBoot-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:
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 - 10Jurnallardan botun işə düşdüyünü görürük. Beləliklə, Telegram-a getmək və bota yazmağın vaxtı gəldi: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 11Başlat düyməsini klikləyirik və dərhal cavab alırıq: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 12Yoxlamaq üçün bir az daha boşboğazlıq yazaq: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 13Və 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: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 14Ö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ə"A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 15 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"A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 17

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 - 18Versiya 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:
  • 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.
Buna əsaslanaraq ilk versiyaya - 0.1.0-SNAPSHOT -a sahib olacağıq, yəni bizdə hələ əsas yeniliklər olmayıb, hər şeydən bir az, və biz hələ MVP-yə çatmamışıq, ona görə də -SNAPSHOT şəkilçisi var. . Gəlin bunu yaddaşda dəyişdirək: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 19RELEASE_NOTES faylına keçin, burada hər yeni versiya ilə layihəyə edilən dəyişiklikləri təsvir edəcəyik: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 20İ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: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 21Squash and Merge klikləyin və sonda olacaq mesajı redaktə etmək təklif olunur: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 22Ç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: "A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 23Şuramız indi belə görünür:"A-dan Z-yə Java layihəsi": layihəyə teleqram botunun əlavə edilməsi - 24

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 - 25Bunun üçü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.

Serialdakı bütün materialların siyahısı bu məqalənin əvvəlindədir.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION