JavaRush /Блоги Java /Random-TG /Илова кардани боти телеграмма ба лоиҳа - "Лоиҳаи Java аз ...
Roman Beekeeper
Сатҳи

Илова кардани боти телеграмма ба лоиҳа - "Лоиҳаи Java аз A то Я"

Дар гурӯҳ нашр шудааст
Салом, дустони азизам. Бале, бале, маҳз дӯстон. Ман аллакай бо ин силсилаи мақолаҳо чунон ошно шудаам, ки он одамоне, ки мунтазам дар шарҳҳо миннатдории худро менависанд ва/ё нишон медиҳанд, ки маводро хондаву фаҳмидаанд, аллакай наздик шудаанд. Ману шумо аз хар ду тараф ба суи як максад пеш рафта истодаем. Шумо мехоҳед бифаҳмед, аммо ман мехоҳам шарҳ диҳам. Ва мо як ҳадафи ниҳоӣ дорем - аризаи хаттӣ, ки аз аввал то ба охир барои шумо фаҳмо аст. Шояд шумо дар бораи бисёре аз чизҳое, ки ман дар ин мақола тавсиф мекунам, аллакай шунидаед. Ман фикр намекунам, ки ба шумо ягон чизи нав ва ғайриоддӣ нагӯям (аммо дар доираи лоиҳа инро донистан/такрор кардан лозим аст). "Лоиҳаи Java аз A то Я": илова кардани боти телеграмма ба лоиҳа - 1Баҳор барои худам бот навиштам, аз ин рӯ, мо ба «намунаҳои» он такя мекунем.

Мо JRTB-2 менависем

Мо ҳамон чизеро, ки дар мақола бо вазифаи JRTB-0 карда будем, мекунем :
  1. Мо фorали асосиро дар лоиҳаи маҳаллӣ бо истифода аз комбинатсияи ctrl + t навсозӣ мекунем ."Лоиҳаи Java аз A то Я": илова кардани боти телеграмма ба лоиҳа - 2
  2. Дар асоси шохаи асосӣ, мо эҷод мекунем:"Лоиҳаи Java аз A то Я": илова кардани боти телеграмма ба лоиҳа - 3
  3. Бот илова кунед.
  4. Мо як ӯҳдадории навро бо тавсифи корҳое, ки анҷом дода шудааст, эҷод мекунем ва онро ба GitHub тела медиҳем.
  5. Барои фorали асосӣ дархости кашидан эҷод кунед ва онро бори дигар тафтиш кунед. Мо мунтазири он ҳастем, ки сохтмон гузарад (амалҳои github), онро ба шохаи асосӣ якҷоя кунед.
  6. Вазифаи мувофиқро пӯшед.

Боти телеграмма чист

Мо, таҳиягарон, метавонем кор бо боти телеграммаро чунин тасаввур кунем: мо барои кор бо онҳо муштарии онҳоро истифода мебарем. Мо барои кор китобхонаи тайёр дорем . Маҷмӯи амалҳо вуҷуд доранд, ки пас аз онҳо боти телеграмма медонад, ки он бо барномаи мо алоқаманд аст. Ва аллакай дар дохor барнома мо чӣ гуна қабул кардани ҳарфҳо, фармонҳоро меомӯзем ва бо кадом роҳ онҳоро коркард мекунем. Дар ботҳои телеграм чунин фармон вуҷуд дорад : он бо слэш "/" оғоз мешавад. Пас аз он мо фавран калимаро якҷоя менависем ва ин фармон ҳисобида мешавад. Масалан, ду фармоне ҳаст, ки ҳама бояд донанд:
  • /start — оғоз кардани кор бо бот;
  • /сто - анҷом додани кор бо бот.
Боқимондаашро худамон мекунем. Иҷозат диҳед фавран қайд кунам: мо он чизеро, ки ман омӯхтам, маҳз иҷро хоҳем кард. Ва ҳангоми кор бо бот, ман боварӣ дорам, ки беҳтар кор кардан мумкин аст. Ва агар касе ин корро кунад, ман танҳо хурсанд мешавам ва ин кӯшишро ҳамаҷониба дастгирӣ мекунам. Дар омади гап, аввалин чизе, ки аҷиб хоҳад буд, он аст, ки касе ба ман фаҳмонад, ки чӣ гуна тавсифи фармонҳоро тавассути code барномарезӣ кунам, на тавассути танзимоти бот дар телеграмма. Ман инро нафаҳмидам. Мо дар манбаи худ якчанд мақолаҳо дорем, ки чӣ гуна сохтани боти асосиро тавсиф мекунанд: имрӯз мо як чизи ба ин монандро иҷро хоҳем кард. Агар шумо ягон саволи дигаре дошта бошед, ман тавсия медиҳам, ки ин мақоларо тафтиш кунед .

Бо BotFather бот эҷод кунед

Барои пайваст кардани бот, шумо аввал бояд онро эҷод кунед. Telegram як равиш дорад - сохтани бот бо номи беназири худ. Он инчунин бо нишона (сатри калоне, ки ба мисли парол кор мекунад) ҳамроҳ мешавад. Ман аллакай як бот барои JavaRush офаридаам - @javarush_community_bot . Ин бот ҳанӯз холӣ аст ва ҳеҷ кор карда наметавонад. Муҳим он аст, ки дар охири ном бояд _bot бошад . Барои нишон додани он, ки чӣ тавр ин корро кардан лозим аст, ман бот эҷод мекунам, ки дар он мо фаъолияти худро санҷида истодаем. Дар робита ба лоиҳаҳои воқеӣ, ин як муҳити санҷишӣ хоҳад буд. Ва чизи асосии мо муҳити истеҳсолӣ хоҳад буд (прод - истеҳсолот, яъне муҳити воқеӣ, ки дар он лоиҳа амалӣ карда мешавад). Албатта, метавон илова кардани муҳити дигар - муҳити қуттии қум: қуттии умумӣ, тағйирёбандатар ва барои ҳамаи иштирокчиёни рушд дастрас. Аммо ин вазъиятро дар марҳилаи эҷоди лоиҳа танҳо мушкилтар мекунад. Ҳоло, биёед ду боти дигарро барои озмоиш ва муҳити қумӣ эҷод кунем. Қадами аввал ин сохтани (қайд кардан) бот дар худи Telegram аст. Мо бояд ботро пайдо кунем: @BotFather ва ба он фармон нависед: /newbot"Лоиҳаи Java аз A то Я": илова кардани боти телеграмма ба лоиҳа - 4 Минбаъд аз мо хоҳиш карда мешавад, ки ба ин бот ном гузорем. Азбаски ин бот барои санҷиши вазифаҳо аст, номи он мувофиқ хоҳад буд: [TEST] JavarushBot"Лоиҳаи Java аз A то Я": илова кардани боти телеграмма ба лоиҳа - 5 Акнун вақти он расидааст, ки номи беназире диҳед, ки онро ҳамеша пайдо кардан мумкин аст - номи корбарии он: test_javarush_community"Лоиҳаи Java аз A то Я": илова кардани боти телеграмма ба лоиҳа - 6 Тавре ки ман дар боло гуфтам, шумо бояд _bot -ро илова кунед суффикс барои номи корбар, аз ин рӯ, мо боз менависем: test_javarush_community_bot"Лоиҳаи Java аз A то Я": илова кардани боти телеграмма ба лоиҳа - 7 Ва ҳамин тавр! Бот сохта шудааст. Акнун, бо истифода аз номи корбар ва нишона, он метавонад ба лоиҳаи мо пайваст карда шавад. Албатта, барои кори муътадor serverи тестӣ, ман токенро (аслан пароли дастрасӣ ба бот) ин ботро барои тамошои ҷамъиятӣ намоиш намедиҳам.

Мо ботро ба лоиҳа пайваст мекунем

Мо китобхонаро ба таври муқаррарӣ дохил намекунем, аммо фавран аз скелети худ - SpringBoot -ро истифода хоҳем бурд. Вай чунин чизе ба монанди Стартер дорад. Бо дохил кардани китобхона, мо метавонем онро истифода барем, то SpringBoot бидонад, ки мо мехоҳем лоиҳаро дуруст танзим кунем. Агар мо бо масири муқаррарӣ, ки дар бисёр ҷойҳо тавсиф шудааст, биравем, ба мо лозим меояд, ки дар ҷое конфигуратсияеро эҷод кунем, ки чунин чизе дошта бошад:
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
  telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
  e.printStackTrace();
}
Дар ин ҷо an objectе сохта шудааст, ки бо он шумо метавонед бо бот робита барқарор кунед. Дар ҳолати мо, стартере, ки мо мехоҳем пайваст кунем, ҳама чизро барои мо дар ҷое "дар зери кулоҳ" анҷом медиҳад (ин инчунин тарҷумаи ибораи зуд-зуд истифодашаванда дар IT аст - зери қафо). Ин аст пайванд ба ин оғозкунанда . Шумо метавонед фавран аз файли README.md бубинед, ки он чист, чаро ва чӣ тавр истифода бурдани он. Барои пайваст кардани он, шумо танҳо бояд ин вобастагиро ба хотира илова кунед. Ин ҳама :) Дар ин ҷо вобастагии зарурӣ аст:
<dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-spring-boot-starter</artifactId>
        <version>5.0.1</version>
    </dependency>
Мо онро ба хотираи худ илова мекунем. Мо versionро тавре ки интизор будем насб мекунем ва лоиҳаи Maven-ро навсозӣ мекунем. "Лоиҳаи Java аз А то Я": илова кардани боти телеграмма ба лоиҳа - 8Дар асоси тавсиф, мо бояд танҳо як синфи нав эҷод кунем, аз TelegramLongPollingBot мерос гирем ва ин синфро ба Контексти Аризаи SpringBoot-и мо илова кунем. Контексти барнома ҷойест, ки дар он an objectҳои сохташуда барои иҷрои лоиҳа нигоҳ дошта мешаванд. Барои илова кардани синф, шумо бояд яке аз эзоҳҳоро истифода баред: @Component, @Service, @Repository, @Controller. Ё шарҳи @Bean, агар тавассути усул дар синфи конфигуратсия сохта шавад (яъне дар синфе, ки бо шарҳи конфигуратсия қайд карда шудааст). Ман мефаҳмам, ки ҳамаи ин ҳоло ҳам нофаҳмо ба назар мерасад. Аммо вақте ки шумо ба фаҳмидани он шурӯъ мекунед, хоҳед дид, ки дар он ҷо ҳеҷ чизи мураккаб нест. Барои зуд фаҳмидани Boot Spring, ман як китоби ҷолибро тавсия медиҳам - Нашри 5-уми Spring In Action. Агар хохиш бошад, метавонам аз руи ин китоб як силсила маколахо нависам. Биёед баргардем. Дар бастае, ки 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 дорои тавзеҳи олӣ - @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 an objectи боти моро эҷод мекунад, арзишҳо аз хосиятҳо гирифта мешаванд (боз коғази пайгирӣ аз забони англисӣ - хосиятҳо). Мо қариб ҳастем. Шумо бояд бот ба чизе ҷавоб диҳед. Аз ин рӯ, биёед усули 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();
       }
   }
}
Дар ин ҷо ҳама чиз хеле содда аст: мо тафтиш мекунем, ки паём воқеан вуҷуд дорад, аз ин рӯ худи паём ( паём ) ва ID чат ( chatId ), ки дар он мукотиба сурат мегирад, хориҷ мекунем. Минбаъд, мо an objectеро барои фиристодани паём эҷод мекунем SendMessage , худи паём ва ID-и чат ба он интиқол медиҳем - яъне ба бот чӣ фиристодан ва дар куҷо. Мо аз ин аллакай кифоя дорем. Баъдан, мо усули асосиро дар синфи JavarushTelegramBotApplication иҷро мекунем ва боти худро дар Telegram ҷустуҷӯ мекунем: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 10Аз гузоришҳо мо мебинем, ки бот оғоз шудааст. Ҳамин тавр, вақти он расидааст, ки ба Telegram равед ва ба бот нависед: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 11Мо оғозро пахш мекунем ва мо дарҳол ҷавоб мегирем: "Лоиҳаи Java аз А то Я": илова кардани боти телеграмма ба лоиҳа - 12Биёед барои тафтиш боз як ғазаб нависем: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 13Ва ҳамин тавр, дар ин лаҳза мо метавонем бигӯем, ки вазифаи JRTB-2 ба анҷом расид. . Шумо ҳоло дар ин ҷо ягон санҷиш навишта наметавонед, аз ин рӯ мо ҳама чизро ҳамон тавре ки ҳаст, мегузорем. Минбаъд шумо бояд ӯҳдадории нав эҷод кунед: "Лоиҳаи Java аз А то Я": илова кардани боти телеграмма ба лоиҳа - 14Ба номи ӯҳдадорӣ диққат диҳед: боз ман таваҷҷӯҳи шуморо ба ин ҷалб мекунам. Уҳдадорӣ аввал номи вазифаро дар бар мегирад ва сипас тавсифи муфассали корҳои анҷомдодашударо дар бар мегирад. Тасдиқ ва тела... -ро клик кунед ва бо пахши дубора пахш кунед : Ба лоиҳаи мо«Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 15 равед . Мисли пештара, GitHub аллакай фorали навро дидааст ва пешниҳод мекунад, ки дархости ҷалб барои асосӣ эҷод кунад. Мо муқовимат намекунем ва онро эҷод мекунем: Чун маъмулӣ, мо аллакай нишона, лоиҳаро интихоб кардаем ва онро ба ман таъин кардем. Ниҳоят, Эҷоди дархости кашиданро клик кунед. Биёед каме интизор шавем, ки сохтмон ба охир мерасад - ва ин аст, дархости ҷалб барои муттаҳидшавӣ омода аст:«Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 16«Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 17

Версиясозӣ

Ман гӯё он нуктаро аз даст додам, ки мо бояд нусхабардорӣ кунем. Барои ин дар фorали худ боз чанд тагйирот ба амал меорем. Мо ба IDEA бармегардем ва versionи лоиҳаро дар хотира мебинем: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 18Версия 0.0.1-SNAPSHOT аст . Ин versionи вазифавӣ аст. Ва мо бо навсозии versionи лоиҳа бо ҳар як мушкилоти нави ҳалшуда оғоз хоҳем кард. То он даме, ки мо ба MVP расем, version бо суффикси -SNAPSHOT меояд. Схемаи version чӣ гуна хоҳад буд? XYZ-SNAPSHOT Дар куҷо:
  • X - навсозии versionи асосӣ, аксар вақт дорои мушкилоти мутобиқати ақиб бо versionи қаблӣ;
  • Y - тағироти хеле калон нест, комилан бо versionи қаблӣ мувофиқ аст;
  • Z як ҳисобкунаки камбудиҳост, ки мо ошкор ва ислоҳ кардем.
Дар асоси ин, мо versionи аввалро дорем - 0.1.0-SNAPSHOT - яъне мо то ҳол навсозиҳои асосӣ нагирифтаем, танҳо як каме аз ҳама чиз ва мо ҳанӯз ба MVP нарасидем, бинобар ин суффикси -SNAPSHOT мавҷуд аст. . Биёед инро дар хотира тағир диҳем: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 19Ба файли RELEASE_NOTES гузаред, ки дар он мо тағиротро дар лоиҳа бо ҳар як versionи нав тавсиф мекунем: «Лоихаи Java аз А то Я»: илова кардани боти телеграмма ба лоиха — 20Аввалин сабти мо. Ҳоло, бо ҳар як навсозии versionи минбаъда, мо дар ин ҷо чӣ воқеа рӯй дод, тасвир хоҳем кард. Мо ин парвандаро иҷро мекунем, тавсиф нависед: JRTB-2: versionи навшудаи лоиҳа ва илова ба RELEASE_NOTES Ҳама чиз айнан ҳамон тавре ки пештара аст. Мо интизори гузаштани сохтмон ҳастем ва мо метавонем тағиротҳои худро якҷоя кунем. Танҳо дар ин ҷо он каме фарқ хоҳад кард. Ман мехоҳам боварӣ ҳосил кунам, ки ҳар як вазифа дар шохаи асосӣ ӯҳдадории алоҳида аст, аз ин рӯ танҳо пахш кардани дархости якҷоякунӣ барои мо кор намекунад. Git дорои варианти git squash мебошад, ки ҳамаи ӯҳдадориҳоро ба як ҷамъ мекунад ва онҳоро муттаҳид мекунад. Мо ин хосиятро интихоб мекунем: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 21Сквош ва Якҷояро клик кунед ва ба мо пешниҳод карда мешавад, ки паёмро таҳрир кунем, ки дар ниҳоят хоҳад буд: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 22Хеле қулай ва муҳимтар аз ҳама он чизест, ки талабот аст. Дар омади гап, ман чунин хусусиятро дар bitbucket надидаам =/ Якҷояро тасдиқ кунед. Ягона чизе, ки боқӣ мондааст, тағир додани ҳолати вазифа ба Иҷрошуда дар тахтаи мо, шарҳи худро бо истинод ба дархости кашидан нависед ва онро пӯшед: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 23Шӯрои мо ҳоло чунин менамояд:"Лоиҳаи Java аз А то Я": илова кардани боти телеграмма ба лоиҳа - 24

Хулоса

Имрӯз мо қадам ба қадам як боти телеграммро эҷод кардем ва онро дар лоиҳаи SpringBoot-и худ татбиқ кардем. Бот кор мекунад ва ҷавоб медиҳад. Мо фавран ба маълумоти бот тавассути моликият дастрасӣ пайдо кардем. Бештар дар оянда: мо як порчаи калон хоҳем кард - JRTB-3 -ро иҷро мекунем - илова кардани намунаи фармон барои лоиҳаи мо. Оҳ, боз як чиз... Ман ба шумо гуфтам, ки токенро нашр намекунам, то он истифода нашавад. Аммо азбаски ман мақоларо наздиктар ба нисфи шаб ва пас аз кор менависам, маълум шуд, ки ман дар анбор як аломати дуруст ҷойгир кардаам ва GitGuardian дар ин бора ба ман дар як нома гуфт: «Лоиҳаи Java аз А то Я»: илова кардани боти телеграмма ба лоиҳа - 25Ташаккур ба онҳо барои ин! Ҳоло чӣ бояд кард? Онро аз git дигар нест кардан ғайриимкон хоҳад буд, зеро ҳатто агар ман бе ин нишона ӯҳдадории нав бор кунам, он дар кӯҳна боқӣ мемонад. Аммо ман намехоҳам, ки ӯҳдадориро нест кунам ва баргардонам. Ҳамин тавр, ман рафта, нишонаро аз BotFather зикршуда ғайрифаъол кардам. Ҳоло нишона вуҷуд дорад, аммо он дигар эътибор надорад. Ба ҳисоби GitHub-и ман обуна шавед , то ҳама рамзи онро пеш аз нашри мақола бубинед. Ташаккур ба ҳама барои хондан, ба зудӣ вохӯред.

Рӯйхати ҳамаи маводҳои силсила дар аввали ин мақола аст.

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION