JavaRush /Java blogi /Random-UZ /Loyihaga telegram bot qo'shish - "A dan Zgacha Java loyih...

Loyihaga telegram bot qo'shish - "A dan Zgacha Java loyihasi"

Guruhda nashr etilgan
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). "A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 1Bahorda 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 :
  1. Mahalliy loyihadagi asosiy filialni ctrl + t kombinatsiyasidan foydalanib yangilaymiz ."A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 2
  2. Asosiy filialga asoslanib, biz yaratamiz:"A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 3
  3. Bot qo'shing.
  4. Biz bajarilgan ishlar tavsifi bilan yangi majburiyat yaratamiz va uni GitHub-ga suramiz.
  5. Asosiy filial uchun tortish so'rovini yarating va uni qayta tekshiring. Qurilish tugashini kutmoqdamiz (github harakatlari), uni asosiy filialga birlashtiramiz.
  6. 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.
Qolganini o'zimiz qilamiz. Darhol band qilishimga ijozat bering: biz o'zim o'rgangan narsani va shunday qilamiz. Va bot bilan ishlaganda, men buni yaxshiroq qilish mumkinligiga aminman. Va agar kimdir buni qilishni xohlasa, men faqat xursand bo'laman va bu harakatni har tomonlama qo'llab-quvvatlayman. Aytgancha, birinchi navbatda, kimdir menga buyruqlar tavsifini telegramdagi bot sozlamalari orqali emas, balki kod orqali qanday dasturlashni tushuntirsa, ajoyib bo'lardi. Men buni o'rganmaganman. Bizning resursimizda asosiy botni qanday yaratishni tasvirlaydigan bir nechta maqolalar mavjud: bugun biz shunga o'xshash narsani qilamiz. Agar sizda boshqa savollar bo'lsa, men ushbu maqolani ko'rib chiqishni maslahat beraman.

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“A dan Zgacha Java loyihasi”: loyihaga telegram bot qo‘shish – 4 Keyin bizdan ushbu botga nom berish so'raladi. Bu test sinovlari uchun bot bo'lgani uchun uning nomi mos keladi: [TEST] JavarushBot"A dan Zgacha Java loyihasi": loyihaga telegram bot qo'shish - 5 Endi uni har doim topish mumkin bo'lgan noyob nom berish vaqti keldi - uning foydalanuvchi nomi: test_javarush_community"A dan Zgacha Java loyihasi": loyihaga telegram bot qo'shish - 6 Yuqorida aytganimdek, siz _botni qo'shishingiz kerak. foydalanuvchi nomi uchun qo'shimcha, shuning uchun biz yana yozamiz: test_javarush_community_bot"A dan Zgacha Java loyihasi": loyihaga telegram bot qo'shish - 7 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. "A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 8Tavsifga 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.
Aslida, bu sayt uchun login va parolga o'xshaydi. Hozircha bu qiymatni aniq yozmaymiz. Bu "qattiq kodlash" deb ataladi (ya'ni, ma'lum bir qiymatni bog'lash - odatdagidek, ingliz qattiq kodidan kuzatuv qog'ozi). Siz bunday qilmasligingiz kerak. Biz boshqa yo'l bilan boramiz - biz bu ma'lumotlarni application.properties sinfiga yozamiz va uni shu yerdan o'qiymiz. Bu nima uchun kerak? Keyin, dastur ishga tushganda, biz ushbu qiymatlarni tashqaridan o'rnatishimiz mumkin. Bu moslashuvchan, bu to'g'ri. src/main/resources/application.properties fayliga o'ting. U erda biz ushbu o'zgaruvchilar uchun nomlar bilan tanishamiz. .properties kengaytmali fayllar "=" belgisi bilan ajratilgan kalit-qiymat strukturasi sifatida o'qiladi, har bir juft alohida satrdir. Shunday qilib, men ushbu o'zgaruvchilar bilan keldim:
  • bot.username ;
  • bot.token .
Bu shunday ko'rinadi: "A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 9SpringBoot ajoyib izohga ega - @Value. To'g'ri ishlatilsa, u application.properties faylidan qiymatlarni tortib oladi. Loyihani shu bilan yangilaymiz:
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: "A dan Zgacha Java loyihasi": loyihaga telegram bot qo'shish - 10 taJurnallardan biz bot ishga tushganini ko'ramiz. Shunday qilib, Telegramga o'tish va botga yozish vaqti keldi: "A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 11Biz boshlash tugmasini bosing va biz darhol javob olamiz: "A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 12Tekshirish uchun yana bir ahmoqona yozaylik: "A dan Zgacha Java loyihasi": loyihaga telegram bot qo'shish - 13Va 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: “A dan Zgacha Java loyihasi”: loyihaga telegramma bot qo‘shish – 14 tamajburiyat 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“A dan Zgacha Java loyihasi”: loyihaga telegramma bot qo‘shish – 15 ta 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:"A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 16"A dan Zgacha Java loyihasi": loyihaga telegram bot qo'shish - 17

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: “A dan Zgacha Java loyihasi”: loyihaga telegramma bot qo‘shish – 18 taVersiya 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.
Shunga asoslanib, bizda birinchi versiya bo'ladi - 0.1.0-SNAPSHOT - ya'ni bizda hali katta yangilanishlar yo'q, hamma narsaning bir oz qismi va biz hali MVPga erishmadik, shuning uchun -SNAPSHOT qo'shimchasi mavjud. . Keling, buni xotirada o'zgartiraylik: “A dan Zgacha Java loyihasi”: loyihaga telegramma bot qo‘shish – 19RELEASE_NOTES fayliga o'ting, u erda biz har bir yangi versiyada loyihaga kiritilgan o'zgarishlarni tasvirlab beramiz: "A dan Zgacha Java loyihasi": loyihaga telegram bot qo'shish - 20Bizning birinchi yozuvimiz. Endi, har bir keyingi versiya yangilanishi bilan biz bu erda nima sodir bo'lganini tasvirlab beramiz. Biz bu ishni bajaramiz, tavsif yozamiz: JRTB-2: loyihaning yangilangan versiyasi va RELEASE_NOTES ga qo'shilgan. Hammasi avvalgidek bir xil. Qurilish tugashini kutmoqdamiz va biz o'zgarishlarimizni birlashtira olamiz. Faqat bu erda biroz boshqacha bo'ladi. Men asosiy bo'limdagi har bir vazifa alohida topshiriq ekanligiga ishonch hosil qilmoqchiman, shuning uchun birlashtirish so'rovini bosish biz uchun ishlamaydi. Git-da git squash opsiyasi mavjud bo'lib, u barcha topshiriqlarni bittaga to'playdi va ularni birlashtiradi. Biz ushbu variantni tanlaymiz: "A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 21Squash va Merge-ni bosing va bizga xabarni tahrirlash taklif etiladi, bu oxirida bo'ladi: "A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 22Juda qulay va eng muhimi, talab nima. Aytgancha, men bitbucket-da bunday xususiyatni ko'rmadim =/ Birlashtirishni tasdiqlang. Qolgan yagona narsa - vazifa holatini doskamizda Bajarildi ga o'zgartirish, tortish so'roviga havola bilan izoh yozish va uni yopish: "A dan Zgacha Java loyihasi": loyihaga telegramma bot qo'shish - 23Endi bizning kengashimiz quyidagicha ko'rinadi:"A dan Zgacha Java loyihasi": loyihaga telegram bot qo'shish - 24

Xulosa

Bugun biz bosqichma-bosqich telegram bot yaratdik va uni SpringBoot loyihamizga kiritdik. Bot ishlaydi va javob beradi. Biz darhol xususiyatlar orqali bot ma'lumotlariga kirishga ruxsat berdik. Kelgusida: biz katta ish qilamiz - JRTB-3 ni bajaramiz - loyihamiz uchun buyruq naqshini qo'shamiz. Oh, yana bir narsa ... Men sizga tokenni ishlatmaslik uchun nashr qilmasligimni aytdim. Ammo men maqolani yarim tunga yaqinroq va ishdan keyin yozayotganim sababli, men omborga tegishli token joylashtirganim ma'lum bo'ldi va GitGuardian bu haqda menga xatida aytdi: “A dan Zgacha Java loyihasi”: loyihaga telegramma bot qo‘shish – 25 taBuning uchun ularga rahmat! Endi nima qilish kerak? Endi uni git-dan o'chirib bo'lmaydi, chunki men ushbu tokensiz yangi majburiyat yuklagan bo'lsam ham, u eski holatda qoladi. Lekin men majburiyatni o'chirib tashlashni va orqaga qaytarishni xohlamayman. Shunday qilib, men borib, yuqorida aytib o'tilgan BotFather-dan tokenni o'chirib qo'ydim. Endi token bor, lekin u endi haqiqiy emas. Maqolani nashr etishdan oldin uning barcha kodlarini ko'rish uchun mening GitHub hisobimga obuna bo'ling . O'qiganingiz uchun barchangizga rahmat, tez orada ko'rishguncha.

Seriyadagi barcha materiallar ro'yxati ushbu maqolaning boshida.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION