Саламатсыздарбы, кымбаттуу досторум. Ооба, ооба, так достор. Мен макалалардын бул сериясы менен ушунчалык жакшы тааныш болуп калдым, ошондуктан комментарийлерде дайыма ыраазычылыктарын жазган жана/же материалды окуп, түшүнгөндүгүн көрсөткөн адамдар жакындашып калышкан. Сиз экөөбүз бир максатты көздөй эки багытта бара жатабыз. Сиз түшүнгүңүз келет, бирок мен түшүндүргүм келет. Жана бизде бир эле акыркы максат бар - башынан аягына чейин сизге түшүнүктүү болгон жазуу жүзүндөгү арыз. Бул макалада мен сүрөттөп бере турган нерселердин көбү жөнүндө мурунтан эле уккандырсыз. Мен сизге жаңы жана өзгөчө эч нерсе айтам деп ойлобойм (бирок долбоордун алкагында муну билүү/кайталоо керек). Жазында мен өзүм үчүн бот жаздым, андыктан анын “үлгүлөрүнө” таянабыз.
Биз JRTB-2 деп жазабыз
JRTB-0 тапшырмасы менен макаладагыдай кылабыз :- Биз ctrl + t айкалышы аркылуу жергorктүү долбоордогу негизги бутакты жаңыртабыз .
- Негизги бутагынын негизинде биз түзөбүз:
- Бот кошуңуз.
- Биз жасалган иштердин сүрөттөлүшү менен жаңы милдеттенме түзүп, аны GitHub'ка түртөбүз.
- Негизги бутак үчүн тартуу өтүнүчүн түзүп, аны кайра текшериңиз. Биз курулуштун өтүшүн күтүп жатабыз (github аракеттери), аны негизги бутакка бириктириңиз.
- Тиешелүү тапшырманы жабыңыз.
Телеграмма боту деген эмне
Биз, иштеп чыгуучулар, телеграмма бот менен иштөөнү элестете алабыз: биз алар менен иштөө үчүн алардын кардарын колдонобуз. Бизде жумушка даяр китепкана бар. Бир катар аракеттер бар, андан кийин телеграмма боту анын биздин программа менен байланышканын билет. Ал эми программанын ичинде биз каттарды, буйруктарды кабыл алууну жана кандайдыр бир жол менен аларды иштетүүнү үйрөнөбүз. Телеграмма ботторунда буйрук сыяктуу нерсе бар : ал слэш "/" менен башталат. Андан кийин сөздү дароо чогуу жазабыз, бул буйрук катары каралат. Мисалы, ар бир адам бorши керек болгон эки буйрук бар:- /start — бот менен иштөөнү баштоо;
- /стоп - бот менен ишти бүтүрүү.
BotFather менен бот түзүңүз
Ботту туташтыруу үчүн алгач аны түзүшүңүз керек. Telegram ыкмасы бар - өзүнүн уникалдуу аты менен бот түзүү. Ал ошондой эле токен (пароль сыяктуу иштеген чоң сап) менен коштолот. Мен буга чейин JavaRush үчүн бот түзгөм - @javarush_community_bot . Бул бот дагы эле бош жана эч нерсе кыла алbyte. Эң негизгиси, аттын аягында _бот болушу керек . Муну кантип жасоо керектигин көрсөтүү үчүн мен бот түзөм, анда биз функциябызды сынайбыз. Чыныгы долбоорлор боюнча, бул сыноо чөйрөсү болмок. Ал эми биздин эң негизгиси өндүрүш чөйрөсү болот (продукция - өндүрүш, башкача айтканда, долбоор ишке ашырыла турган реалдуу чөйрө). Албетте, дагы бир чөйрөнү кошууга болот эле - кум чөйрө чөйрөсү: жалпы кум чөйрөсү, кыйла өзгөрүлмө жана өнүгүүнүн бардык катышуучулары үчүн жеткorктүү. Бирок бул долбоорду түзүү стадиясында кырдаалды татаалдантат. Азырынча, келгиле, сыноо жана кумкоргон чөйрөсү үчүн дагы эки бот түзөлү. Биринчи кадам - Telegramдын өзүндө бот түзүү (каттоо). Биз ботту табышыбыз керек: @BotFather жана ага буйрук жазыңыз: /newbot Андан кийин бизден бул ботко ат берүү суралат. Бул сыноо тапшырмалары үчүн бот болгондуктан, анын аты ылайыктуу болот: [TEST] JavarushBot Эми аны ар дайым табууга боло турган уникалдуу ат берүүгө убакыт келди - анын колдонуучу аты: test_javarush_community Мен жогоруда айткандай, сиз _bot кошушуңуз керек. колдонуучунун аты үчүн суффикс, ошондуктан биз дагы жазабыз: test_javarush_community_bot Мына ушундай! Бот түзүлдү. Эми, колдонуучунун атын жана энбелгисин колдонуп, ал биздин долбоорго туташса болот. Албетте, сыноо 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 долбоорун жаңыртабыз. Сүрөттөмөнүн негизинде биз жөн гана жаңы класс түзүп, 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() - жана бул, демек, бот белгиси.
- bot.username ;
- bot.token .
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дан биздин ботту издейбиз: Журналдардан биз бот башталганын көрөбүз. Ошентип, Telegramга барып, ботко жазууга убакыт келди: Биз баштоону чыкылдатып, биз дароо жооп алабыз: Келгиле, текшерүү үчүн дагы бир жаман сөз жазалы: Мына ушул жерде, биз JRTB-2 тапшырмабыз аткарылды деп айта алабыз. . Азырынча бул жерге эч кандай тест жаза албайсыз, андыктан баарын ошол бойдон калтырабыз. Андан кийин жаңы милдеттенме түзүшүңүз керек: Коммиттин атына көңүл буруңуз: дагы бир жолу көңүлүңүздү ушуга бурам. Милдетте адегенде тапшырманын аталышы, андан кийин аткарылган иштердин кеңири сүрөттөлүшү камтылган. Commit and Push... баскычын чыкылдатыңыз жана дагы бир жолу басуу менен ырастаңыз : Биздин долбоорго өтүңүз . Мурдагыдай эле, GitHub жаңы бутагын көрдү жана негизги үчүн тартуу өтүнүчүн түзүүнү сунуш кылат. Биз каршылык көрсөтпөйбүз жана аны түзбөйбүз: Адаттагыдай эле, биз энбелги, долбоорду тандап алганбыз жана аны мага тапшырдык. Акырында, тартуу өтүнүчүн түзүү чыкылдатыңыз. Куруу аяктаганга чейин бир аз күтөлү - жана бүттү, тартуу өтүнүчү бириктирүүгө даяр:
Версиялоо
Мен эмнегедир versionны жасашыбыз керек деген ойду сагындым. Бул үчүн фorалыбызга дагы бир нече өзгөртүүлөрдү киргизебиз. Биз кайра IDEAга барып, эс тутумдагы долбоордун versionсын карайбыз: Версия 0.0.1-SNAPSHOT . Бул милдет versionсы. Жана биз ар бир жаңы чечилген көйгөй менен долбоордун versionсын жаңылоо менен баштайбыз. Биз MVP жеткенге чейин, version -SNAPSHOT суффикси менен келет. Версиялоо схемасы кандай болот? XYZ-SNAPSHOT Бул жерде:- X - негизги versionны жаңыртуу, көбүнчө мурунку version менен артка шайкеш келүү көйгөйлөрүн камтыйт;
- Y - өтө чоң эмес өзгөрүүлөр, мурунку version менен толук шайкеш келет;
- Z - биз таап, оңдогон кемчorктерди эсептегич.
GO TO FULL VERSION