JavaRush /Java Blog /Random-ID /Membuat bot Telegram di Java: dari ide hingga penerapan
John Watson
Level 27

Membuat bot Telegram di Java: dari ide hingga penerapan

Dipublikasikan di grup Random-ID
Apa sih bot itu? Anda dapat membaca tentang ini secara detail di sini . Pertama, Anda perlu membaca dokumentasi resmi perpustakaan untuk mengembangkan bot di Telegram (selanjutnya disebut API). Dia berbaring di sini . Membuat bot Telegram di Java: dari ide hingga penerapan - 1Segala sesuatu di sana sangat mudah diakses dan dimengerti. Tampaknya menulis dan bersukacita! Tapi itu tidak sesederhana itu. Setelah banyak menghabiskan waktu di mesin pencari, saya menemukan cuplikan ilmu tentang pengembangan bot, misalnya cara membuat keyboard, proses CallbackQuery, dan sejenisnya. Saya belum pernah menemukan panduan lengkap dan komprehensif untuk mengembangkan bot di Java. Hal inilah yang mendorong saya untuk menulis artikel ini. Ada banyak situs di Internet tempat Anda dapat membuat bot sendiri dengan penerapan yang sudah jadi. Tapi intinya adalah. bahwa sebagian besar diciptakan bot yang dapat memberikan informasi latar belakang dan sebagainya. Bot kami adalah aplikasi web lengkap tempat Anda dapat mengikat database, membuat permintaan ke berbagai API, mengurai situs, melakukan perhitungan rumit, dll. Masalahnya hanya dibatasi oleh imajinasi Anda. Saya berharap pada baris-baris ini saya telah menjelaskan sedikit kepada Anda apa yang akan saya tulis. Mendaftarkan bot di Telegram sangat sederhana; proses ini dijelaskan secara rinci dalam dokumentasi pada tautan di atas. Untuk aplikasi kami Anda hanya perlu mengetahui nama bot dan token yang akan Anda terima saat mendaftar. Pada dasarnya, bot hanyalah aplikasi web konsol. Tanpa frontend, pemrosesan perintah murni. Jika Anda ingin menguasai Hibernate dengan baik atau mempelajari cara mengurai JSON, maka proyek ini cocok untuk Anda. Mari kita mulai dengan memasukkan ketergantungan pada pom.xml (kami berasumsi Anda menggunakan Maven). Anda dapat melakukannya seperti ini:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Kemudian kita membuat sebuah kelas Bot, mewarisinya dari kelas tersebut TelegramLongPollingBot, dan mengganti metode-metodenya:
public class Bot extends TelegramLongPollingBot {

    /**
     * Method for receiving messages.
     * @param update Contains a message from the user.
     */
    @Override
    public void onUpdateReceived(Update update) {
	String message = update.getMessage().getText();
	sendMsg(update.getMessage().getChatId().toString(), message);
    }

    /**
     * Method for setting up a message and sending it.
     * @param chatId chat id
     * @param s The string to send as a message.
     */
    public synchronized void sendMsg(String chatId, String s) {
        SendMessage sendMessage = new SendMessage();
        sendMessage.enableMarkdown(true);
        sendMessage.setChatId(chatId);
        sendMessage.setText(s);
        try {
            sendMessage(sendMessage);
        } catch (TelegramApiException e) {
            log.log(Level.SEVERE, "Exception: ", e.toString());
        }
    }

    /**
     * The method returns the name of the bot specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        returnBotName;
    }

    /**
     * The method returns the bot's token to communicate with the Telegram server
     * @return token for the bot
     */
    @Override
    public String getBotToken() {
        returnBotToken;
    }
}
Nah, isi dari caranya main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Dengan memasukkannya ke dalam metode getBotUsername(), getBotToken()kami meluncurkan bot. Untuk saat ini, dia hanya mengalihkan kepada kita pesan apa pun yang kita kirimkan kepadanya, semacam “cermin”. Semuanya bekerja sebagai berikut: ketika Anda meluncurkan aplikasi, aplikasi mulai mengirimkan permintaan GET ke server Telegram setiap n beberapa detik di URL berikut: https://api.telegram.org/BotToken/getMe, di mana BotToken berada token bot Anda, menerima respons JSON yang berisi semua pesan. Setiap pesan tersebut diproses oleh perpustakaan dan sampai ke metode OnUpdateReceived(Update update)sebagai objek Update. Itulah yang kami kerjakan. Inilah keindahan bot Telegram, mereka dapat bekerja di komputer mana pun, untuk pengujian Anda hanya perlu meluncurkan aplikasi, Anda tidak perlu menyebarkannya ke hosting setelah setiap perubahan. Sangat nyaman. Tentu saja, bot dapat dikonfigurasi untuk bekerja menggunakan webhook; manualnya dapat ditemukan di Internet; untuk kesederhanaan, kami akan bekerja menggunakan LongPolling. Cara memproses pesan dan apa yang harus dikirim sebagai tanggapan hanya dibatasi oleh alat bahasa dan perpustakaan, semuanya terserah Anda. Anda bisa membuat bot yang akan mencari video di YouTube untuk Anda, Anda bisa membuat bot yang setiap hari akan mengirimkan apa yang Anda kirim ke diri Anda sendiri, misalnya dalam setahun, semacam kapsul waktu. Atau Anda dapat mempelajari cara mengintegrasikan ke dalam sistem CRM dan membuat bot untuk usaha kecil, semuanya dibatasi oleh imajinasi Anda. Teruskan. Mereka yang telah menggunakan bot tahu bahwa akan lebih mudah untuk berinteraksi dengan mereka menggunakan perintah yang dimulai dengan tanda «/», misalnya /start. Tapi ada cara yang lebih nyaman - tombol. Ada dua jenis tombol: tombol yang muncul di bawah kolom masukan, ReplyKeyboardMarkupdan tombol yang muncul tepat di bawah pesan yang ditautkan InlineKeyboardMarkup. Dalam dokumentasi Anda dapat membaca secara singkat deskripsinya. BalasanKeyboardMarkup. Pada dasarnya ini adalah array dari array tombol, List<KeyboardRow<KeyboardButton>>. Berikut adalah contoh kode yang membuat keyboard
public synchronized void setButtons(SendMessage sendMessage) {
        // Create a keyboard
        ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
        sendMessage.setReplyMarkup(replyKeyboardMarkup);
        replyKeyboardMarkup.setSelective(true);
        replyKeyboardMarkup.setResizeKeyboard(true);
        replyKeyboardMarkup.setOneTimeKeyboard(false);

        // Create a list of keyboard strings
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First line of the keyboard
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first line of the keyboard
        keyboardFirstRow.add(new KeyboardButton(“Привет”));

        // Second line of the keyboard
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add buttons to the second line of the keyboard
        keyboardSecondRow.add(new KeyboardButton(“Помощь”);

        // Add all keyboard strings to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and set this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
Dalam suatu metode sendMsg(), kita memanggil metode ini dengan meneruskan pesan ke metode tersebut, sehingga menyetel keyboard untuk pesan tersebut. Saat kami mengirimkan pesan ini kepada pengguna, dia akan melihat teks pesan yang kami atur, serta 2 tombol bertuliskan Halo dan Bantuan, bersebelahan. Dengan mengklik tombol-tombol ini, sebuah pesan akan dikirim ke bot, yang teksnya sesuai dengan yang tertulis di tombol tersebut. Artinya, jika klien mengklik “Bantuan”, bot akan menerima pesan dengan teks “Bantuan”. Baginya, seolah-olah klien sendiri yang menulis teks “Bantuan” dan mengirimkannya kepadanya. Nah, kemudian Anda memproses pesan tersebut. InlineKeyboardMarkup Ini juga merupakan array dari array, mirip dengan Markup sebelumnya, tetapi logika pengoperasian di sini sedikit berbeda. Papan ketik seperti itu terikat pada pesan tertentu dan hanya ada untuk pesan itu. Berikut adalah metode untuk menginstal keyboard Inline
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText(“Кнопка“).setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
Buat Listdi List, tambahkan tombol Inline ke baris pertama. Tombol tersebut dapat berisi URL, tautan ke saluran, atau CallbackQuery, yang akan saya tulis nanti. Di sini kita mengatur teks untuk tombol kita yang akan dilihat pengguna dan kemudian mengatur data yang akan dikirim ke bot. Dalam contoh kita, pengguna melihat “Halo”, dan ketika diklik, bot akan dikirimi nomor 17, ini adalah nomor CallbackQuery. Beberapa kata tentang CallbackQuery. Untuk mendapatkan data tersebut dari suatu objek, UpdateAnda perlu menjalankan update.getCallbackQuery(), metode ini mengembalikan CallbackQuery, dari mana Anda sudah bisa mendapatkan data yang ditransfer ke bot. Tidak perlu mencoba mendapatkan data ini melalui metode update.getMessage().getText(), dapatkan NullPointerException.
@Override
    public void onUpdateReceived(Update update) {
        if(update.hasMessage()) {
            ThreadClass thread = new ThreadClass(update.getMessage());
        } else  if(update.hasCallbackQuery()) {
            AnswerCallbackThread answerThread = new AnswerCallbackThread(update.getCallbackQuery());
        }
    }
Jika ada pesan, kami mengirim pesan untuk diproses ke thread baru; jika ada pesan CallbackQuery, kami mengirimkannya untuk diproses ke thread yang sesuai. Anda CallbackQuerydapat mengirim balasan. Setiap objek di Telegram memiliki idnya masing-masing. Untuk mengirim respons ke objek tertentu, CallbackQuerykita hanya perlu mengetahui idnya, yang akan kita terima dari objek terkait. Untuk mengirim respons, panggil metode ini:
public synchronized void answerCallbackQuery(String callbackId, String message) {
        AnswerCallbackQuery answer = new AnswerCallbackQuery();
        answer.setCallbackQueryId(callbackId);
        answer.setText(message);
        answer.setShowAlert(true);
        try {
            answerCallbackQuery(answer);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
PENTING:Teks dalam jawaban CallbackQuerytidak boleh lebih dari 200 karakter! Saat mengirimkan tanggapan seperti itu, klien akan menerima jendela pop-up di mana pesan akan ditulis. Jendela seperti itu mungkin hilang beberapa detik setelah muncul, atau mungkin terhenti hingga pengguna menekan OK. Untuk mengganti mode ini, kami memanggil answer.setShowAlert(true). Saat truejendela hang hingga Anda menekan OK, saat falseitu menghilang setelah 5 detik. Pada prinsipnya, ini semua adalah fitur dasar perpustakaan bot Telegram. Jika mau, Anda dapat mempelajari hal-hal seperti mengirim multimedia, geolokasi, dll. dari dokumentasi. Mari beralih ke penerapan bot kita di hosting. Untuk proyek saya, saya memilih Heroku, karena menurut saya ini adalah hosting yang cukup nyaman dan memiliki CLI sendiri. Ini gratis, tetapi jika terus begini, bot Anda akan memasuki mode hibernasi setelah 30 menit jika tidak ada permintaan. Ketika permintaan dikirimkan kepadanya, dia bangun. Ini terjadi cukup cepat, Anda bahkan tidak akan menyadarinya (kecuali, tentu saja, koneksi ke database dibuat kembali). Batasan paket gratis adalah database 5MB, ruang disk 100MB, lalu lintas 2TB per bulan, 1 dino. Dino adalah aplikasi Anda yang sedang berjalan. Saya harus segera mengatakan bahwa tahap penerapanlah yang menyebabkan kesulitan bagi saya, karena saya belum pernah menerapkan aplikasi saya sebelumnya. Saat diterapkan, Heroku memerlukan file bernama Procfile (tanpa ekstensi). worker: sh target/bin/workerBot Kami membuatnya di root proyek, tulis workBot di sana - nama yang kami tentukan di pom.xml Skrip sh yang dibuat menggunakan plugin Maven appassembler-maven-plugin akan diluncurkan. Skrip menjelaskan cara menjalankan toples yang dikompilasi. Nama kelas yang akan diluncurkan ditunjukkan antara <mainClass></mainClass>, nama skrip antara <name></name> pom.xml:
...
<build>
    <plugins>
        ...
       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.1.1</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory>
                <programs>
                    <program>
                        <mainClass>com.home.server.TelegramBot</mainClass>
                        <name>workerBot</name>
                    </program>
                </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Sebelum memulai proses ini, Anda harus mendaftar di Heroku, menginstal Git dan Heroku CLI. Jika aplikasi Anda memerlukan database, maka pada saat mendaftarkan aplikasi baru jangan lupa untuk menambahkan database yang Anda perlukan. Selanjutnya, Anda perlu mengetahui host, nama pengguna, kata sandi, dan port database Anda, lalu menentukannya di aplikasi Anda. Selanjutnya, sebelum menerapkan, bangun proyek Anda menggunakan Maven.
mvn clean install
Untuk memulainya, kita masuk ke direktori proyek kita, inisialisasi repositori dengan perintahgit init Kemudian kita menambahkan proyek kita ke repositori ini
git add .
Setelah kami melakukan perubahan
git commit -m “First commit in project”
Selanjutnya Anda harus masuk ke heroku, tulis di baris perintah
heroku login
Masukkan data Anda yang ditentukan saat pendaftaran. Maka Anda perlu mengetahui URL repositori Anda di Heroku, ini dilakukan di pengaturan. Lalu kita menulis
git remote add heroku [url]
Repositori jarak jauh heroku akan ditambahkan ke repositori Anda. Selanjutnya kita menulis
git push heroku master
Kami menunggu... Jika penerapan aplikasi berhasil, kami menjalankan perintah
heroku ps:scale worker=1
Dan selesai, aplikasi Anda sudah berjalan. Jika hal ini tidak terjadi, perhatikan baik-baik lognya; kemungkinan besar ada kesalahan pada aplikasi Anda yang menyebabkannya mogok. Terima kasih telah membaca artikel yang begitu panjang, saya harap ada yang merasakan manfaatnya dan menghemat banyak waktu di tempat saya tersandung selama pengembangan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION