Instruksi TelegramBot untuk membuat fungsionalitas dasar untuk bot. (Bagian 1)

Belum lama ini saya menyarankan Anda menggunakan bot telegram saya.

Telegram Bot - Asisten Perencanaan Acara

Setelah menerima banyak pertanyaan di PM, saya menyadari bahwa pertanyaan membuat bot untuk Telegram cukup populer.

Mereka bertanya kepada saya kode sumber bot, diminta untuk berbagi contoh spesifik penerapan berbagai fitur bot, meminta saya menyarankan beberapa jenis fungsi untuk bekerja dengan bot dan pesan.

Saya memutuskan untuk menulis serangkaian artikel di mana saya ingin menunjukkan hal-hal dasar yang Anda perlukan untuk menulis bot Anda.
Java, Maven, TelegramAPI, Lombok, dan Log4j menunggu Anda.
Siapa yang peduli - tolong, di bawah kucing ...

Dan saya akan langsung dari kartu truf :)

Apa yang diminta di artikel sebelumnya.

Anda dapat menemukan kode sumber untuk proyek di sini .

Di cabang " master " akan ada versi terakhir dari bot, yang akan kami tulis bersama Anda dalam proses penampilan artikel baru.

Sumber lengkap untuk artikel ini akan berada di cabang " Part1-Base ".

Di bagian ini, kami akan membuatkan Anda template dasar yang dapat:

  1. daftar bot di server Telegram
  2. menerima pesan yang ditulis ke bot
  3. menanggapi perintah / mulai

Buat proyek pakar standar


( Saya akan melewatkan manual tentang bekerja dengan lingkungan pengembangan dan hal-hal dasar dari pemrograman Java. Semua hal ini cukup mudah untuk google. Dan jika tidak berhasil, tulis pertanyaan ).

Mari kita lihat dependensi apa yang akan kita butuhkan dalam proyek ini.

Pertama-tama, ini adalah Lombok . Apa ini dan mengapa - Anda dapat membaca, misalnya, di sini .

Dan pastikan untuk menambahkan logger. Saya menggunakan log4j dan sedikit lebih jauh saya akan menunjukkan kepada Anda betapa bermanfaatnya itu dapat digunakan ketika men-debug aplikasi ini dan pemahaman yang lebih dalam tentang pengoperasian TelegramAPI.

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 

Dan karena kami menulis bot untuk Telegram, lalu perpustakaan itu sendiri dari Telegram:

 <dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>3.5</version> </dependency> 

Struktur file pom dapat ditemukan di sini.
Struktur file pom.xml dapat dilihat di sini .

Selanjutnya, kami menambahkan kelas dasar Bot.java , yang akan mengimplementasikan semua interaksi kami dengan layanan Telegram. Kami akan bekerja dengan LongPolling, sebagai Metode ini tidak memerlukan sertifikat enkripsi dan dapat diluncurkan dari mesin apa pun yang menggunakan Java.

Untuk melakukan ini, kita mewarisi dari kelas TelegramLongPollingBot dan menerapkan metode dasar:

public void onUpdateReceived (Perbarui pembaruan)
public String getBotUsername ()
public String getBotToken ()

Dan dari diri kita sendiri kita perlu menambahkan prosedur yang akan menghubungkan bot kita ke TelegramAPI:

public void botConnect ()

 import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.apache.log4j.Logger; import org.telegram.telegrambots.TelegramBotsApi; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; @AllArgsConstructor @NoArgsConstructor public class Bot extends TelegramLongPollingBot { private static final Logger log = Logger.getLogger(Bot.class); final int RECONNECT_PAUSE =10000; @Setter @Getter String userName; @Setter @Getter String token; @Override public void onUpdateReceived(Update update) { // TODO: 11/18/2019     log.debug("new Update recieve"); } @Override public String getBotUsername() { return userName; } @Override public String getBotToken() { return token; } public void botConnect() { TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); try { telegramBotsApi.registerBot(this); log.info("TelegramAPI started. Look for messages"); } catch (TelegramApiRequestException e) { log.error("Cant Connect. Pause " + RECONNECT_PAUSE / 1000 + "sec and try again. Error: " + e.getMessage()); try { Thread.sleep(RECONNECT_PAUSE); } catch (InterruptedException e1) { e1.printStackTrace(); return; } botConnect(); } } } 

Pada prinsipnya, semuanya. Kode ini dapat terhubung ke server Telegram dan setelah menerima pesan yang ditujukan kepadanya, ia akan mencatat informasi dalam file log yang diterima Pembaruan.

Mari kita buat kelas yang akan menjalankan aplikasi kita.

Ini akan dilakukan oleh kelas App.java. Tautan ke file: di sini

 package com.example.telegrambot; import com.example.telegrambot.bot.Bot; import org.apache.log4j.Logger; import org.telegram.telegrambots.ApiContextInitializer; public class App { private static final Logger log = Logger.getLogger(App.class); public static void main(String[] args) { ApiContextInitializer.init(); Bot test_habr_bot = new Bot("test_habr_bot", "1012522162:AAHLvPVqKF48LdqnsvS3l5YrJfvFey6dBa0"); test_habr_bot.botConnect(); } } 

Seperti yang Anda lihat, agar bot berfungsi, kita hanya perlu "nama bot" dan "token", yang akan kita lewati dalam konstruktor kelas Bot kita.

Anda bisa mendapatkan nama dan token untuk bot dari ayah semua bot :) dengan menulis kepadanya di telegram.
Nama panggilannya: @BotFather
Komunikasi dengannya sangat sederhana dan ringkas.

Atas perintah
/ newbot

Akibatnya, Anda harus mendapatkan dialog ini:



Mereka juga menulis di sini bahwa ini lebih akurat, tidak menunjukkan informasi ini kepada siapa pun, jika tidak orang lain akan dapat mengontrol bot Anda :)

Anda akan mengatakan bahwa saya tidak terlalu akurat ... Mungkin, tetapi ayah bot memungkinkan kami untuk mengubah token dan mengingat yang ada di akses publik. Karena itu, ketika Anda mencoba terhubung dengan data saya, Anda akan menerima pesan berikut:

 2019-12-04 13:44:25,252[DEBUG][main ][ com.example.telegrambot.bot.Bot] - Bot token: 1012522162:AAF5D49N4NreEJfCk0aOsC-UnmIu_GLkoyc 2019-12-04 13:44:26,613[ERROR][main ][ com.example.telegrambot.bot.Bot] - Cant Connect. Pause 10sec and try again. Error: Error removing old webhook 

Jadi dengan data saya Anda tidak dapat terhubung. Daftarkan milik Anda. Tentukan data baru di App.java kelas

Sekarang dengan menjalankan metode utama di kelas App, kami membiarkan bot kami terhubung dan menunggu pesan baru. Dia akan menulis kepada kami tentang tindakan dan upayanya di konsol.

Log4j


Ingat, di atas saya berbicara tentang utilitas perpustakaan log4j. Dan di sini untuk yang ingin tahu, klondike data berguna terbuka.

File log4j.properties sudah berisi pengaturan dasar untuk pencatatan dan tingkat pencatatan khusus untuk kelas pihak ketiga dan bagi mereka yang bekerja di bot kami.

 log4j.rootLogger= error, file log4j.logger.com.example.telegrambot.App = debug, stdout log4j.logger.com.example.telegrambot.bot.Bot = debug, stdout 

Tingkat dasar logging diindikasikan sebagai Kesalahan.

Untuk kelas Bot dan Aplikasi, keluaran log di level Debug ditunjukkan.

Apa level-level ini dan perbedaannya - Anda dapat dengan mudah menemukannya di Google.

Jika Anda ingin melihat bagaimana dan dalam urutan apa perpustakaan Telegram menyelesaikan semua tindakan Anda, alihkan mode logging umum ke tingkat yang lebih rendah: info atau debug.

Dan ketika Anda memulai aplikasi, Anda akan melihat di konsol berapa banyak hal menarik terjadi dalam proses menghubungkan, bekerja. Berapa kali fungsi Anda disurvei dengan nama bot dan token.

Level logging berubah dengan baris ini:
Untuk mendapatkan log sesuai dengan tingkat info, masukkan seperti ini:

 log4j.rootLogger= info, file 

Untuk level debug, seperti ini:

 log4j.rootLogger= debug, file 

Dan sebagai kesimpulan


Sekarang kami memiliki bot: itu terhubung, menunjukkan kepada kami log yang indah dan melaporkan bahwa pesan datang kepadanya.

Tetapi di atas, saya berjanji kepada Anda bahwa bot akan menanggapi perintah mulai. Mari kita ubah sedikit prosedur yang bertanggung jawab untuk memproses pesan yang diterima.

 @Override public void onUpdateReceived(Update update) { log.debug("Receive new Update. updateID: " + update.getUpdateId()); Long chatId = update.getMessage().getChatId(); String inputText = update.getMessage().getText(); if (inputText.startsWith("/start")) { SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Hello. This is start message"); try { execute(message); } catch (TelegramApiException e) { e.printStackTrace(); } } } 

Seperti yang dapat Anda lihat dari kode, bot melakukan hal berikut:

  • Ia menerima pembaruan dan menangkap nomor id dalam log.
  • Mengambil ID obrolan dan teks pesan dari pesan yang dikirim
  • Cek apakah teks ini adalah perintah "/ mulai"
  • Dan jika perbandingan berhasil, ia membuat pesan sebagai respons dan mengirimkannya ke obrolan, dengan ID yang diterima sebelumnya

Semoga bermanfaat dan menarik.

Di masa depan saya akan menunjukkan kepada Anda bagaimana ini diterapkan di bot saya:

  • penggunaan berbagai tim
  • mengikat perintah-perintah ini ke penangan
  • multithreading: menerima dan mengirim pesan secara mandiri
  • pemformatan pesan
  • bekerja dengan tombol dan panggilan balik
  • mengedit posting lama

Atas dasar ini, dalam akses publik, 2 bot saya sekarang berfungsi untuk saya.

Satu hal yang Anda tahu adalah asisten perencanaan acara .

Dan yang kedua - penggemar film Cheeky . Dia suka film dan tahu banyak tentang mereka. Dan bahkan dia lebih suka membagikan ilmunya dengan Anda. Dia memimpin salurannya dalam sebuah telegram , di mana dia memutuskan film mana yang dia sukai dan menawarkannya kepada Anda. Dia tahu cara membuat pilihan individu berdasarkan genre dan membuat berlangganan rekomendasi yang dipersonalisasi. Dia tahu bagaimana menemukan karya agung yang belum pernah Anda dengar dan bahkan tidak tahu bagaimana film seperti itu dapat ditemukan sama sekali.

Misalnya, apakah menurut Anda ada film dengan kombinasi genre "liar" seperti: dokumenter, horor, komedi.

Tapi bot di perintah

      2010- 

Dia akan mengatakan bahwa dari 2010 hingga saat ini film-film tersebut telah diambil sebanyak 6 buah :)

Cara bekerja dengan perintah serupa, cara mengurai string dan urutan perintah yang akan kami diskusikan dengan Anda dalam publikasi berikut.

Terima kasih atas perhatian anda Pemrograman itu menyenangkan :)

Source: https://habr.com/ru/post/id476306/


All Articles