Assalomu alaykum aziz do'stlarim. Ha, ha, aniq do'stlar. Men ushbu maqolalar turkumi bilan shunchalik tanish bo'ldimki, sharhlarda doimiy ravishda o'z minnatdorchiligini yozadigan va/yoki materialni o'qib, tushunganliklarini ko'rsatadigan odamlar allaqachon yaqinlashib qolishgan. Siz va men ikki tomondan bir maqsad sari intilyapmiz. Siz tushunmoqchisiz, lekin men tushuntirmoqchiman. Va bizda bir xil yakuniy maqsad bor - boshidan oxirigacha sizga tushunarli bo'lgan yozma ariza. Ushbu maqolada men tasvirlab beradigan ko'p narsalar haqida allaqachon eshitgan bo'lishingiz mumkin. Men sizga yangi va g'ayrioddiy biror narsa aytaman deb o'ylamayman (lekin loyiha doirasida buni bilish/takrorlash kerak). Bahorda men o'zim uchun bot yozdim, shuning uchun biz uning "naqshlari" ga tayanamiz.
Biz JRTB-2 yozamiz
JRTB-0 topshirig'i bilan maqolada bo'lgani kabi biz ham shunday qilamiz :- Mahalliy loyihadagi asosiy filialni ctrl + t kombinatsiyasidan foydalanib yangilaymiz .
- Asosiy filialga asoslanib, biz yaratamiz:
- Bot qo'shing.
- Biz bajarilgan ishlar tavsifi bilan yangi majburiyat yaratamiz va uni GitHub-ga suramiz.
- Asosiy filial uchun tortish so'rovini yarating va uni qayta tekshiring. Qurilish tugashini kutmoqdamiz (github harakatlari), uni asosiy filialga birlashtiramiz.
- Tegishli vazifani yoping.
Telegram bot nima
Biz, dasturchilar, telegram bot bilan ishlashni shunday tasavvur qilishimiz mumkin: biz ular bilan ishlash uchun ularning mijozidan foydalanamiz. Ish uchun tayyor kutubxonamiz bor . Bir qator harakatlar mavjud, shundan so'ng telegram bot bizning dasturimiz bilan bog'liqligini bilib oladi. Va allaqachon dastur ichida biz xatlarni, buyruqlarni qanday qabul qilishni va qandaydir tarzda ularni qayta ishlashni o'rganamiz. Telegram botlarida buyruq kabi narsa bor : u “/” slash bilan boshlanadi. Shundan so'ng, biz darhol so'zni birga yozamiz va bu buyruq hisoblanadi. Masalan, hamma bilishi kerak bo'lgan ikkita buyruq mavjud:- /start — bot bilan ishlashni boshlash;
- /stop - bot bilan ishlashni tugatish.
BotFather bilan bot yarating
Botni ulash uchun avval uni yaratishingiz kerak. Telegramda yondashuv mavjud - o'ziga xos nomga ega bot yaratish. Shuningdek, u token (parol kabi ishlaydigan katta qator) bilan birga bo'ladi. Men allaqachon JavaRush uchun bot yaratganman - @javarush_community_bot . Bu bot hali ham bo'sh va hech narsa qila olmaydi. Asosiysi, ismning oxirida _bot bo'lishi kerak . Buni qanday qilishni ko'rsatish uchun men o'z funksionalligimizni sinab ko'radigan bot yarataman. Haqiqiy loyihalar nuqtai nazaridan, bu sinov muhiti bo'ladi. Va bizning asosiy narsamiz ishlab chiqarish muhiti bo'ladi (mahsulot - ishlab chiqarish, ya'ni loyiha amalga oshiriladigan haqiqiy muhit). Albatta, boshqa muhitni qo'shish mumkin edi - qum qutisi muhiti: umumiy sinov muhiti, yanada o'zgaruvchan va barcha rivojlanish ishtirokchilari uchun ochiq. Ammo bu faqat loyihani yaratish bosqichida vaziyatni murakkablashtiradi. Hozircha sinov va sinov muhiti uchun yana ikkita bot yarataylik. Birinchi qadam – Telegram’ning o‘zida bot yaratish (ro‘yxatdan o‘tkazish). Biz botni topishimiz kerak: @BotFather va unga buyruq yozishimiz kerak: /newbot Keyin bizdan ushbu botga nom berish so'raladi. Bu test sinovlari uchun bot bo'lgani uchun uning nomi mos keladi: [TEST] JavarushBot Endi uni har doim topish mumkin bo'lgan noyob nom berish vaqti keldi - uning foydalanuvchi nomi: test_javarush_community Yuqorida aytganimdek, siz _botni qo'shishingiz kerak. foydalanuvchi nomi uchun qo'shimcha, shuning uchun biz yana yozamiz: test_javarush_community_bot Va hammasi! Bot yaratildi. Endi foydalanuvchi nomi va token yordamida uni loyihamizga ulash mumkin. Albatta, test serverining uzluksiz ishlashi uchun men ushbu botning tokenini (asosan botga kirish uchun parol) ommaviy ko'rish uchun ko'rsatmayman.Biz botni loyihaga ulaymiz
Biz odatdagidek kutubxonani qo'shmaymiz, lekin darhol bizning skeletimiz - SpringBoot-dan foydalanamiz. Unda Starter kabi bir narsa bor. Kutubxonani qo'shish orqali biz undan SpringBoot-ga loyihani to'g'ri sozlashni xohlayotganimizni bildirish uchun foydalanishimiz mumkin. Agar biz ko'p joylarda tasvirlangan odatiy yo'nalish bo'yicha ketmoqchi bo'lsak, shunga o'xshash biror narsaga ega bo'lgan konfiguratsiyani yaratishimiz kerak bo'ladi:ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
e.printStackTrace();
}
Bu yerda siz bot bilan aloqa o'rnatishingiz mumkin bo'lgan ob'ekt yaratiladi. Bizning holatda, biz ulanmoqchi bo'lgan starter biz uchun hamma narsani "kaput ostida" qiladi (bu ITda tez-tez ishlatiladigan iboraning tarjimasi - kaput ostida). Mana bu starterga havola . README.md fayli nima ekanligini, nima uchun va qanday foydalanishni darhol ko'rishingiz mumkin. Uni ulash uchun siz ushbu bog'liqlikni xotiraga qo'shishingiz kerak. Hammasi shu :) Mana kerakli qaramlik:
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-spring-boot-starter</artifactId>
<version>5.0.1</version>
</dependency>
Biz uni xotiramizga qo'shamiz. Biz versiyani kutilganidek o'rnatamiz va Maven loyihasini yangilaymiz. Tavsifga asoslanib, biz shunchaki yangi sinf yaratishimiz, TelegramLongPollingBot-dan meros olishimiz va bu sinfni SpringBoot-ning Ilova kontekstiga qo'shishimiz kerak. Ilova konteksti - loyihani ishga tushirish uchun yaratilgan ob'ektlar saqlanadigan joy. Sinf qo'shish uchun siz izohlardan birini ishlatishingiz kerak: @Component, @Service, @Repository, @Controller. Yoki konfiguratsiya sinfidagi (ya'ni Konfiguratsiya izohi bilan belgilangan sinfda) usul orqali yaratilgan bo'lsa, @Bean izohi. Bularning barchasi hali ham tushunarsiz bo'lib tuyulishi mumkinligini tushunaman. Ammo buni tushunishni boshlaganingizda, u erda hech qanday murakkab narsa yo'qligini ko'rasiz. Spring Boot-ni tezda tushunish uchun men ajoyib kitobni tavsiya qilaman - Spring In Action 5-nashri. Agar istak bo'lsa, shu kitob asosida turkum maqolalar yozishim mumkin. Keling, orqaga qaytaylik. JavarushTelegramBotApplication-ni o'z ichiga olgan paketda biz telegram botimizni o'z ichiga olgan bot paketini yaratamiz. Uning nomi JavaRushTelegramBot bo'ladi :
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;
}
}
Bu sinf mavhum edi va uchta usulni amalga oshirish kerak edi. Keling, ular haqida batafsilroq gaplashaylik:
- onUpdateReceived(Yangilanishni yangilash) - bu foydalanuvchilardan xabarlar keladigan kirish nuqtasi. Barcha yangi mantiq shu yerdan keladi;
- getBotUsername() - bu erda biz ulanadigan botimizning foydalanuvchi nomini qo'shishingiz kerak;
- getBotToken() - va bu, shunga ko'ra, bot tokenidir.
- 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;
}
}
Ko'rinib turibdiki, biz o'zgaruvchining qiymatini izohga o'tkazdik. SpringBoot bizning bot ob'ektimizni yaratganda, qiymatlar xususiyatlardan olinadi (yana ingliz tilidagi kuzatuv qog'ozi - xususiyatlar). Biz deyarli keldik. Siz botni biror narsaga javob berishingiz kerak. Shuning uchun, keling, onUpdateReceived usulini yangilaymiz . Biz botga kelgan xabarni olib, uni qaytarib yuborishimiz kerak. Shunday qilib, biz bot ishlayotganini bilib olamiz. Buning uchun biz kerakli narsalarni taxminan va tez yozamiz:
@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();
}
}
}
Bu erda hamma narsa juda oddiy: biz xabar haqiqatan ham mavjudligini tekshiramiz, shuning uchun biz xabarning o'zini ( xabar ) va yozishmalar sodir bo'lgan suhbat ID ( chatId ) ni chiqaramiz. Keyinchalik, biz xabar yuborish uchun ob'ekt yaratamiz SendMessage , xabarning o'zi va unga chat identifikatorini o'tkazamiz - ya'ni botga nima va qaerga yuborish kerak. Bizda bu allaqachon yetarli. Keyinchalik, biz JavarushTelegramBotApplication sinfida asosiy usulni ishga tushiramiz va Telegramda botimizni qidiramiz: Jurnallardan biz bot ishga tushganini ko'ramiz. Shunday qilib, Telegramga o'tish va botga yozish vaqti keldi: Biz boshlash tugmasini bosing va biz darhol javob olamiz: Tekshirish uchun yana bir ahmoqona yozaylik: Va tamom, hozir JRTB-2 vazifamiz tugallandi deb aytishimiz mumkin. . Hali bu yerda hech qanday test yoza olmaysiz, shuning uchun biz hamma narsani avvalgidek qoldiramiz. Keyin siz yangi majburiyat yaratishingiz kerak: majburiyat nomiga e'tibor bering: yana e'tiboringizni bunga qarataman. Majburiyat avval topshiriq nomini, so'ngra bajarilgan ishlarning batafsil tavsifini o'z ichiga oladi. "Commit and Push..." tugmasini bosing va " Push " tugmasini bosish orqali tasdiqlang : Loyihamizga o'ting . Avvalgidek, GitHub allaqachon yangi filialni ko'rdi va main uchun tortishish so'rovini yaratishni taklif qiladi. Biz qarshilik qilmaymiz va uni yaratmaymiz: Odatdagidek, biz allaqachon yorliq, loyihani tanladik va uni menga tayinladik. Nihoyat, tortish so'rovini yaratish tugmasini bosing. Qurilish tugashi uchun biroz kutamiz - va tamom, tortishish so'rovi birlashishga tayyor:
Versiyalash
Men qandaydir tarzda versiyani yaratishimiz kerak bo'lgan nuqtani o'tkazib yubordim. Buning uchun filialimizda yana bir qancha o'zgarishlar kiritamiz. Biz IDEA ga qaytamiz va xotiradagi loyiha versiyasiga qaraymiz: Versiya 0.0.1-SNAPSHOT . Bu vazifa versiyasi. Va biz har bir yangi hal qilingan muammo bilan loyihaning versiyasini yangilashdan boshlaymiz. MVP darajasiga yetgunimizcha, versiya -SNAPSHOT qo'shimchasi bilan birga keladi. Versiyalash sxemasi qanday bo'ladi? XYZ-SNAPSHOT Bu yerda:- X - asosiy versiyani yangilash, ko'pincha oldingi versiya bilan orqaga qarab muvofiqlik bilan bog'liq muammolarni o'z ichiga oladi;
- Y - juda katta o'zgarishlar emas, oldingi versiyaga to'liq mos keladi;
- Z - biz topib tuzatgan nuqsonlar hisoblagichi.
GO TO FULL VERSION