JavaRush /Blog Java /Random-MS /Menambah bot telegram pada projek - "Projek Java dari A h...

Menambah bot telegram pada projek - "Projek Java dari A hingga Z"

Diterbitkan dalam kumpulan
Salam, kawan-kawan sekalian. Ya, ya, betul-betul kawan. Saya telah menjadi sangat akrab dengan siri artikel ini sehingga orang-orang yang kerap menulis ucapan terima kasih mereka dalam komen dan/atau menunjukkan bahawa mereka telah membaca dan memahami bahan itu telah menjadi rapat. Anda dan saya bergerak dari kedua-dua belah pihak ke arah matlamat yang sama. Awak nak faham, tapi saya nak jelaskan. Dan kami mempunyai matlamat akhir yang sama - aplikasi bertulis yang boleh anda fahami dari awal hingga akhir. Anda mungkin telah mendengar tentang banyak perkara yang akan saya huraikan dalam artikel ini. Saya tidak fikir saya akan memberitahu anda apa-apa yang baru dan luar biasa (tetapi dalam rangka projek adalah perlu untuk mengetahui / mengulangi perkara ini). "Projek Java dari A hingga Z": menambah bot telegram pada projek - 1Pada musim bunga saya menulis bot untuk diri saya sendiri, jadi kami akan bergantung pada "corak"nya.

Kami menulis JRTB-2

Kami akan melakukan perkara yang sama seperti yang kami lakukan dalam artikel dengan tugas JRTB-0 :
  1. Kami mengemas kini cawangan utama dalam projek tempatan menggunakan gabungan ctrl + t ."Projek Java dari A hingga Z": menambah bot telegram pada projek - 2
  2. Berdasarkan cawangan utama, kami mencipta:"Projek Java dari A hingga Z": menambah bot telegram pada projek - 3
  3. Tambah bot.
  4. Kami membuat komitmen baharu dengan penerangan tentang perkara yang telah dilakukan dan menolaknya ke GitHub.
  5. Buat permintaan tarik untuk cawangan utama dan semak semula. Kami sedang menunggu binaan untuk melalui (tindakan github), gabungkannya ke cawangan utama.
  6. Tutup tugas yang sepadan.

Apa itu bot telegram

Kami, pembangun, boleh membayangkan bekerja dengan bot telegram seperti ini: kami menggunakan pelanggan mereka untuk bekerja dengan mereka. Kami mempunyai perpustakaan siap sedia untuk bekerja. Terdapat satu set tindakan selepas itu bot telegram akan mengetahui bahawa ia dikaitkan dengan program kami. Dan sudah di dalam program ini kita akan belajar cara menerima surat, arahan dan entah bagaimana memprosesnya. Terdapat perkara seperti arahan dalam bot telegram : ia bermula dengan garis miring “/”. Selepas itu, kami segera menulis perkataan itu bersama-sama, dan ini akan dianggap sebagai arahan. Sebagai contoh, terdapat dua arahan yang perlu diketahui oleh semua orang:
  • /start — mula bekerja dengan bot;
  • /stop - tamatkan kerja dengan bot.
Selebihnya kami akan buat sendiri. Izinkan saya membuat tempahan dengan segera: kami akan melakukan perkara yang betul dan mengikut cara yang saya pelajari. Dan apabila bekerja dengan bot, saya yakin bahawa ia akan dapat dilakukan dengan lebih baik. Dan jika seseorang mahu melakukan ini, saya hanya akan gembira dan akan menyokong usaha ini dalam setiap cara yang mungkin. Ngomong-ngomong, perkara pertama yang akan menjadi keren ialah jika seseorang menerangkan kepada saya cara memprogramkan penerangan arahan melalui kod, dan bukan melalui tetapan bot dalam telegram. Saya tidak belajar ini. Kami mempunyai beberapa artikel tentang sumber kami yang menerangkan cara membuat bot asas: hari ini kami akan melakukan sesuatu yang serupa. Jika anda mempunyai sebarang soalan lagi, saya cadangkan menyemak artikel ini .

Buat bot dengan BotFather

Untuk menyambungkan bot, anda perlu menciptanya terlebih dahulu. Telegram mempunyai pendekatan - mencipta bot dengan nama uniknya sendiri. Ia juga akan disertakan dengan token (rentetan besar yang berfungsi seperti kata laluan). Saya telah pun mencipta bot untuk JavaRush - @javarush_community_bot . Bot ini masih kosong dan tidak boleh berbuat apa-apa. Perkara utama ialah perlu ada _bot di hujung nama . Untuk menunjukkan cara melakukan ini, saya akan mencipta bot yang akan kami uji kefungsian kami. Dari segi projek sebenar, ini akan menjadi persekitaran ujian. Dan yang utama kami ialah persekitaran prod (prod - pengeluaran, iaitu, persekitaran sebenar di mana projek itu akan dilaksanakan). Sudah tentu, adalah mungkin untuk menambah persekitaran lain - persekitaran kotak pasir: kotak pasir biasa, lebih boleh diubah dan boleh diakses oleh semua peserta pembangunan. Tetapi ini hanya akan merumitkan keadaan pada peringkat penciptaan projek. Buat masa ini, mari buat dua lagi bot untuk ujian dan untuk persekitaran kotak pasir. Langkah pertama ialah membuat (mendaftar) bot dalam Telegram itu sendiri. Kita perlu mencari bot: @BotFather dan tulis arahan kepadanya: /newbot"Projek Java dari A hingga Z": menambah bot telegram pada projek - 4 Seterusnya, kami diminta untuk memberikan nama kepada bot ini. Memandangkan ini adalah bot untuk tugasan ujian, namanya sesuai: [TEST] JavarushBot"Projek Java dari A hingga Z": menambah bot telegram pada projek - 5 Kini tiba masanya untuk memberikan nama unik yang sentiasa boleh ditemui - nama penggunanya: test_javarush_community"Projek Java dari A hingga Z": menambah bot telegram pada projek - 6 Seperti yang saya katakan di atas, anda perlu menambah _bot akhiran untuk nama pengguna, jadi kami menulis sekali lagi: test_javarush_community_bot"Projek Java dari A hingga Z": menambah bot telegram pada projek - 7 Dan itu sahaja! Bot telah dibuat. Sekarang, menggunakan nama pengguna dan token, ia boleh disambungkan ke projek kami. Sudah tentu, untuk kelancaran pelayan ujian, saya tidak akan memaparkan token (pada asasnya kata laluan untuk mengakses bot) bot ini untuk tontonan umum.

Kami menyambungkan bot ke projek

Kami tidak akan memasukkan perpustakaan seperti biasa, tetapi akan segera memanfaatkan rangka kami - SpringBoot. Dia mempunyai perkara seperti Starter. Dengan memasukkan perpustakaan, kami boleh menggunakannya untuk memberitahu SpringBoot bahawa kami ingin mengkonfigurasi projek dengan betul. Jika kita pergi ke laluan biasa, yang diterangkan di banyak tempat, kita perlu membuat konfigurasi di suatu tempat yang mempunyai sesuatu seperti ini:
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
  telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
  e.printStackTrace();
}
Di sini objek dicipta yang dengannya anda boleh mewujudkan sambungan dengan bot. Dalam kes kami, pemula yang ingin kami sambungkan akan melakukan segala-galanya untuk kami di suatu tempat "di bawah tudung" (ini juga merupakan terjemahan frasa yang sering digunakan dalam IT - di bawah tudung). Berikut adalah pautan kepada pemula ini . Anda boleh segera melihat dari fail README.md apa itu, sebab dan cara menggunakannya. Untuk menyambungkannya, anda hanya perlu menambah kebergantungan ini pada memori. Itu sahaja :) Berikut adalah pergantungan yang diperlukan:
<dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-spring-boot-starter</artifactId>
        <version>5.0.1</version>
    </dependency>
Kami menambahnya dalam ingatan kami. Kami memasang versi seperti yang dijangkakan dan mengemas kini projek Maven. "Projek Java dari A hingga Z": menambah bot telegram pada projek - 8Berdasarkan penerangan, kami hanya perlu mencipta kelas baharu, mewarisi daripada TelegramLongPollingBot dan menambah kelas ini pada Konteks Aplikasi SpringBoot kami. Konteks Aplikasi ialah tempat di mana objek yang dicipta untuk menjalankan projek disimpan. Untuk menambah kelas, anda perlu menggunakan salah satu anotasi: @Component, @Service, @Repository, @Controller. Atau anotasi @Bean jika dibuat melalui kaedah dalam kelas konfigurasi (iaitu, dalam kelas yang ditandakan dengan anotasi Konfigurasi). Saya faham bahawa semua ini mungkin masih kelihatan tidak dapat difahami. Tetapi apabila anda mula memikirkannya, anda akan melihat bahawa tidak ada yang rumit di sana. Untuk memahami Spring Boot dengan cepat, saya mengesyorkan buku yang menarik - Spring In Action edisi ke-5. Jika ada keinginan, saya boleh menulis beberapa siri artikel berdasarkan buku ini. Jom balik. Dalam pakej yang mengandungi JavarushTelegramBotApplication, kami mencipta pakej bot , yang akan mengandungi bot telegram kami. Namanya ialah 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;
   }
}
Kelas ini adalah abstrak dan tiga kaedah perlu dilaksanakan. Mari bercakap tentang mereka dengan lebih terperinci:
  • onUpdateReceived(Kemas kini kemas kini) - ini adalah titik masuk di mana mesej daripada pengguna akan tiba. Semua logik baru akan datang dari sini;
  • getBotUsername() - di sini anda perlu menambah nama pengguna bot kami yang akan kami sambungkan;
  • getBotToken() - dan ini, sewajarnya, ialah token bot.
Pada asasnya ia seperti log masuk dan kata laluan untuk tapak. Kami tidak akan menulis nilai ini secara eksplisit buat masa ini. Ini dipanggil "pengekodan keras" (iaitu, mengikat beberapa nilai tertentu - seperti biasa, kertas surih daripada kod keras bahasa Inggeris). Awak tak patut buat macam tu. Kami akan pergi ke arah lain - kami akan menulis data ini ke dalam kelas application.properties dan membacanya dari sini. Mengapa ini perlu? Kemudian, supaya apabila aplikasi bermula, kita boleh menetapkan nilai ini secara luaran. Ia fleksibel, betul. Pergi ke fail src/main/resources/application.properties. Di sana kita akan menghasilkan nama untuk pembolehubah ini. Fail dengan sambungan .properties dibaca sebagai struktur nilai kunci yang dipisahkan dengan “=”, setiap pasangan menjadi baris yang berasingan. Jadi saya datang dengan pembolehubah ini:
  • bot.nama pengguna ;
  • bot.token .
Beginilah rupanya: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 9SpringBoot mempunyai anotasi yang hebat - @Value. Jika digunakan dengan betul, ia akan mengeluarkan nilai daripada fail application.properties. Kami mengemas kini projek dengan ini:
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;
   }
}
Ia boleh dilihat bahawa kami menghantar nilai pembolehubah kepada anotasi. Dan apabila SpringBoot mencipta objek bot kami, nilai akan diambil daripada sifat (sekali lagi, kertas surih dari bahasa Inggeris - sifat). Kita hampir sampai. Anda perlu membuat bot menjawab sesuatu. Oleh itu, mari kemas kini kaedah onUpdateReceived . Kami perlu mendapatkan semula mesej yang datang ke bot dan menyampaikannya kembali. Dengan cara ini kita akan tahu bahawa bot berfungsi. Untuk melakukan ini, kami akan menulis secara kasar dan cepat apa yang diperlukan:
@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();
       }
   }
}
Segala-galanya di sini adalah sangat mudah: kami menyemak sama ada mesej itu benar-benar wujud, jadi kami mengekstrak mesej itu sendiri ( mesej ) dan ID sembang ( chatId ) di mana surat-menyurat itu berlaku. Seterusnya, kami mencipta objek untuk menghantar mesej SendMessage , hantar mesej itu sendiri dan ID sembang ke dalamnya - iaitu, apa yang hendak dihantar ke bot dan di mana. Kita sudah cukup dengan ini. Seterusnya, kami menjalankan kaedah utama dalam kelas JavarushTelegramBotApplication dan mencari bot kami dalam Telegram: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 10Daripada log kami melihat bahawa bot telah bermula. Jadi, sudah tiba masanya untuk pergi ke Telegram dan tulis ke bot: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 11Kami mengklik mula dan kami serta-merta menerima jawapan: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 12Mari tulis lagi omong kosong untuk diperiksa: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 13Dan itu sahaja, pada ketika ini kami boleh mengatakan bahawa tugas JRTB-2 kami telah selesai . Anda masih belum boleh menulis sebarang ujian di sini, jadi kami akan membiarkan segala-galanya seperti sedia ada. Seterusnya anda perlu membuat komitmen baharu: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 14Beri perhatian kepada nama komit: sekali lagi saya menarik perhatian anda kepada perkara ini. Komit mula-mula mengandungi nama tugasan, dan kemudian penerangan yang lebih terperinci tentang perkara yang telah dilakukan. Klik Komit dan Tekan... dan sahkan dengan mengklik Tekan sekali lagi : "Projek Java dari A hingga Z": menambah bot telegram pada projek - 15Pergi ke projek kami . Seperti sebelum ini, GitHub telah pun melihat cawangan baharu dan menawarkan untuk membuat permintaan tarik untuk main. Kami tidak menentang dan menciptanya: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 16Seperti biasa, kami telah memilih label, projek dan memberikannya kepada saya. Akhir sekali, klik Cipta Permintaan Tarik. Mari tunggu sebentar sementara binaan selesai - dan itu sahaja, permintaan tarik sedia untuk digabungkan:"Projek Java dari A hingga Z": menambah bot telegram pada projek - 17

Versi

Saya entah bagaimana terlepas titik bahawa kita perlu melakukan versi. Untuk melakukan ini, kami akan membuat beberapa lagi perubahan dalam cawangan kami. Kami kembali ke IDEA dan melihat versi projek dalam memori: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 18Versi ialah 0.0.1-SNAPSHOT . Ini adalah versi tugas. Dan kami akan bermula dengan mengemas kini versi projek dengan setiap masalah baru yang diselesaikan. Sehingga kami mencapai MVP, versi akan datang dengan akhiran -SNAPSHOT. Apakah skema versi? XYZ-SNAPSHOT Di mana:
  • X - kemas kini versi utama, selalunya mengandungi masalah dengan keserasian ke belakang dengan versi sebelumnya;
  • Y - perubahan tidak terlalu besar, serasi sepenuhnya dengan versi sebelumnya;
  • Z ialah pembilang kecacatan yang kami temui dan dibaiki.
Berdasarkan ini, kami akan mempunyai versi pertama - 0.1.0-SNAPSHOT - iaitu, kami belum mempunyai kemas kini utama, hanya sedikit daripada segala-galanya, dan kami belum mencapai MVP, jadi terdapat akhiran -SNAPSHOT . Mari kita ubah ini dalam ingatan: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 19Pergi ke fail RELEASE_NOTES, di mana kami akan menerangkan perubahan pada projek dengan setiap versi baharu: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 20Entri pertama kami. Sekarang, dengan setiap kemas kini versi berikutnya, kami akan menerangkan di sini apa sebenarnya yang berlaku. Kami melakukan kes ini, tulis penerangan: JRTB-2: versi projek yang dikemas kini dan ditambahkan pada RELEASE_NOTES Semuanya betul-betul sama seperti sebelumnya. Kami sedang menunggu binaan untuk lulus dan kami boleh menggabungkan perubahan kami. Hanya di sini ia akan menjadi sedikit berbeza. Saya ingin memastikan bahawa setiap tugas dalam cawangan utama adalah komitmen yang berasingan, jadi hanya menolak permintaan tarik Gabung tidak akan berfungsi untuk kami. Git mempunyai pilihan git squash, yang mengumpulkan semua komit menjadi satu dan menggabungkannya. Kami memilih pilihan ini: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 21Klik Skuasy dan Gabung, dan kami ditawarkan untuk mengedit mesej, yang pada akhirnya akan menjadi: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 22Sangat mudah dan yang paling penting, apa yang diperlukan. Dengan cara ini, saya tidak melihat ciri sedemikian pada bitbucket =/ Sahkan gabungan. Satu-satunya perkara yang tinggal ialah menukar tugas kepada status Selesai dalam papan kami, tulis ulasan dengan pautan ke permintaan tarik dan tutupnya: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 23Papan kami kini kelihatan seperti ini:"Projek Java dari A hingga Z": menambah bot telegram pada projek - 24

Kesimpulan

Hari ini kami mencipta bot telegram langkah demi langkah dan melaksanakannya dalam projek SpringBoot kami. Bot berfungsi dan memberikan jawapan. Kami segera membuat akses kepada data bot melalui sifat. Lebih banyak lagi akan datang: kami akan melakukan sesuatu yang besar - melaksanakan JRTB-3 - menambah Corak Perintah untuk projek kami. Oh, satu perkara lagi... Saya memberitahu anda bahawa saya tidak akan menerbitkan token itu supaya ia tidak digunakan. Tetapi sejak saya menulis artikel itu lebih dekat ke tengah malam dan selepas bekerja, ternyata saya telah menyiarkan token yang sah dalam repositori, dan GitGuardian memberitahu saya tentang perkara ini dalam surat: "Projek Java dari A hingga Z": menambah bot telegram pada projek - 25Terima kasih kepada mereka untuk ini! Apa yang perlu dilakukan sekarang? Ia tidak lagi mungkin untuk memadamkannya daripada git, kerana walaupun saya memuat naik komit baharu tanpa token ini, ia masih kekal dalam komit lama. Tetapi saya tidak mahu memadam dan melancarkan semula komit. Jadi saya pergi dan menyahaktifkan token daripada BotFather yang telah disebutkan. Sekarang token itu ada, tetapi ia tidak lagi sah. Langgan akaun GitHub saya untuk melihat semua kod untuknya sebelum menerbitkan artikel. Terima kasih semua kerana membaca, jumpa lagi.

Senarai semua bahan dalam siri ini adalah pada permulaan artikel ini.

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