CodeGym/Blog Java/rawak/Mencipta Bot Telegram di Jawa: dari konsep hingga penggun...
John Squirrels
Tahap
San Francisco

Mencipta Bot Telegram di Jawa: dari konsep hingga penggunaan

Diterbitkan dalam kumpulan
Jadi apa itu bot? Anda boleh membaca lebih lanjut mengenai perkara ini di sini . Untuk memulakan, anda perlu menyemak dokumentasi rasmi untuk perpustakaan yang digunakan untuk membangunkan bot Telegram (selepas ini "API"). Ia boleh didapati di sini .
Mencipta Bot Telegram di Java: dari konsep hingga penggunaan - 1
Segala-galanya di sana sangat mudah diakses dan jelas. Nampaknya kita hanya boleh menulis kod dan bergembira! Tetapi ia tidak begitu mudah. Selepas menghabiskan banyak masa mencari, saya telah menemui maklumat tentang pembangunan bot, contohnya, cara membuat papan kekunci, mengendalikanCallbackQuery, dan sebagainya. Tetapi, saya tidak menemui panduan lengkap dan lengkap untuk pembangunan bot Java. Itu mendorong saya untuk menulis artikel ini. Terdapat banyak tapak web di mana anda boleh membuat bot anda sendiri yang boleh digunakan dengan mudah. Tetapi hakikatnya, kebanyakan bot yang dibuat memberikan maklumat rujukan dan seumpamanya. Bot kami ialah aplikasi web yang lengkap. Anda boleh mengikat pangkalan data, melaksanakan pelbagai permintaan API, menghuraikan tapak web, melakukan pengiraan yang rumit dan banyak lagi. Kemungkinan hanya terhad oleh imaginasi anda. Saya harap perkara di atas telah membantu menjelaskan perkara yang akan saya tulis. Sangat mudah untuk mendaftar bot di Telegram. Proses ini diterangkan secara terperinci dalam dokumentasi yang dipautkan di atas. Untuk permohonan kami, anda hanya perlu mengetahui nama bot dan token yang anda terima semasa mendaftar bot. Pada asasnya, bot hanyalah aplikasi web berasaskan konsol. Tiada bahagian hadapan, hanya pemprosesan arahan tulen. Jika anda ingin menguasaiHibernate atau pelajari cara menghuraikan JSON , maka ini adalah projek untuk anda. Mari mulakan dengan menambah kebergantungan kepada pom.xml(saya akan menganggap anda menggunakan Maven). Anda boleh melakukannya seperti ini:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Kemudian buat Botkelas yang mewarisi TelegramLongPollingBotkelas, dan ganti kaedahnya:
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 kandungan kaedah main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Selepas mengisi kaedah getBotUsername()dan getBotToken(), mulakan bot. Buat masa ini, ia hanya mengubah hala kepada kami sebarang mesej yang kami hantar kepadanya, seperti " cermin ". Ia berfungsi seperti ini: apabila anda memulakan aplikasi, ia mula menghantar permintaan ke pelayan Telegram, sekali setiap n saat, di URL berikut: https://api.telegram.org/BotToken/getMe , di mana BotToken ialah token bot anda . Sebagai tindak balas, ia menerima JSON yang mengandungi semua mesej. Setiap mesej ini diproses oleh perpustakaan dan dihantar ke OnUpdateReceived(Update update)kaedah sebagaiUpdateobjek. Dan itulah yang kami kerjakan. Di sinilah terletaknya keindahan bot Telegram: ia boleh dijalankan pada mana-mana komputer, mengujinya hanya memerlukan memulakan aplikasi, dan anda tidak perlu menggunakan ia ke hos selepas setiap perubahan. Ini sangat mudah. Sudah tentu, anda boleh mengkonfigurasi bot untuk berfungsi menggunakan webhooks. Anda boleh mendapatkan arahan untuk itu di Internet. Untuk memudahkan, kami akan menggunakan LongPolling. Cara mesej diproses dan apa yang anda hantar sebagai balasan hanya dihadkan oleh keupayaan bahasa dan perpustakaan. Segala-galanya terpulang kepada anda. Anda boleh membuat bot yang akan mencari video YouTube untuk anda. Anda boleh membuat bot yang akan menghantar apa yang anda hantar sendiri setiap hari, seperti kapsul masa setahun yang lalu. Atau anda boleh belajar untuk menyepadukan dengan sistem CRM dan membuat bot untuk perniagaan kecil—anda hanya dihadkan oleh imaginasi anda. Bergerak. Mereka yang telah menggunakan bot tahu bahawa adalah mudah untuk berinteraksi dengan mereka menggunakan arahan yang bermula dengan /aksara " ", contohnya, /start. Tetapi ada cara yang lebih mudah: butang. Terdapat dua jenis butang: butang yang muncul di bawah medan input ( ReplyKeyboardMarkup) dan butang yang berada betul-betul di bawah mesej yang dipautkannya (InlineKeyboardMarkup). Anda boleh mendapatkan pemahaman asas tentang mereka daripada penerangan mereka dalam dokumentasi.

ReplyKeyboardMarkup

Pada hakikatnya, ini ialah susunan tatasusunan butang: List<KeyboardRow <KeyboardButton>>. Berikut ialah contoh kod yang mencipta papan kekunci:
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 kaedah ini dalam sendMsg()kaedah, selepas menyampaikannya sebagai mesej. Beginilah cara kami menyediakan papan kekunci untuk mesej itu. Apabila kami menghantar mesej ini kepada pengguna, dia akan melihat teks mesej kami dan 2 butang yang menyatakan "Hai" dan "Bantuan" , satu di bawah yang lain. Apabila salah satu daripada butang ini diklik, bot akan menghantar mesej yang mengandungi teks butang. Jadi, jika pelanggan mengklik "Bantuan" , bot akan menerima mesej dengan "Bantuan". Kepada bot, nampaknya pelanggan itu sendiri menulis "Bantuan" dan menghantar teks kepada bot. Dan kemudian anda memproses mesej.

InlineKeyboardMarkup

Ini juga merupakan susunan tatasusunan. Ia serupa dengan Markup sebelumnya, tetapi logiknya berfungsi sedikit berbeza di sini. Papan kekunci jenis ini dilampirkan pada mesej tertentu dan hanya wujud untuknya. Berikut ialah kaedah untuk menyediakan papan kekunci 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 Listdalam List, dan tambah butang sebaris pada baris pertama. Butang ini boleh mengandungi URL, pautan ke saluran atau CallbackQuery, yang akan saya tulis sedikit kemudian. Di sinilah kami menetapkan teks butang kami, yang akan dilihat oleh pengguna, dan kemudian kami menetapkan data yang akan dihantar ke bot. Dalam contoh kami, pengguna melihat "Hai", dan apabila butang ditekan, nombor 17 akan dihantar ke bot. Ini adalah kami CallbackQuery. Sedikit perkataan berkenaan CallbackQuery. Untuk mendapatkan data ini daripada Updateobjek, anda perlu melaksanakan update.getCallbackQuery(). Kaedah ini mengembalikan CallbackQuery, daripada mana anda boleh mengakses data yang dihantar kepada bot. Jangan cuba dapatkan data ini melalui update.getMessage().getText()kaedah—anda akan mendapat 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 mesej, kami menghantarnya ke urutan baharu untuk diproses; jika ada CallbackQuery, kami hantar ke urutan yang sesuai untuk diproses. Anda boleh menghantar jawapan kepada CallbackQuery. Setiap objek dalam Telegram mempunyai id sendiri. Untuk menghantar respons kepada spesifik CallbackQuery, anda hanya perlu mengetahui idnya, yang kami dapat daripada objek yang sepadan. Untuk menghantar jawapan, kami memanggil kaedah 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 respons kepada a CallbackQuerymestilah tidak lebih daripada 200 aksara! Selepas menghantar respons sedemikian, pelanggan akan melihat tetingkap pop timbul yang mengandungi mesej. Tetingkap ini boleh hilang beberapa saat selepas ia muncul, atau ia boleh berterusan sehingga pengguna menekan OK. Untuk menukar mod, kami memanggil answer.setShowAlert(true)kaedah. Jika anda beralih truekepada kaedah, tetingkap berterusan sehingga OK ditekan. Jika anda lulus palsu, maka ia hilang selepas 5 saat. Ini semua adalah ciri asas pustaka Telegram Bot . Jika anda mahu, anda boleh mempelajari perkara seperti cara menghantar multimedia, geolokasi, dsb. Mari kita teruskan untuk menggunakan bot kami ke platform pengehosan. Untuk projek saya, saya memilih Heroku. Saya fikir ia adalah platform pengehosan yang agak mudah dengan CLI sendiri. Ia percuma, tetapi pada pelan ini bot anda akan hibernate selepas 30 minit tidak menerima permintaan. Ia akan terjaga apabila permintaan diterima. Ini berlaku begitu cepat, anda tidak akan perasan (melainkan, sudah tentu, sambungan pangkalan data tidak dimulakan semula). Pelan percuma dihadkan oleh pangkalan data 5MB, ruang cakera 100MB, data 2TB sebulan dan 1 dyno. Dyno ialah aplikasi anda yang sedang berjalan. Saya akan katakan dengan segera bahawa penggunaan yang menyebabkan saya mengalami kesukaran, kerana saya tidak pernah menggunakan aplikasi saya sebelum ini. Semasa penggunaan, Heroku memerlukan fail bernama Procfile (tanpa sambungan). Kami menciptanya dalam akar projek. Di dalam, kami menulis worker: sh target/bin/workerBot, di mana workerBot ialah nama yang dinyatakan dalam pom.xml. A shskrip, yang dijana oleh Maven Application Assembler Plugin (appassembler-maven-plugin), akan dilancarkan. Skrip menerangkan cara melancarkan fail jar yang disusun. Nama kelas untuk dilancarkan ditentukan antara <mainClass>dan </mainClass>, manakala nama skrip diberikan antara <name>dan </name>dalam 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 memulakan proses ini, anda harus mendaftar di Heroku , dan memasang kedua-dua Git dan Heroku CLI . Jika aplikasi anda memerlukan pangkalan data, maka jangan lupa untuk menambah pangkalan data yang diperlukan apabila anda membuat aplikasi baharu. Selanjutnya, anda perlu menentukan hos, nama pengguna, kata laluan dan port untuk pangkalan data anda, dan kemudian menunjukkannya dalam aplikasi anda. Seterusnya, sebelum digunakan, bina projek anda menggunakan Maven .
mvn clean install
Mula-mula, kami pergi ke direktori projek kami dan mulakan repositori dengan arahan git init. Kemudian kami menambah projek kami ke repositori ini.
git add .
Kemudian kami melakukan perubahan
git commit -m "First commit in the project"
Seterusnya, anda perlu log masuk ke heroku. Tulis yang berikut pada baris arahan
heroku login
Masukkan kelayakan yang anda buat semasa pendaftaran. Selepas itu, tentukan URL repositori anda pada heroku. Anda melakukan ini dalam tetapan. Kemudian kita menulis
git remote add heroku [url]
Repositori heroku jauh ditambahkan untuk repositori anda. Seterusnya kita menulis
git push heroku master
Kemudian kita tunggu... jika aplikasi berjaya digunakan, laksanakan arahan berikut
heroku ps:scale worker=1
Dan itu sahaja, aplikasi anda sedang berjalan. Jika tidak, lihat log dengan teliti. Kemungkinan besar, ralat dalam aplikasi anda telah menyebabkan ia gagal. Terima kasih kerana membaca artikel yang begitu panjang. Saya harap seseorang akan mendapati ia berguna dan ia akan menjimatkan banyak masa anda di kawasan yang memberi saya masalah semasa pembangunan.
Komen
  • Popular
  • Baru
  • Tua
Anda mesti log masuk untuk meninggalkan ulasan
Halaman ini tidak mempunyai sebarang ulasan lagi