JavaRush /Java Blog /Random-ID /Menambahkan bot telegram ke proyek - "Proyek Java dari A ...

Menambahkan bot telegram ke proyek - "Proyek Java dari A hingga Z"

Dipublikasikan di grup Random-ID
Salam, teman-teman terkasih. Ya, ya, tepatnya teman. Saya sudah begitu familiar dengan rangkaian artikel ini sehingga orang-orang yang secara rutin menuliskan rasa terima kasihnya di kolom komentar dan/atau menunjukkan bahwa mereka telah membaca dan memahami materi tersebut sudah menjadi dekat. Anda dan saya bergerak dari kedua sisi menuju tujuan yang sama. Anda ingin memahami, tetapi saya ingin menjelaskan. Dan kami memiliki tujuan akhir yang sama - aplikasi tertulis yang dapat Anda pahami dari awal hingga akhir. Anda mungkin sudah banyak mendengar tentang apa yang akan saya uraikan di artikel ini. Saya rasa saya tidak akan memberi tahu Anda sesuatu yang baru dan luar biasa (tetapi dalam kerangka proyek, hal ini perlu diketahui/diulangi). "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 1Pada musim semi saya menulis bot untuk diri saya sendiri, jadi kami akan mengandalkan “pola”-nya.

Kami menulis JRTB-2

Kami akan melakukan hal yang sama seperti yang kami lakukan di artikel dengan tugas JRTB-0 :
  1. Kami memperbarui cabang utama di proyek lokal menggunakan kombinasi ctrl + t ."Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 2
  2. Berdasarkan cabang utama, kami membuat:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 3
  3. Tambahkan bot.
  4. Kami membuat komitmen baru dengan deskripsi tentang apa yang telah dilakukan dan mengirimkannya ke GitHub.
  5. Buat permintaan tarik untuk cabang utama dan periksa lagi. Kami menunggu build selesai (tindakan github), menggabungkannya ke cabang utama.
  6. Tutup tugas terkait.

Apa itu bot telegram

Kami, para pengembang, dapat membayangkan bekerja dengan bot telegram seperti ini: kami menggunakan klien mereka untuk bekerja dengan mereka. Kami memiliki perpustakaan siap pakai untuk bekerja. Ada serangkaian tindakan yang setelahnya bot telegram akan mengetahui bahwa itu terkait dengan program kami. Dan sudah di dalam program ini kita akan belajar cara menerima surat, perintah, dan memprosesnya. Ada yang namanya perintah di bot telegram : diawali dengan garis miring “/”. Setelah itu, kita langsung menulis kata itu bersama-sama, dan ini akan dianggap sebagai perintah. Misalnya, ada dua perintah yang harus diketahui semua orang:
  • /start — mulai bekerja dengan bot;
  • /stop - mengakhiri pekerjaan dengan bot.
Kami akan melakukan sisanya sendiri. Izinkan saya segera membuat reservasi: kami akan melakukan apa dan dengan cara yang saya pelajari. Dan ketika bekerja dengan bot, saya yakin akan ada kemungkinan untuk melakukan yang lebih baik. Dan jika seseorang ingin melakukan ini, saya akan senang dan akan mendukung upaya ini dengan segala cara. Omong-omong, hal pertama yang keren adalah jika seseorang menjelaskan kepada saya cara memprogram deskripsi perintah melalui kode, dan bukan melalui pengaturan bot di telegram. Saya tidak mempelajari ini. Kami memiliki beberapa artikel di sumber kami yang menjelaskan cara membuat bot dasar: hari ini kami akan melakukan hal serupa. Jika Anda memiliki pertanyaan lebih lanjut, saya sarankan membaca artikel ini .

Buat bot dengan Botfather

Untuk menghubungkan bot, Anda harus membuatnya terlebih dahulu. Telegram memiliki pendekatan - membuat bot dengan nama uniknya sendiri. Itu juga akan disertai dengan token (string besar yang berfungsi seperti kata sandi). Saya sudah membuat bot untuk JavaRush - @javarush_community_bot . Bot ini masih kosong dan tidak bisa berbuat apa-apa. Yang penting harus ada _bot di akhir nama . Untuk menunjukkan cara melakukan ini, saya akan membuat bot tempat kami akan menguji fungsionalitasnya. Dalam hal proyek nyata, ini akan menjadi lingkungan pengujian. Dan lingkungan utama kita adalah lingkungan prod (prod - produksi, yaitu lingkungan nyata di mana proyek akan dijalankan). Tentu saja, dimungkinkan untuk menambahkan lingkungan lain - lingkungan kotak pasir: kotak pasir umum, lebih mudah diubah dan dapat diakses oleh semua peserta pengembangan. Tapi ini hanya akan memperumit situasi pada tahap pembuatan proyek. Untuk saat ini, mari buat dua bot lagi untuk pengujian dan untuk lingkungan sandbox. Langkah pertama adalah membuat (mendaftarkan) bot di Telegram itu sendiri. Kita perlu mencari botnya: @Botfather dan menulis perintah padanya: /newbot"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 4 Selanjutnya kita diminta memberi nama pada bot ini. Karena ini adalah bot untuk tugas pengujian, namanya akan sesuai: [TEST] JavarushBot"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 5 Sekarang saatnya memberikan nama unik yang selalu dapat ditemukan - nama penggunanya: test_javarush_community"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 6 Seperti yang saya katakan di atas, Anda perlu menambahkan _bot akhiran untuk nama pengguna, jadi kita tulis lagi: test_javarush_community_bot"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 7 Dan selesai! Bot telah dibuat. Sekarang, dengan menggunakan nama pengguna dan token, itu dapat dihubungkan ke proyek kita. Tentu saja, demi kelancaran server pengujian, saya tidak akan menampilkan token (pada dasarnya kata sandi untuk mengakses bot) bot ini untuk dilihat publik.

Kami menghubungkan bot ke proyek

Kami tidak akan menyertakan perpustakaan seperti biasa, tetapi akan segera memanfaatkan kerangka kami - SpringBoot. Dia memiliki sesuatu seperti Starter. Dengan menyertakan perpustakaan, kita dapat menggunakannya untuk memberi tahu SpringBoot bahwa kita ingin mengonfigurasi proyek dengan benar. Jika kita menggunakan rute biasa, yang dijelaskan di banyak tempat, kita perlu membuat konfigurasi di suatu tempat yang memiliki sesuatu seperti ini:
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
  telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
  e.printStackTrace();
}
Di sini sebuah objek dibuat yang dengannya Anda dapat membuat koneksi dengan bot. Dalam kasus kami, starter yang ingin kami sambungkan akan melakukan segalanya untuk kami di suatu tempat "di bawah tenda" (ini juga merupakan terjemahan dari frasa yang sering digunakan dalam TI - di bawah tenda). Berikut ini tautan ke starter ini . Anda bisa langsung melihat dari file README.md apa itu, mengapa dan bagaimana cara menggunakannya. Untuk menghubungkannya, Anda hanya perlu menambahkan ketergantungan ini ke memori. Itu saja :) Inilah ketergantungan yang diperlukan:
<dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-spring-boot-starter</artifactId>
        <version>5.0.1</version>
    </dependency>
Kami menambahkannya ke memori kami. Kami menginstal versi seperti yang diharapkan dan memperbarui proyek Maven. "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 8Berdasarkan uraiannya, kita hanya perlu membuat kelas baru, mewarisi dari TelegramLongPollingBot dan menambahkan kelas ini ke Konteks Aplikasi SpringBoot kita. Konteks Aplikasi adalah tempat penyimpanan objek yang dibuat untuk menjalankan proyek. Untuk menambahkan kelas, Anda perlu menggunakan salah satu anotasi: @Component, @Service, @Repository, @Controller. Atau anotasi @Bean jika dibuat melalui metode di kelas konfigurasi (yaitu, di kelas yang ditandai dengan anotasi Konfigurasi). Saya memahami bahwa semua ini mungkin masih tampak tidak dapat dipahami. Tetapi ketika Anda mulai memahaminya, Anda akan melihat bahwa tidak ada yang rumit di sana. Untuk memahami Spring Boot dengan cepat, saya merekomendasikan buku keren - Spring In Action edisi ke-5. Jika mau, saya bisa menulis serangkaian artikel berdasarkan buku ini. Ayo kembali. Dalam paket yang berisi JavarushTelegramBotApplication, kami membuat paket bot , yang akan berisi bot telegram kami. Namanya adalah 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 abstrak dan tiga metode harus diterapkan. Mari kita bahas lebih detail:
  • onUpdateReceived(Perbarui pembaruan) - ini adalah titik masuk di mana pesan dari pengguna akan tiba. Semua logika baru akan datang dari sini;
  • getBotUsername() - di sini Anda perlu menambahkan nama pengguna bot kami yang akan kami sambungkan;
  • getBotToken() - dan ini adalah token bot.
Pada dasarnya ini seperti login dan kata sandi untuk sebuah situs. Kami tidak akan menulis nilai ini secara eksplisit untuk saat ini. Ini disebut “hardcoding” (yaitu, mengikat nilai tertentu - seperti biasa, kertas kalkir dari kode keras bahasa Inggris). Anda tidak harus melakukan itu. Kami akan pergi ke arah lain - kami akan menulis data ini ke dalam kelas application.properties dan membacanya dari sini. Mengapa hal ini perlu? Kemudian, agar saat aplikasi dimulai, kita bisa mengatur nilai-nilai tersebut secara eksternal. Itu fleksibel, itu benar. Buka file src/main/resources/application.properties. Di sana kita akan memberikan nama untuk variabel-variabel ini. File dengan ekstensi .properties dibaca sebagai struktur nilai kunci yang dipisahkan oleh “=”, setiap pasangan menjadi baris terpisah. Jadi saya membuat variabel-variabel ini:
  • bot.nama pengguna ;
  • bot.token .
Ini akan terlihat seperti ini: "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 9SpringBoot memiliki anotasi yang bagus - @Value. Jika digunakan dengan benar, itu akan mengambil nilai dari file application.properties. Kami memperbarui proyek 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;
   }
}
Terlihat bahwa kita meneruskan nilai variabel ke anotasi. Dan ketika SpringBoot membuat objek bot kita, nilainya akan diambil dari properti (sekali lagi, kertas kalkir dari bahasa Inggris - properti). Kita hampir sampai. Anda perlu membuat bot menjawab sesuatu. Oleh karena itu, mari perbarui metode onUpdateReceived . Kita perlu mengambil pesan yang masuk ke bot dan meneruskannya kembali. Dengan cara ini kita akan mengetahui bahwa bot tersebut 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();
       }
   }
}
Semuanya di sini sangat sederhana: kami memeriksa apakah pesan tersebut benar-benar ada, jadi kami mengekstrak pesan itu sendiri ( message ) dan ID obrolan ( chatId ) tempat korespondensi berlangsung. Selanjutnya, kita membuat objek untuk mengirim pesan SendMessage , meneruskan pesan itu sendiri dan ID obrolan ke sana - yaitu, apa yang akan dikirim ke bot dan ke mana. Kita sudah muak dengan hal ini. Selanjutnya, kita menjalankan metode utama di kelas JavarushTelegramBotApplication dan mencari bot kita di Telegram: "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 10Dari log kita melihat bahwa bot telah dimulai. Jadi, saatnya membuka Telegram dan menulis ke bot: "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 11Kami klik mulai dan kami segera menerima jawaban: "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 12Ayo tulis lagi omong kosong untuk diperiksa: "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 13Dan selesai, pada titik ini kami dapat mengatakan bahwa tugas JRTB-2 kami selesai . Anda belum bisa menulis tes apa pun di sini, jadi kami biarkan semuanya apa adanya. Selanjutnya Anda perlu membuat komit baru: "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 14Perhatikan nama komit: sekali lagi saya menarik perhatian Anda pada hal ini. Komit pertama-tama berisi nama tugas, dan kemudian penjelasan lebih rinci tentang apa yang telah dilakukan. Klik Komit dan Dorong... dan konfirmasikan dengan mengklik Dorong lagi : "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 15Buka proyek kami . Seperti sebelumnya, GitHub telah melihat cabang baru dan menawarkan untuk membuat permintaan tarik untuk main. Kami tidak menolak dan menciptakannya: "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 16Seperti biasa, kami telah memilih label, proyek, dan menugaskannya kepada saya. Terakhir, klik Buat Permintaan Tarik. Mari kita tunggu sebentar sementara pembangunan selesai - dan selesai, permintaan tarik siap untuk digabungkan:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 17

Pembuatan versi

Saya entah bagaimana melewatkan poin bahwa kita perlu melakukan pembuatan versi. Untuk melakukan ini, kami akan membuat beberapa perubahan lagi di cabang kami. Kami kembali ke IDEA dan melihat versi proyek di memori: "Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 18Versinya adalah 0.0.1-SNAPSHOT . Ini adalah versi tugas. Dan kami akan mulai dengan memperbarui versi proyek dengan setiap masalah baru yang terpecahkan. Hingga kami mencapai MVP, versi tersebut akan hadir dengan akhiran -SNAPSHOT. Apa skema versinya? XYZ-SNAPSHOT Dimana:
  • X - pembaruan versi utama, sering kali mengandung masalah kompatibilitas mundur dengan versi sebelumnya;
  • Y - perubahan tidak terlalu besar, sepenuhnya kompatibel dengan versi sebelumnya;
  • Z adalah penghitung cacat yang kami temukan dan perbaiki.
Исходя из этого у нас будет первая version — 0.1.0-SNAPSHOT — то есть, у нас не было еще мажорных обновлений, всего понемногу, и мы еще не вышли в MVP, поэтому есть суффикс -SNAPSHOT. Меняем в помнике это дело:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 19Идем в файл RELEASE_NOTES, где будем описывать изменения проекта с каждой новой версией:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 20Наша первая запись. Теперь при каждом последующем обновлении версии будем здесь описывать что именно произошло. Doing коммит этого дела, пишем описание: JRTB-2: updated project version and added to RELEASE_NOTES Все точно так же, How и до этого. Ждем, пока билд пройдет, и мы сможем смержить наши изменения. Только здесь будет несколько иначе. Я хочу сделать так, чтобы каждая задача в main ветке была отдельным коммитом, поэтому просто нажать в пул-реквест Merge pull request нам не подойдет. В гите есть опция git squash, которая собирает все коммиты в один и мержит. Выбираем эту опцию:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 21Нажимаем Squash and Merge, и нам предлагают еще отредактировать сообщение, которое будет в итоге:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 22Очень удобно и главное, что востребовано. К слову, на битбакете такой фичи я не видел =/ Подтверждаем мерж. Осталась самая малость — перевести задачу в статус Done у нас в доске, написать комментарий со ссылкой на пул-реквест и закрыть его:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 23Наша доска теперь выглядит так:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 24

Вывод

Сегодня мы шаг за шагом создали телеграм-бота и внедрor его в наш SpringBoot проект. Бот работает, отдает ответы. Сделали сразу же доступ к данным бота через проперти. Дальше больше: будем делать большой кусок — выполнять JRTB-3 — добавление Command Pattern для нашего проекта. Ох, еще один нюанс…. Я же говорил, что не буду публиковать token, чтобы им не воспользовались. Но так How я писал статью уже ближе к полуночи и после рабочего дня, то вышло, что я выложил-таки в репозиторий действующий токен, а сказала мне об этом GitGuardian в письме:"Proyek Java dari A hingga Z": menambahkan bot telegram ke proyek - 25Спасибо им за это! What же теперь делать? Удалить из гита уже не получится, так How даже если я накачу новый коммит уже без этого токена, то он все равно останется в старом. А удалять и откатывать назад коммит я не хочу. Поэтому я пошел и деактивировал токен у уже упомянутого BotFather. Теперь токен есть, но он уже недействителен. Подписывайтесь на мой гитхаб аккаунт, чтобы раньше публикации статьи увидеть весь code по ней. Всем спасибо за чтение, до встречи.

Список всех материалов серии в начале этой статьи.

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