CodeGym /Java Blog /Acak /Membuat Bot Telegram di Java: dari konsep hingga penerapa...
John Squirrels
Level 41
San Francisco

Membuat Bot Telegram di Java: dari konsep hingga penerapan

Dipublikasikan di grup Acak
Jadi apa itu bot? Anda dapat membaca lebih lanjut tentang ini di sini . Untuk memulai, Anda perlu meninjau dokumentasi resmi perpustakaan yang digunakan untuk mengembangkan bot Telegram (selanjutnya disebut "API"). Itu dapat ditemukan di sini .
Membuat Bot Telegram di Jawa: dari konsep hingga penerapan - 1
Semua yang ada di sana sangat mudah diakses dan jelas. Sepertinya kita bisa menulis kode dan bersukacita! Tapi itu tidak begitu sederhana. Setelah menghabiskan banyak waktu mencari, saya telah menemukan sedikit pengetahuan tentang pengembangan bot, misalnya cara membuat keyboard, menanganiCallbackQuery, Dan seterusnya. Tapi, saya tidak menemukan panduan yang lengkap dan lengkap untuk pengembangan bot Java. Itu mendorong saya untuk menulis artikel ini. Ada banyak situs web tempat Anda dapat membuat bot Anda sendiri yang dapat digunakan dengan mudah. Namun faktanya, sebagian besar bot yang dibuat memberikan informasi referensi dan sejenisnya. Bot kami adalah aplikasi web lengkap. Anda dapat mengikat basis data, menjalankan berbagai permintaan API, mengurai situs web, melakukan perhitungan rumit, dan banyak lagi. Kemungkinannya hanya dibatasi oleh imajinasi Anda. Saya harap penjelasan di atas telah membantu memperjelas apa yang akan saya tulis. Sangat mudah untuk mendaftarkan bot di Telegram. Proses ini dijelaskan secara rinci dalam dokumentasi yang ditautkan di atas. Untuk aplikasi kami, Anda hanya perlu mengetahui nama bot dan token yang Anda terima saat mendaftarkan bot. Pada dasarnya, bot hanyalah aplikasi web berbasis konsol. Tidak ada ujung depan, hanya pemrosesan perintah murni. Jika Anda ingin menguasaiHibernasi atau pelajari cara mengurai JSON , maka ini adalah proyek untuk Anda. Mari kita mulai dengan menambahkan dependensi ke pom.xml(saya anggap Anda menggunakan Maven). Anda dapat melakukannya seperti ini:

<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Kemudian buat Botkelas yang mewarisi TelegramLongPollingBotkelas tersebut, dan ganti 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 creating a message and sending it.
     * @param chatId chat id
     * @param s The String that you want 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());
        }
    }

    /**
     * This method returns the bot's name, which was specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        return "BotName";
    }

    /**
     * This method returns the bot's token for communicating with the Telegram server
     * @return the bot's token
     */
    @Override
    public String getBotToken() {
        return "BotToken";
    }
}
Dan sekarang isi dari mainmetode ini:

public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Setelah mengisi getBotUsername()dan getBotToken()metode, mulai bot. Untuk saat ini, itu hanya mengalihkan ke kami pesan apa pun yang kami kirim ke sana, seperti " cermin ". Ini berfungsi seperti ini: ketika Anda memulai aplikasi, itu mulai mengirim permintaan ke server Telegram, setiap n detik sekali, di URL berikut: https://api.telegram.org/BotToken/getMe , di mana BotToken adalah token bot Anda . Sebagai tanggapan, ia menerima JSON yang berisi semua pesan. Setiap pesan ini diproses oleh pustaka dan diteruskan ke OnUpdateReceived(Update update)metode sebagaiUpdateobyek. Dan itulah yang kami kerjakan. Di sinilah letak keindahan bot Telegram: mereka dapat berjalan di komputer mana pun, mengujinya hanya perlu memulai aplikasi, dan Anda tidak perlu menerapkannya ke host setelah setiap perubahan. Ini sangat nyaman. Tentu saja, Anda dapat mengonfigurasi bot agar berfungsi menggunakan webhook. Anda dapat menemukan petunjuk untuk itu di Internet. Untuk kesederhanaan, kami akan menggunakan LongPolling. Bagaimana pesan diproses dan apa yang Anda kirim sebagai tanggapan hanya dibatasi oleh kemampuan bahasa dan perpustakaan. Segala sesuatu yang lain terserah Anda. Anda dapat membuat bot yang akan mencari video YouTube untuk Anda. Anda dapat membuat bot yang akan mengirimkan apa yang Anda kirim sendiri setiap hari, seperti kapsul waktu setahun yang lalu. Atau Anda dapat belajar untuk berintegrasi dengan sistem CRM dan membuat bot untuk bisnis kecil—Anda hanya dibatasi oleh imajinasi Anda. Bergerak. Mereka yang pernah menggunakan bot tahu bahwa berinteraksi dengan bot itu nyaman menggunakan perintah yang dimulai dengan karakter " /", misalnya, /start. Tapi ada cara yang lebih nyaman: tombol. Ada dua jenis tombol: tombol yang muncul di bawah kolom input ( ReplyKeyboardMarkup) dan tombol yang berada tepat di bawah pesan yang ditautkan (InlineKeyboardMarkup). Anda bisa mendapatkan pemahaman dasar tentang mereka dari deskripsi mereka dalam dokumentasi.

BalasKeyboardMarkup

Pada kenyataannya, ini adalah larik dari larik tombol: List<KeyboardRow <KeyboardButton>>. Berikut 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 rows
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First keyboard row
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first keyboard row
        keyboardFirstRow.add(new KeyboardButton("Hi"));

        // Second keyboard row
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add the buttons to the second keyboard row
        keyboardSecondRow.add(new KeyboardButton("Help");

        // Add all of the keyboard rows to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and assign this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
Kami memanggil metode ini dalam sendMsg()metode, setelah menyampaikan pesan. Beginilah cara kami menyiapkan keyboard untuk pesan itu. Saat kami mengirim pesan ini ke pengguna, dia akan melihat teks pesan kami dan 2 tombol bertuliskan "Hai" dan "Bantuan" , satu di bawah yang lain. Ketika salah satu tombol ini diklik, bot dikirimi pesan yang berisi teks tombol. Jadi, jika klien mengklik "Bantuan" , bot akan menerima pesan dengan "Bantuan". Untuk bot, tampaknya klien sendiri yang menulis "Bantuan" dan mengirim teks ke bot. Dan kemudian Anda memproses pesan.

InlineKeyboardMarkup

Ini juga merupakan array dari array. Ini mirip dengan Markup sebelumnya, tetapi logikanya bekerja sedikit berbeda di sini. Jenis keyboard ini dilampirkan ke pesan tertentu dan hanya ada untuk itu. Berikut adalah metode untuk menyiapkan keyboard sebaris:

private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
Buat a Listdi dalam List, dan tambahkan tombol sebaris ke baris pertama. Tombol ini dapat berisi URL, tautan ke saluran, atau , CallbackQueryyang akan saya tulis nanti. Di sinilah kami mengatur teks tombol kami, yang akan dilihat pengguna, dan kemudian kami mengatur data yang akan dikirim ke bot. Dalam contoh kami, pengguna melihat "Hai", dan saat tombol ditekan, angka 17 akan dikirim ke bot. Ini milik kami CallbackQuery. Beberapa kata tentang CallbackQuery. Untuk mendapatkan data ini dari Updateobjek, Anda perlu mengeksekusi update.getCallbackQuery(). Metode ini mengembalikan a CallbackQuery, dari mana Anda dapat mengakses data yang diteruskan ke bot. Jangan mencoba mendapatkan data ini melalui update.getMessage().getText()metode—Anda akan mendapatkan file 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 mengirimkannya ke utas baru untuk diproses; jika ada CallbackQuery, kami kirim ke thread yang sesuai untuk diproses. Anda dapat mengirim tanggapan ke a CallbackQuery. Setiap objek di Telegram memiliki idnya masing-masing. Untuk mengirim respons ke tertentu CallbackQuery, Anda hanya perlu mengetahui idnya, yang kami dapatkan dari objek yang sesuai. Untuk mengirim respons, kami memanggil 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 tanggapan terhadap a CallbackQuerytidak boleh lebih dari 200 karakter! Setelah mengirimkan respons seperti itu, klien akan melihat jendela pop-up yang berisi pesan tersebut. Jendela ini dapat menghilang beberapa detik setelah muncul, atau dapat bertahan hingga pengguna menekan OK. Untuk beralih mode, kami memanggil answer.setShowAlert(true)metode. Jika Anda meneruskan trueke metode, jendela tetap ada hingga OK ditekan. Jika Anda salah, maka itu akan hilang setelah 5 detik. Ini semua adalah fitur dasar perpustakaan Telegram Bot . Jika mau, Anda dapat mempelajari hal-hal seperti cara mengirim multimedia, geolokasi, dll. Mari beralih ke penerapan bot kami ke platform hosting. Untuk proyek saya, saya memilih Heroku. Saya pikir ini adalah platform hosting yang cukup nyaman dengan CLI-nya sendiri. Gratis, tetapi pada paket ini bot Anda akan hibernasi setelah 30 menit tidak menerima permintaan. Itu akan bangun ketika permintaan diterima. Ini terjadi begitu cepat, Anda bahkan tidak menyadarinya (kecuali, tentu saja, koneksi database tidak dimulai ulang). Paket gratis dibatasi oleh database 5MB, ruang disk 100MB, data 2TB per bulan, dan 1 dyno. Dyno adalah aplikasi Anda yang sedang berjalan. Saya akan langsung mengatakan bahwa penyebaranlah yang menyebabkan saya kesulitan, karena saya belum pernah menerapkan aplikasi saya sebelumnya. Selama penerapan, Heroku memerlukan file bernama Procfile (tanpa ekstensi). Kami membuatnya di root proyek. Di dalam, kita menulis worker: sh target/bin/workerBot, di mana workerBot adalah nama yang ditentukan di pom.xml. Sebuah shskrip, yang dibuat oleh Plugin Assembler Aplikasi Maven (appassembler-maven-plugin), akan diluncurkan. Skrip menjelaskan cara meluncurkan file jar yang dikompilasi. Nama kelas yang akan diluncurkan ditentukan di antara <mainClass>dan </mainClass>, sedangkan nama skrip diberikan di antara <name>dan </name>di 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 , dan menginstal Git dan Heroku CLI . Jika aplikasi Anda membutuhkan database, jangan lupa untuk menambahkan database yang diperlukan saat Anda membuat aplikasi baru. Selanjutnya, Anda perlu menentukan host, nama pengguna, kata sandi, dan port untuk database Anda, dan kemudian menunjukkannya di aplikasi Anda. Selanjutnya, sebelum menerapkan, bangun proyek Anda menggunakan Maven .

mvn clean install
Pertama, kita pergi ke direktori proyek kita dan menginisialisasi repositori dengan perintah git init. Kemudian kami menambahkan proyek kami ke repositori ini.

git add .
Kemudian kami melakukan perubahan

git commit -m "First commit in the project"
Selanjutnya, Anda harus masuk ke heroku. Tulis yang berikut ini di baris perintah

heroku login
Masukkan kredensial yang Anda buat saat pendaftaran. Setelah itu, tentukan URL repositori Anda di heroku. Anda melakukan ini di pengaturan. Lalu kita menulis

git remote add heroku [url]
Repositori heroku jarak jauh ditambahkan untuk repositori Anda. Selanjutnya kita menulis

git push heroku master
Lalu kita tunggu… jika aplikasi berhasil di-deploy, jalankan perintah berikut

heroku ps:scale worker=1
Dan itu saja, aplikasi Anda aktif dan berjalan. Jika tidak, lihat log dengan hati-hati. Kemungkinan besar, kesalahan dalam aplikasi Anda menyebabkannya gagal. Terima kasih telah membaca artikel yang begitu panjang. Saya harap seseorang akan merasakan manfaatnya dan ini akan menghemat banyak waktu Anda di area yang membuat saya kesulitan selama pengembangan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION