JavaRush /Java блогу /Random-KY /Долбоорго телеграмма ботун кошуу - "Java долбоору Адан Яг...
Roman Beekeeper
Деңгээл

Долбоорго телеграмма ботун кошуу - "Java долбоору Адан Яга"

Группада жарыяланган
Саламатсыздарбы, кымбаттуу досторум. Ооба, ооба, так достор. Мен макалалардын бул сериясы менен ушунчалык жакшы тааныш болуп калдым, ошондуктан комментарийлерде дайыма ыраазычылыктарын жазган жана/же материалды окуп, түшүнгөндүгүн көрсөткөн адамдар жакындашып калышкан. Сиз экөөбүз бир максатты көздөй эки багытта бара жатабыз. Сиз түшүнгүңүз келет, бирок мен түшүндүргүм келет. Жана бизде бир эле акыркы максат бар - башынан аягына чейин сизге түшүнүктүү болгон жазуу жүзүндөгү арыз. Бул макалада мен сүрөттөп бере турган нерселердин көбү жөнүндө мурунтан эле уккандырсыз. Мен сизге жаңы жана өзгөчө эч нерсе айтам деп ойлобойм (бирок долбоордун алкагында муну билүү/кайталоо керек). "Java долбоору Адан Яга чейин": долбоорго телеграмма ботун кошуу - 1Жазында мен өзүм үчүн бот жаздым, андыктан анын “үлгүлөрүнө” таянабыз.

Биз JRTB-2 деп жазабыз

JRTB-0 тапшырмасы менен макаладагыдай кылабыз :
  1. Биз ctrl + t айкалышы аркылуу жергorктүү долбоордогу негизги бутакты жаңыртабыз ."Java долбоору Адан Яга чейин": долбоорго телеграмма ботун кошуу - 2
  2. Негизги бутагынын негизинде биз түзөбүз:"Java долбоору Адан Яга чейин": долбоорго телеграмма ботун кошуу - 3
  3. Бот кошуңуз.
  4. Биз жасалган иштердин сүрөттөлүшү менен жаңы милдеттенме түзүп, аны GitHub'ка түртөбүз.
  5. Негизги бутак үчүн тартуу өтүнүчүн түзүп, аны кайра текшериңиз. Биз курулуштун өтүшүн күтүп жатабыз (github аракеттери), аны негизги бутакка бириктириңиз.
  6. Тиешелүү тапшырманы жабыңыз.

Телеграмма боту деген эмне

Биз, иштеп чыгуучулар, телеграмма бот менен иштөөнү элестете алабыз: биз алар менен иштөө үчүн алардын кардарын колдонобуз. Бизде жумушка даяр китепкана бар. Бир катар аракеттер бар, андан кийин телеграмма боту анын биздин программа менен байланышканын билет. Ал эми программанын ичинде биз каттарды, буйруктарды кабыл алууну жана кандайдыр бир жол менен аларды иштетүүнү үйрөнөбүз. Телеграмма ботторунда буйрук сыяктуу нерсе бар : ал слэш "/" менен башталат. Андан кийин сөздү дароо чогуу жазабыз, бул буйрук катары каралат. Мисалы, ар бир адам бorши керек болгон эки буйрук бар:
  • /start — бот менен иштөөнү баштоо;
  • /стоп - бот менен ишти бүтүрүү.
Калганын өзүбүз жасайбыз. Мага дароо ээлеп коюуга уруксат этиңиз: биз эмнени үйрөнсөм, ошону кылабыз. Ал эми бот менен иштегенде мындан да жакшыраак иш алып барууга болот деп ишенем. Ал эми кимдир бирөө ушуну кааласа, мен кубанам жана бул аракетти ар тараптан колдойм. Айтмакчы, кимдир бирөө мага телеграммадагы бот жөндөөлөрү аркылуу эмес, code аркылуу буйруктардын сүрөттөлүшүн кантип программалоону түшүндүрсө, эң сонун болмок. Мен муну үйрөнгөн жокмун. Биздин ресурсубузда негизги ботту кантип жасоону сүрөттөгөн бир нече макалалар бар: бүгүн биз ушуга окшош нерсени жасайбыз. Дагы суроолоруңуз болсо, мен бул макаланы карап чыгууну сунуштайм.

BotFather менен бот түзүңүз

Ботту туташтыруу үчүн алгач аны түзүшүңүз керек. Telegram ыкмасы бар - өзүнүн уникалдуу аты менен бот түзүү. Ал ошондой эле токен (пароль сыяктуу иштеген чоң сап) менен коштолот. Мен буга чейин JavaRush үчүн бот түзгөм - @javarush_community_bot . Бул бот дагы эле бош жана эч нерсе кыла алbyte. Эң негизгиси, аттын аягында _бот болушу керек . Муну кантип жасоо керектигин көрсөтүү үчүн мен бот түзөм, анда биз функциябызды сынайбыз. Чыныгы долбоорлор боюнча, бул сыноо чөйрөсү болмок. Ал эми биздин эң негизгиси өндүрүш чөйрөсү болот (продукция - өндүрүш, башкача айтканда, долбоор ишке ашырыла турган реалдуу чөйрө). Албетте, дагы бир чөйрөнү кошууга болот эле - кум чөйрө чөйрөсү: жалпы кум чөйрөсү, кыйла өзгөрүлмө жана өнүгүүнүн бардык катышуучулары үчүн жеткorктүү. Бирок бул долбоорду түзүү стадиясында кырдаалды татаалдантат. Азырынча, келгиле, сыноо жана кумкоргон чөйрөсү үчүн дагы эки бот түзөлү. Биринчи кадам - ​​Telegramдын өзүндө бот түзүү (каттоо). Биз ботту табышыбыз керек: @BotFather жана ага буйрук жазыңыз: /newbot«Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 4 Андан кийин бизден бул ботко ат берүү суралат. Бул сыноо тапшырмалары үчүн бот болгондуктан, анын аты ылайыктуу болот: [TEST] JavarushBot"Java долбоору Адан Яга чейин": долбоорго телеграмма ботун кошуу - 5 Эми аны ар дайым табууга боло турган уникалдуу ат берүүгө убакыт келди - анын колдонуучу аты: test_javarush_community"Java долбоору Адан Яга": долбоорго телеграмма ботун кошуу - 6 Мен жогоруда айткандай, сиз _bot кошушуңуз керек. колдонуучунун аты үчүн суффикс, ошондуктан биз дагы жазабыз: test_javarush_community_bot"Java долбоору Адан Яга чейин": долбоорго телеграмма ботун кошуу - 7 Мына ушундай! Бот түзүлдү. Эми, колдонуучунун атын жана энбелгисин колдонуп, ал биздин долбоорго туташса болот. Албетте, сыноо 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тер сакталган жер. Класс кошуу үчүн annotationлардын бирин колдонушуңуз керек: @Component, @Service, @Repository, @Controller. Же @Bean annotationсын конфигурация классындагы метод аркылуу түзүңүз (башкача айтканда, Конфигурация annotationсы менен белгиленген класста). Мунун баары дагы деле түшүнүксүз болуп көрүнүшү мүмкүн экенин түшүнөм. Бирок аны түшүнө баштаганда, ал жерде татаал эч нерсе жок экенин көрөсүз. Жазгы Бутту тез түшүнүү үчүн мен сонун китепти сунуштайм - Жазгы иш-аракет 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(Update update) - бул колдонуучулардан билдирүүлөр келе турган кирүү чекити. Бардык жаңы логика ушул жерден чыгат;
  • 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;
   }
}
Өзгөрмөнүн маанисин annotationга өткөрүп бергенибизди көрүүгө болот. Жана SpringBoot биздин бот an objectисин жаратканда, баалуулуктар касиеттерден алынат (кайра англис тorнен калька - касиеттери). Биз жакындап калдык. Сиз ботко бир нерсеге жооп беришиңиз керек. Ошондуктан, келгиле 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 , билдирүүнүн өзүн жана ага чат идентификаторун өткөрүп беребиз - башкача айтканда, ботко эмнени жана кайда жөнөтүү керек. Бизде буга чейин эле жетиштүү. Андан кийин, биз JavarushTelegramBotApplication классында негизги ыкманы иштетебиз жана Telegramдан биздин ботту издейбиз: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 10Журналдардан биз бот башталганын көрөбүз. Ошентип, Telegramга барып, ботко жазууга убакыт келди: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 11Биз баштоону чыкылдатып, биз дароо жооп алабыз: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 12Келгиле, текшерүү үчүн дагы бир жаман сөз жазалы: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 13Мына ушул жерде, биз JRTB-2 тапшырмабыз аткарылды деп айта алабыз. . Азырынча бул жерге эч кандай тест жаза албайсыз, андыктан баарын ошол бойдон калтырабыз. Андан кийин жаңы милдеттенме түзүшүңүз керек: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 14Коммиттин атына көңүл буруңуз: дагы бир жолу көңүлүңүздү ушуга бурам. Милдетте адегенде тапшырманын аталышы, андан кийин аткарылган иштердин кеңири сүрөттөлүшү камтылган. Commit and Push... баскычын чыкылдатыңыз жана дагы бир жолу басуу менен ырастаңыз : Биздин долбоорго«Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 15 өтүңүз . Мурдагыдай эле, GitHub жаңы бутагын көрдү жана негизги үчүн тартуу өтүнүчүн түзүүнү сунуш кылат. Биз каршылык көрсөтпөйбүз жана аны түзбөйбүз: Адаттагыдай эле, биз энбелги, долбоорду тандап алганбыз жана аны мага тапшырдык. Акырында, тартуу өтүнүчүн түзүү чыкылдатыңыз. Куруу аяктаганга чейин бир аз күтөлү - жана бүттү, тартуу өтүнүчү бириктирүүгө даяр:«Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 16«Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 17

Версиялоо

Мен эмнегедир versionны жасашыбыз керек деген ойду сагындым. Бул үчүн фorалыбызга дагы бир нече өзгөртүүлөрдү киргизебиз. Биз кайра IDEAга барып, эс тутумдагы долбоордун versionсын карайбыз: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 18Версия 0.0.1-SNAPSHOT . Бул милдет versionсы. Жана биз ар бир жаңы чечилген көйгөй менен долбоордун versionсын жаңылоо менен баштайбыз. Биз MVP жеткенге чейин, version -SNAPSHOT суффикси менен келет. Версиялоо схемасы кандай болот? XYZ-SNAPSHOT Бул жерде:
  • X - негизги versionны жаңыртуу, көбүнчө мурунку version менен артка шайкеш келүү көйгөйлөрүн камтыйт;
  • Y - өтө чоң эмес өзгөрүүлөр, мурунку version менен толук шайкеш келет;
  • Z - биз таап, оңдогон кемчorктерди эсептегич.
Мунун негизинде бизде биринчи version болот - 0.1.0-SNAPSHOT - башкача айтканда, бизде чоң жаңыртуулар боло элек, бардыгынын бир аз гана бөлүгү жана биз MVPге жете элекпиз, ошондуктан -SNAPSHOT суффикси бар. . Келгиле, муну эс тутумга өзгөртөлү: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 19RELEASE_NOTES файлына өтүңүз, анда биз ар бир жаңы version менен долбоорго болгон өзгөртүүлөрдү сүрөттөп беребиз: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 20Биздин биринчи жазуу. Эми, ар бир кийинки version жаңыртуу менен, биз бул жерде так эмне болгонун сүрөттөп беребиз. Биз бул ишти аткарабыз, сүрөттөмө жазыңыз: JRTB-2: долбоордун жаңыланган versionсы жана RELEASE_NOTESке кошулду Баары мурункудай эле. Биз куруунун өтүшүн күтүп жатабыз жана өзгөртүүлөрүбүздү бириктире алабыз. Бул жерде гана бир аз башкача болот. Мен негизги бутактагы ар бир тапшырма өзүнчө тапшырма экенине ынангым келет, андыктан Бириктирүү өтүнүчүн түртүп коюу биз үчүн иштебейт. Gitте гит сквош опциясы бар, ал бардык милдеттенмелерди бир жерге чогултуп, аларды бириктирет. Биз бул параметрди тандайбыз: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 21Сквош жана Бириктирүүнү чыкылдатыңыз жана бизге билдирүүнү түзөтүү сунушталат, ал акырында болот: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 22Абдан ыңгайлуу жана эң негизгиси, эмне талап кылынат. Баса, мен мындай функцияны битбукеттен көрө элекмин =/ Бириктирүүнү ырастаңыз. Жалгыз гана нерсе - тапшырманын статусун биздин тактада "Бүттү" деп өзгөртүп, тартуу өтүнүчүнө шилтеме менен комментарий жазып, аны жабуу керек: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 23Биздин такта азыр мындай көрүнөт:«Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 24

Корутунду

Бүгүн биз телеграмма ботун этап-этабы менен түздүк жана аны SpringBoot долбоорубузга киргиздик. Бот иштейт жана жооп берет. Биз дароо касиеттер аркылуу бот маалыматтарына кирүү мүмкүнчүлүгүн түздүк. Дагы алдыда: биз чоң иш жасайбыз - JRTB-3 аткарабыз - биздин долбоорго буйрук үлгүсүн кошобуз. О, дагы бир нерсе... Мен сизге токенди колдонбойм деп жарыялабайм деп айткам. Бирок мен макаланы түн ортосуна жакын жана жумуштан кийин жазып жаткандыктан, мен репозиторийге жарактуу белгини жайгаштырган экенмин жана GitGuardian бул тууралуу мага катында айтты: «Адан Яга Java долбоору»: долбоорго телеграмма ботун кошуу – 25Бул үчүн аларга рахмат! Эми эмне кылуу керек? Мындан ары аны гиттен жок кылуу мүмкүн болбой калат, анткени мен бул энбелгисиз жаңы милдеттенмени жүктөсөм дагы, ал эскисинде кала берет. Бирок мен милдеттенмени жок кылып, артка кайтаргым келбейт. Ошентип, мен барып, буга чейин айтылган BotFather токенин өчүрдүм. Азыр токен бар, бирок ал жараксыз. Макаланы жарыялоодон мурун анын бардык codeун көрүү үчүн менин GitHub аккаунтума жазылыңыз . Окуу үчүн рахмат, жакында көрүшкөнчө.

Сериядагы бардык материалдардын тизмеси ушул макаланын башында.

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION