Салом, дустони азизам. Бале, бале, маҳз дӯстон. Ман аллакай бо ин силсилаи мақолаҳо чунон ошно шудаам, ки он одамоне, ки мунтазам дар шарҳҳо миннатдории худро менависанд ва/ё нишон медиҳанд, ки маводро хондаву фаҳмидаанд, аллакай наздик шудаанд. Ману шумо аз хар ду тараф ба суи як максад пеш рафта истодаем. Шумо мехоҳед бифаҳмед, аммо ман мехоҳам шарҳ диҳам. Ва мо як ҳадафи ниҳоӣ дорем - аризаи хаттӣ, ки аз аввал то ба охир барои шумо фаҳмо аст. Шояд шумо дар бораи бисёре аз чизҳое, ки ман дар ин мақола тавсиф мекунам, аллакай шунидаед. Ман фикр намекунам, ки ба шумо ягон чизи нав ва ғайриоддӣ нагӯям (аммо дар доираи лоиҳа инро донистан/такрор кардан лозим аст). Баҳор барои худам бот навиштам, аз ин рӯ, мо ба «намунаҳои» он такя мекунем.
Мо JRTB-2 менависем
Мо ҳамон чизеро, ки дар мақола бо вазифаи JRTB-0 карда будем, мекунем :- Мо фorали асосиро дар лоиҳаи маҳаллӣ бо истифода аз комбинатсияи ctrl + t навсозӣ мекунем .
- Дар асоси шохаи асосӣ, мо эҷод мекунем:
- Бот илова кунед.
- Мо як ӯҳдадории навро бо тавсифи корҳое, ки анҷом дода шудааст, эҷод мекунем ва онро ба GitHub тела медиҳем.
- Барои фorали асосӣ дархости кашидан эҷод кунед ва онро бори дигар тафтиш кунед. Мо мунтазири он ҳастем, ки сохтмон гузарад (амалҳои github), онро ба шохаи асосӣ якҷоя кунед.
- Вазифаи мувофиқро пӯшед.
Боти телеграмма чист
Мо, таҳиягарон, метавонем кор бо боти телеграммаро чунин тасаввур кунем: мо барои кор бо онҳо муштарии онҳоро истифода мебарем. Мо барои кор китобхонаи тайёр дорем . Маҷмӯи амалҳо вуҷуд доранд, ки пас аз онҳо боти телеграмма медонад, ки он бо барномаи мо алоқаманд аст. Ва аллакай дар дохor барнома мо чӣ гуна қабул кардани ҳарфҳо, фармонҳоро меомӯзем ва бо кадом роҳ онҳоро коркард мекунем. Дар ботҳои телеграм чунин фармон вуҷуд дорад : он бо слэш "/" оғоз мешавад. Пас аз он мо фавран калимаро якҷоя менависем ва ин фармон ҳисобида мешавад. Масалан, ду фармоне ҳаст, ки ҳама бояд донанд:- /start — оғоз кардани кор бо бот;
- /сто - анҷом додани кор бо бот.
Бо BotFather бот эҷод кунед
Барои пайваст кардани бот, шумо аввал бояд онро эҷод кунед. Telegram як равиш дорад - сохтани бот бо номи беназири худ. Он инчунин бо нишона (сатри калоне, ки ба мисли парол кор мекунад) ҳамроҳ мешавад. Ман аллакай як бот барои JavaRush офаридаам - @javarush_community_bot . Ин бот ҳанӯз холӣ аст ва ҳеҷ кор карда наметавонад. Муҳим он аст, ки дар охири ном бояд _bot бошад . Барои нишон додани он, ки чӣ тавр ин корро кардан лозим аст, ман бот эҷод мекунам, ки дар он мо фаъолияти худро санҷида истодаем. Дар робита ба лоиҳаҳои воқеӣ, ин як муҳити санҷишӣ хоҳад буд. Ва чизи асосии мо муҳити истеҳсолӣ хоҳад буд (прод - истеҳсолот, яъне муҳити воқеӣ, ки дар он лоиҳа амалӣ карда мешавад). Албатта, метавон илова кардани муҳити дигар - муҳити қуттии қум: қуттии умумӣ, тағйирёбандатар ва барои ҳамаи иштирокчиёни рушд дастрас. Аммо ин вазъиятро дар марҳилаи эҷоди лоиҳа танҳо мушкилтар мекунад. Ҳоло, биёед ду боти дигарро барои озмоиш ва муҳити қумӣ эҷод кунем. Қадами аввал ин сохтани (қайд кардан) бот дар худи Telegram аст. Мо бояд ботро пайдо кунем: @BotFather ва ба он фармон нависед: /newbot Минбаъд аз мо хоҳиш карда мешавад, ки ба ин бот ном гузорем. Азбаски ин бот барои санҷиши вазифаҳо аст, номи он мувофиқ хоҳад буд: [TEST] JavarushBot Акнун вақти он расидааст, ки номи беназире диҳед, ки онро ҳамеша пайдо кардан мумкин аст - номи корбарии он: test_javarush_community Тавре ки ман дар боло гуфтам, шумо бояд _bot -ро илова кунед суффикс барои номи корбар, аз ин рӯ, мо боз менависем: test_javarush_community_bot Ва ҳамин тавр! Бот сохта шудааст. Акнун, бо истифода аз номи корбар ва нишона, он метавонад ба лоиҳаи мо пайваст карда шавад. Албатта, барои кори муътад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-ро навсозӣ мекунем. Дар асоси тавсиф, мо бояд танҳо як синфи нав эҷод кунем, аз 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() - ва ин, мувофиқан, аломати бот аст.
- 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 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 ҷустуҷӯ мекунем: Аз гузоришҳо мо мебинем, ки бот оғоз шудааст. Ҳамин тавр, вақти он расидааст, ки ба Telegram равед ва ба бот нависед: Мо оғозро пахш мекунем ва мо дарҳол ҷавоб мегирем: Биёед барои тафтиш боз як ғазаб нависем: Ва ҳамин тавр, дар ин лаҳза мо метавонем бигӯем, ки вазифаи JRTB-2 ба анҷом расид. . Шумо ҳоло дар ин ҷо ягон санҷиш навишта наметавонед, аз ин рӯ мо ҳама чизро ҳамон тавре ки ҳаст, мегузорем. Минбаъд шумо бояд ӯҳдадории нав эҷод кунед: Ба номи ӯҳдадорӣ диққат диҳед: боз ман таваҷҷӯҳи шуморо ба ин ҷалб мекунам. Уҳдадорӣ аввал номи вазифаро дар бар мегирад ва сипас тавсифи муфассали корҳои анҷомдодашударо дар бар мегирад. Тасдиқ ва тела... -ро клик кунед ва бо пахши дубора пахш кунед : Ба лоиҳаи мо равед . Мисли пештара, GitHub аллакай фorали навро дидааст ва пешниҳод мекунад, ки дархости ҷалб барои асосӣ эҷод кунад. Мо муқовимат намекунем ва онро эҷод мекунем: Чун маъмулӣ, мо аллакай нишона, лоиҳаро интихоб кардаем ва онро ба ман таъин кардем. Ниҳоят, Эҷоди дархости кашиданро клик кунед. Биёед каме интизор шавем, ки сохтмон ба охир мерасад - ва ин аст, дархости ҷалб барои муттаҳидшавӣ омода аст:
Версиясозӣ
Ман гӯё он нуктаро аз даст додам, ки мо бояд нусхабардорӣ кунем. Барои ин дар фorали худ боз чанд тагйирот ба амал меорем. Мо ба IDEA бармегардем ва versionи лоиҳаро дар хотира мебинем: Версия 0.0.1-SNAPSHOT аст . Ин versionи вазифавӣ аст. Ва мо бо навсозии versionи лоиҳа бо ҳар як мушкилоти нави ҳалшуда оғоз хоҳем кард. То он даме, ки мо ба MVP расем, version бо суффикси -SNAPSHOT меояд. Схемаи version чӣ гуна хоҳад буд? XYZ-SNAPSHOT Дар куҷо:- X - навсозии versionи асосӣ, аксар вақт дорои мушкилоти мутобиқати ақиб бо versionи қаблӣ;
- Y - тағироти хеле калон нест, комилан бо versionи қаблӣ мувофиқ аст;
- Z як ҳисобкунаки камбудиҳост, ки мо ошкор ва ислоҳ кардем.
GO TO FULL VERSION