Сәлем, қымбатты достарым. Иә, иә, дәл достар. Маған осы мақалалар топтамасы бұрыннан таныс болғаны сонша, түсініктемелерде үнемі алғыс білдіретін және/немесе материалды оқып, түсінгенін көрсететін адамдар жақындап қалған. Сіз бен біз екі жақтан бір мақсатқа қарай жылжып келеміз. Сіз түсінгіңіз келеді, бірақ мен түсіндіргім келеді. Ал біздің түпкі мақсатымыз бір – сізге басынан аяғына дейін түсінікті жазбаша өтініш. Сіз осы мақалада сипаттайтын нәрселердің көпшілігі туралы естіген шығарсыз. Мен сізге жаңа және ерекше ештеңе айтамын деп ойламаймын (бірақ жоба аясында мұны білу/қайталау қажет). Көктемде мен өзім үшін бот жаздым, сондықтан біз оның «үлгілеріне» сенетін боламыз.
Біз JRTB-2 жазамыз
Біз JRTB-0 тапсырмасымен мақалада жасағандай жасаймыз :- Біз ctrl + t тіркесімін пайдаланып жергілікті жобадағы негізгі тармақты жаңартамыз .
- Негізгі тармаққа сүйене отырып, біз жасаймыз:
- Бот қосыңыз.
- Біз орындалған әрекеттердің сипаттамасы бар жаңа міндеттеме жасаймыз және оны GitHub-қа жібереміз.
- Негізгі фorал үшін тарту сұрауын жасаңыз және оны қайта тексеріңіз. Біз құрастырудың өтуін күтеміз (github әрекеттері), оны негізгі тармаққа біріктіріңіз.
- Сәйкес тапсырманы жабыңыз.
Telegram боты дегеніміз не
Біз, әзірлеушілер, телеграмма ботымен жұмыс істеуді елестете аламыз: біз олармен жұмыс істеу үшін олардың клиентін пайдаланамыз. Бізде жұмысқа дайын кітапхана бар. Әрекеттер жиынтығы бар, содан кейін телеграмма боты оның біздің бағдарламамен байланысты екенін біледі. Бағдарламаның ішінде біз хаттарды, командаларды қабылдауды және оларды қандай да бір жолмен өңдеуді үйренеміз. Telegram боттарында пәрмен сияқты нәрсе бар : ол «/» қиғаш сызықтан басталады. Одан кейін сөзді бірден бірге жазамыз, бұл бұйрық болып саналады. Мысалы, барлығы білуі керек екі команда бар:- /start — ботпен жұмысты бастау;
- /stop - ботпен жұмысты аяқтау.
BotFather көмегімен бот жасаңыз
Ботты қосу үшін алдымен оны жасау керек. Telegram тәсілі бар - өзіндік бірегей аты бар бот жасау. Ол сонымен қатар таңбалауышпен (пароль сияқты жұмыс істейтін үлкен жол) сүйемелденеді. Мен JavaRush үшін бот жасадым - @javarush_community_bot . Бұл бот әлі бос және ештеңе істей алмайды. Ең бастысы, атау соңында _bot болуы керек . Мұны қалай жасау керектігін көрсету үшін мен функционалдылықты тексеретін бот жасаймын. Нақты жобаларға келетін болсақ, бұл сынақ ортасы болар еді. Ал біздің ең бастысы өнім ортасы (өнім – өндіріс, яғни жоба жүзеге асырылатын нақты орта) болады. Әрине, басқа ортаны – құм жәшігінің ортасын қосуға болады: жалпы құм жәшігі, анағұрлым өзгермелі және әзірлеудің барлық қатысушылары үшін қолжетімді. Бірақ бұл жобаны құру кезеңінде жағдайды қиындатады. Әзірге сынақ және құм жәшігіне арналған тағы екі бот жасайық. Бірінші қадам - 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();
}
Мұнда ботпен байланыс орнатуға болатын нысан жасалады. Біздің жағдайда, біз қосқымыз келетін стартер біз үшін «қақпақтың астында» бәрін жасайды (бұл сонымен қатар IT-де жиі қолданылатын фразаның аудармасы - капюшон астында). Міне осы стартерге сілтеме . Сіз README.md файлынан оның не екенін, оны не үшін және қалай пайдалану керектігін бірден көре аласыз. Оны қосу үшін бұл тәуелділікті жадқа қосу жеткілікті. Барлығы осы :) Міне қажетті тәуелділік:
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-spring-boot-starter</artifactId>
<version>5.0.1</version>
</dependency>
Біз оны жадымызға қосамыз. Біз нұсқаны күткендей орнатамыз және Maven жобасын жаңартамыз. Сипаттамаға сүйене отырып, бізге жай ғана жаңа класс жасап, 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() - және бұл, тиісінше, бот белгісі.
- 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;
}
}
Аннотацияға айнымалының мәнін бергенімізді көруге болады. 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-да өз ботымызды іздейміз: Журналдардан біз боттың іске қосылғанын көреміз. Сонымен, Telegram-ға өтіп, ботқа жазу уақыты келді: Біз «Бастау» түймесін басамыз және біз бірден жауап аламыз: Тексеру үшін тағы бір күлкілі жазамыз: Міне, осы сәтте біз JRTB-2 тапсырмамыз орындалды деп айта аламыз. . Сіз мұнда әлі ешқандай сынақ жаза алмайсыз, сондықтан біз бәрін сол күйінде қалдырамыз. Әрі қарай сізге жаңа міндеттеме жасау керек: міндеттеменің атына назар аударыңыз: тағы да назарыңызды осыған аударамын. Тапсырма алдымен тапсырманың атауын, содан кейін орындалған әрекеттің егжей-тегжейлі сипаттамасын қамтиды. Орындау және итеру... түймешігін басыңыз және қайтадан Push түймесін басу арқылы растаңыз : Біздің жобаға өтіңіз . Бұрынғыдай, GitHub жаңа фorалды көрді және негізгі үшін тарту сұрауын жасауды ұсынады. Біз қарсы емеспіз және оны жасамаймыз: Әдеттегідей, біз белгіні, жобаны таңдап, оны маған тағайындадық. Соңында Тарту сұрауын жасау түймешігін басыңыз. Құрылым аяқталғанша сәл күтейік - және міне, тарту сұрауы біріктіруге дайын:
Нұсқа жасау
Мен қандай да бір түрде нұсқаны жасау керек дегенді жіберіп алдым. Ол үшін фorалымызға тағы біраз өзгерістер енгіземіз. Біз IDEA-ға ораламыз және жадтағы жоба нұсқасын қарастырамыз: Нұсқа 0.0.1-SNAPSHOT . Бұл тапсырма нұсқасы. Және біз жобаның нұсқасын әрбір жаңа шешілген мәселемен жаңартудан бастаймыз. Біз MVP-ге жеткенше, нұсқа -SNAPSHOT жұрнағымен келеді. Нұсқалау схемасы қандай болады? XYZ-SNAPSHOT Мұнда:- X - негізгі нұсқаны жаңарту, көбінесе алдыңғы нұсқамен кері үйлесімділік мәселелерін қамтиды;
- Y - өте үлкен емес өзгерістер, алдыңғы нұсқамен толық үйлесімді;
- Z - біз тауып, жөндеген ақаулардың есептегіші.
GO TO FULL VERSION