JavaRush /Java блогы /Random-KK /Жобаға телеграмма ботын қосу – «Java жобасы А-дан Я-ға де...
Roman Beekeeper
Деңгей

Жобаға телеграмма ботын қосу – «Java жобасы А-дан Я-ға дейін»

Топта жарияланған
Сәлем, қымбатты достарым. Иә, иә, дәл достар. Маған осы мақалалар топтамасы бұрыннан таныс болғаны сонша, түсініктемелерде үнемі алғыс білдіретін және/немесе материалды оқып, түсінгенін көрсететін адамдар жақындап қалған. Сіз бен біз екі жақтан бір мақсатқа қарай жылжып келеміз. Сіз түсінгіңіз келеді, бірақ мен түсіндіргім келеді. Ал біздің түпкі мақсатымыз бір – сізге басынан аяғына дейін түсінікті жазбаша өтініш. Сіз осы мақалада сипаттайтын нәрселердің көпшілігі туралы естіген шығарсыз. Мен сізге жаңа және ерекше ештеңе айтамын деп ойламаймын (бірақ жоба аясында мұны білу/қайталау қажет). «Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 1Көктемде мен өзім үшін бот жаздым, сондықтан біз оның «үлгілеріне» сенетін боламыз.

Біз JRTB-2 жазамыз

Біз JRTB-0 тапсырмасымен мақалада жасағандай жасаймыз :
  1. Біз ctrl + t тіркесімін пайдаланып жергілікті жобадағы негізгі тармақты жаңартамыз .«Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 2
  2. Негізгі тармаққа сүйене отырып, біз жасаймыз:«А-дан Я-ға Java жобасы»: жобаға телеграмма ботын қосу – 3
  3. Бот қосыңыз.
  4. Біз орындалған әрекеттердің сипаттамасы бар жаңа міндеттеме жасаймыз және оны GitHub-қа жібереміз.
  5. Негізгі фorал үшін тарту сұрауын жасаңыз және оны қайта тексеріңіз. Біз құрастырудың өтуін күтеміз (github әрекеттері), оны негізгі тармаққа біріктіріңіз.
  6. Сәйкес тапсырманы жабыңыз.

Telegram боты дегеніміз не

Біз, әзірлеушілер, телеграмма ботымен жұмыс істеуді елестете аламыз: біз олармен жұмыс істеу үшін олардың клиентін пайдаланамыз. Бізде жұмысқа дайын кітапхана бар. Әрекеттер жиынтығы бар, содан кейін телеграмма боты оның біздің бағдарламамен байланысты екенін біледі. Бағдарламаның ішінде біз хаттарды, командаларды қабылдауды және оларды қандай да бір жолмен өңдеуді үйренеміз. Telegram боттарында пәрмен сияқты нәрсе бар : ол «/» қиғаш сызықтан басталады. Одан кейін сөзді бірден бірге жазамыз, бұл бұйрық болып саналады. Мысалы, барлығы білуі керек екі команда бар:
  • /start — ботпен жұмысты бастау;
  • /stop - ботпен жұмысты аяқтау.
Қалғанын өзіміз жасаймыз. Маған бірден тапсырыс беруге рұқсат етіңіз: біз дәл мен үйренген нәрсені жасаймыз. Ал ботпен жұмыс істегенде одан да жақсырақ жұмыс жасауға болатынына сенімдімін. Ал егер біреу мұны істегісі келсе, мен тек қуанамын және бұл бастаманы жан-жақты қолдаймын. Айтпақшы, біреу маған жеделхаттағы бот параметрлері арқылы емес, code арқылы командалардың сипаттамасын қалай бағдарламалау керектігін түсіндірсе, ең бірінші керемет болар еді. Мен мұны үйренбедім. Біздің ресурста негізгі ботты қалай жасау керектігін сипаттайтын бірнеше мақалалар бар: бүгін біз ұқсас нәрсені жасаймыз. Егер сізде басқа сұрақтар болса, мен осы мақаланы қарап шығуды ұсынамын.

BotFather көмегімен бот жасаңыз

Ботты қосу үшін алдымен оны жасау керек. Telegram тәсілі бар - өзіндік бірегей аты бар бот жасау. Ол сонымен қатар таңбалауышпен (пароль сияқты жұмыс істейтін үлкен жол) сүйемелденеді. Мен JavaRush үшін бот жасадым - @javarush_community_bot . Бұл бот әлі бос және ештеңе істей алмайды. Ең бастысы, атау соңында _bot болуы керек . Мұны қалай жасау керектігін көрсету үшін мен функционалдылықты тексеретін бот жасаймын. Нақты жобаларға келетін болсақ, бұл сынақ ортасы болар еді. Ал біздің ең бастысы өнім ортасы (өнім – өндіріс, яғни жоба жүзеге асырылатын нақты орта) болады. Әрине, басқа ортаны – құм жәшігінің ортасын қосуға болады: жалпы құм жәшігі, анағұрлым өзгермелі және әзірлеудің барлық қатысушылары үшін қолжетімді. Бірақ бұл жобаны құру кезеңінде жағдайды қиындатады. Әзірге сынақ және құм жәшігіне арналған тағы екі бот жасайық. Бірінші қадам - ​​​​Telegram-дың өзінде бот жасау (тіркеу). Бізге ботты табу керек: @BotFather және оған пәрменді жазу керек: /newbot«Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 4 Содан кейін бізден осы ботқа атау беру сұралады. Бұл тестілеу тапсырмаларына арналған бот болғандықтан, оның атауы орынды болады: [TEST] JavarushBot«Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 5 Енді оны әрқашан табуға болатын бірегей атау беру уақыты келді - оның пайдаланушы аты: test_javarush_community«Java жобасы А-дан Я-ға»: жобаға телеграмма ботын қосу – 6 Жоғарыда айтқанымдай, сізге _bot қосу керек. пайдаланушы атына арналған жұрнақ, сондықтан біз қайтадан жазамыз: test_javarush_community_bot«Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 7 Міне, солай! Бот жасалды. Енді пайдаланушы аты мен таңбалауышты пайдаланып, оны жобамызға қосуға болады. Әрине, сынақ serverінің бірқалыпты жұмыс істеуі үшін мен бұл боттың таңбалауышын (негізі ботқа кіру құпия сөзін) жалпыға ортақ көру үшін көрсетпеймін.

Біз ботты жобаға қосамыз

Біз кітапхананы әдеттегідей қоспаймыз, бірақ біздің қаңқамыз - SpringBoot мүмкіндігін бірден пайдаланамыз. Оның Стартер деген қасиеті бар. Кітапхананы қосу арқылы біз оны SpringBoot-қа жобаны дұрыс конфигурациялағымыз келетінін білу үшін пайдалана аламыз. Егер біз көп жерде сипатталған әдеттегі маршрутпен жүретін болсақ, бізге келесідей нәрсе болатын бір жерде конфигурация жасау керек болады:
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
  telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
  e.printStackTrace();
}
Мұнда ботпен байланыс орнатуға болатын нысан жасалады. Біздің жағдайда, біз қосқымыз келетін стартер біз үшін «қақпақтың астында» бәрін жасайды (бұл сонымен қатар IT-де жиі қолданылатын фразаның аудармасы - капюшон астында). Міне осы стартерге сілтеме . Сіз README.md файлынан оның не екенін, оны не үшін және қалай пайдалану керектігін бірден көре аласыз. Оны қосу үшін бұл тәуелділікті жадқа қосу жеткілікті. Барлығы осы :) Міне қажетті тәуелділік:
<dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-spring-boot-starter</artifactId>
        <version>5.0.1</version>
    </dependency>
Біз оны жадымызға қосамыз. Біз нұсқаны күткендей орнатамыз және Maven жобасын жаңартамыз. «Java жобасы А-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 8Сипаттамаға сүйене отырып, бізге жай ғана жаңа класс жасап, TelegramLongPollingBot-тан мұраға алып, бұл классты SpringBoot қолданбасының контекстіне қосу керек. Қолданба мәтінмәні – жобаны іске қосу үшін жасалған an objectілер сақталатын орын. Сынып қосу үшін annotationлардың бірін пайдалану керек: @Component, @Service, @Repository, @Controller. Немесе конфигурация сыныбында (яғни, Конфигурация annotationсымен белгіленген сыныпта) әдіс арқылы жасалған болса, @Bean annotationсы. Мұның бәрі әлі де түсініксіз болып көрінуі мүмкін екенін түсінемін. Бірақ сіз оны анықтай бастағанда, онда күрделі ештеңе жоқ екенін көресіз. Spring Boot-ті тез түсіну үшін мен керемет кітапты ұсынамын - Spring In Action 5-ші басылым. Егер тілек болса, осы кітапқа сүйене отырып, мақалалар топтамасын жаза аламын. Қайтейік. JavarushTelegramBotApplication бар пакетте біз телеграмма боты қамтитын бот бумасын жасаймыз. Оның аты 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;
   }
}
Бұл сынып абстрактілі болды және үш әдісті жүзеге асыру қажет болды. Олар туралы толығырақ сөйлесейік:
  • onUpdateReceived(Жаңарту жаңарту) - бұл пайдаланушылардан хабарламалар келетін кіру нүктесі. Барлық жаңа логика осы жерден шығады;
  • getBotUsername() - мұнда біз қосылатын боттың пайдаланушы атын қосу керек;
  • getBotToken() - және бұл, тиісінше, бот белгісі.
Негізінде бұл сайтқа арналған логин мен пароль сияқты. Әзірге бұл мәнді нақты жазбаймыз. Бұл «қатты codeтау» деп аталады (яғни, белгілі бір мәнді байланыстыру - әдеттегідей, ағылшынның қатты codeынан алынған калька). Сіз бұлай етпеуіңіз керек. Біз басқа жолмен жүреміз - біз бұл деректерді application.properties класына жазып, оны осы жерден оқимыз. Бұл не үшін қажет? Содан кейін, қолданба іске қосылғанда, біз бұл мәндерді сырттай орната аламыз. Бұл икемді, бұл дұрыс. src/main/resources/application.properties файлына өтіңіз. Онда біз осы айнымалылардың атауларын ойлап табамыз. .properties кеңейтімі бар файлдар "=" белгісімен бөлінген кілт-мән құрылымы ретінде оқылады, әрбір жұп жеке жол болып табылады. Сондықтан мен осы айнымалылармен келдім:
  • bot.username ;
  • bot.token .
Ол келесідей болады: «А-дан Я-ға Java жобасы»: жобаға телеграмма ботын қосу – 9SpringBoot-та тамаша annotation бар - @Value. Егер дұрыс пайдаланылса, ол application.properties файлынан мәндерді шығарады. Біз жобаны осымен жаңартамыз:
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;
   }
}
Аннотацияға айнымалының мәнін бергенімізді көруге болады. SpringBoot біздің бот нысанын жасағанда, мәндер сипаттардан алынады (тағы да ағылшын тілінен алынған калька - қасиеттер). Біз жақындап қалдық. Сіз ботқа бір нәрсеге жауап беруіңіз керек. Сондықтан onUpdateReceived әдісін жаңартайық . Біз ботқа келген хабарды шығарып, оны кері жіберуіміз керек. Осылайша біз бот жұмыс істеп тұрғанын білеміз. Мұны істеу үшін біз қажет нәрсені шамамен және жылдам жазамыз:
@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();
       }
   }
}
Мұнда бәрі өте қарапайым: біз хабардың шынымен бар-жоғын тексереміз, сондықтан хабардың өзін ( хабарлама ) және хат алмасу болып жатқан чат идентификаторын ( chatId ) шығарамыз . Әрі қарай, біз хабарлама жіберуге арналған нысанды жасаймыз SendMessage , хабарламаның өзін және оған чат идентификаторын жібереміз - яғни ботқа не жіберу керек және қайда. Бізде бұл жеткілікті. Әрі қарай, біз JavarushTelegramBotApplication класында негізгі әдісті іске қосамыз және Telegram-да өз ботымызды іздейміз: «Java жобасы А-дан Я-ға»: жобаға телеграмма ботын қосу – 10Журналдардан біз боттың іске қосылғанын көреміз. Сонымен, Telegram-ға өтіп, ботқа жазу уақыты келді: «А-дан Я-ға Java жобасы»: жобаға телеграмма ботын қосу – 11Біз «Бастау» түймесін басамыз және біз бірден жауап аламыз: «Java жобасы А-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 12Тексеру үшін тағы бір күлкілі жазамыз: «Java жобасы А-дан Я-ға»: жобаға телеграмма ботын қосу – 13Міне, осы сәтте біз JRTB-2 тапсырмамыз орындалды деп айта аламыз. . Сіз мұнда әлі ешқандай сынақ жаза алмайсыз, сондықтан біз бәрін сол күйінде қалдырамыз. Әрі қарай сізге жаңа міндеттеме жасау керек: «Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 14міндеттеменің атына назар аударыңыз: тағы да назарыңызды осыған аударамын. Тапсырма алдымен тапсырманың атауын, содан кейін орындалған әрекеттің егжей-тегжейлі сипаттамасын қамтиды. Орындау және итеру... түймешігін басыңыз және қайтадан Push түймесін басу арқылы растаңыз : Біздің жобаға«Java жобасы А-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 15 өтіңіз . Бұрынғыдай, GitHub жаңа фorалды көрді және негізгі үшін тарту сұрауын жасауды ұсынады. Біз қарсы емеспіз және оны жасамаймыз: Әдеттегідей, біз белгіні, жобаны таңдап, оны маған тағайындадық. Соңында Тарту сұрауын жасау түймешігін басыңыз. Құрылым аяқталғанша сәл күтейік - және міне, тарту сұрауы біріктіруге дайын:«А-дан Я-ға Java жобасы»: жобаға телеграмма ботын қосу – 16«Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 17

Нұсқа жасау

Мен қандай да бір түрде нұсқаны жасау керек дегенді жіберіп алдым. Ол үшін фorалымызға тағы біраз өзгерістер енгіземіз. Біз IDEA-ға ораламыз және жадтағы жоба нұсқасын қарастырамыз: «Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 18Нұсқа 0.0.1-SNAPSHOT . Бұл тапсырма нұсқасы. Және біз жобаның нұсқасын әрбір жаңа шешілген мәселемен жаңартудан бастаймыз. Біз MVP-ге жеткенше, нұсқа -SNAPSHOT жұрнағымен келеді. Нұсқалау схемасы қандай болады? XYZ-SNAPSHOT Мұнда:
  • X - негізгі нұсқаны жаңарту, көбінесе алдыңғы нұсқамен кері үйлесімділік мәселелерін қамтиды;
  • Y - өте үлкен емес өзгерістер, алдыңғы нұсқамен толық үйлесімді;
  • Z - біз тауып, жөндеген ақаулардың есептегіші.
Осыған сүйене отырып, бізде бірінші нұсқасы болады - 0.1.0-SNAPSHOT - яғни бізде әлі үлкен жаңартулар болған жоқ, барлығының аз ғана бөлігі және біз MVP-ге әлі жеткен жоқпыз, сондықтан -SNAPSHOT жұрнағы бар. . Мұны жадта өзгертейік: «А-дан Я-ға Java жобасы»: жобаға телеграмма ботын қосу – 19RELEASE_NOTES файлына өтіңіз, онда біз әрбір жаңа нұсқада жобаға енгізілген өзгерістерді сипаттайтын боламыз: «Java жобасы А-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 20Біздің бірінші жазбамыз. Енді әрбір келесі нұсқаны жаңарту кезінде біз дәл осы жерде не болғанын сипаттайтын боламыз. Біз бұл істі орындаймыз, сипаттаманы жазыңыз: JRTB-2: жобаның жаңартылған нұсқасы және RELEASE_NOTES ішіне қосылды Барлығы бұрынғыдай. Біз құрастырудың өтуін күтудеміз және өзгерістерімізді біріктіре аламыз. Тек мұнда сәл басқаша болады. Мен негізгі тармақтағы әрбір тапсырманың жеке міндет екеніне көз жеткізгім келеді, сондықтан біріктіру сұрауын итеру біз үшін жұмыс істемейді. Git-те git сквош опциясы бар, ол барлық міндеттемелерді біреуге жинайды және оларды біріктіреді. Біз бұл опцияны таңдаймыз: «Java жобасы А-дан Я-ға»: жобаға телеграмма ботын қосу – 21«Сквош және біріктіру» түймесін басыңыз және бізге хабарламаны өңдеу ұсынылады, ол соңында болады: «Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 22Өте ыңғайлы және ең бастысы, сұранысқа ие. Айтпақшы, мен bitbucket-те мұндай мүмкіндікті көрген жоқпын =/ Біріктіруді растаңыз. Жалғыз нәрсе - біздің тақтада тапсырма күйін Орындалды күйіне өзгерту, тарту сұрауына сілтеме бар түсініктеме жазу және оны жабу: «Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 23Біздің тақта енді келесідей көрінеді:«Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 24

Қорытынды

Бүгін біз кезең-кезеңімен телеграмма ботын жасап, оны SpringBoot жобамызға енгіздік. Бот жұмыс істейді және жауап береді. Біз бірден бот деректеріне сипаттар арқылы қол жеткіздік. Алдағы уақытта: біз үлкен жұмыс жасаймыз - JRTB-3 орындаймыз - жобамызға пәрмен үлгісін қосамыз. О, тағы бір нәрсе... Мен сізге жетонды пайдаланбау үшін жарияламаймын деп айттым. Бірақ мен мақаланы түн ортасына жақын және жұмыстан кейін жазып жатқандықтан, мен репозиторийге жарамды белгіні орналастырғаным белгілі болды және GitGuardian бұл туралы маған хатта айтты: «Java жобасы A-дан Я-ға дейін»: жобаға телеграмма ботын қосу – 25Бұл үшін оларға рахмет! Енді не істеу керек? Енді оны git ішінен жою мүмкін болмайды, өйткені мен бұл белгісіз жаңа міндеттеме жүктеп салсам да, ол бұрынғысынша қалады. Бірақ мен міндеттемені жойып, кері қайтарғым келмейді. Сондықтан мен барып, жоғарыда аталған BotFather белгісін өшірдім. Енді токен бар, бірақ ол енді жарамсыз. Мақаланы жарияламас бұрын оның барлық codeын көру үшін менің GitHub тіркелгіме жазылыңыз . Оқығандарыңызға рахмет, жақын арада кездескенше.

Сериядағы барлық материалдардың тізімі осы мақаланың басында.

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION