JavaRush /Blog Java /Random-MS /Mencipta bot Telegram di Java: daripada idea kepada pengg...

Mencipta bot Telegram di Java: daripada idea kepada penggunaan

Diterbitkan dalam kumpulan
Apa itu bot? Anda boleh membaca tentang perkara ini secara terperinci di sini . Pertama, anda perlu membaca dokumentasi rasmi untuk perpustakaan untuk membangunkan bot di Telegram (selepas ini dirujuk sebagai API). Dia berbaring di sini . Mencipta bot Telegram di Java: daripada idea kepada penggunaan - 1Segala-galanya di sana sangat mudah diakses dan difahami. Nampaknya menulis dan bergembira! Tetapi ia tidak semudah itu. Selepas menghabiskan banyak masa dalam enjin carian, saya menemui coretan pengetahuan tentang pembangunan bot, contohnya, cara membuat papan kekunci, memproses CallbackQuery, dan seumpamanya. Saya tidak pernah menemui panduan lengkap dan komprehensif untuk membangunkan bot di Jawa. Ini mendorong saya untuk menulis artikel ini. Terdapat banyak tapak di Internet di mana anda boleh membuat bot anda sendiri dengan penggunaan siap sedia. Tetapi intinya ialah. bahawa sebahagian besar, bot dicipta yang boleh memberikan maklumat latar belakang dan sebagainya. Bot kami ialah aplikasi web lengkap yang mana anda boleh mengikat pangkalan data, membuat permintaan kepada pelbagai API, menghuraikan tapak, melakukan pengiraan yang rumit, dsb. Perkara ini hanya terhad oleh imaginasi anda. Saya berharap bahawa dalam baris ini saya telah menjelaskan kepada anda sedikit tentang apa yang akan saya tulis. Mendaftar bot dalam Telegram adalah sangat mudah; proses ini diterangkan secara terperinci dalam dokumentasi pada pautan di atas. Untuk permohonan kami, anda hanya perlu mengetahui nama bot dan token yang akan anda terima semasa pendaftaran. Pada asasnya, bot hanyalah aplikasi web konsol. Tiada bahagian hadapan, pemprosesan arahan tulen. Jika anda ingin menguasai Hibernate dengan baik atau mempelajari cara menghuraikan JSON, maka projek ini adalah untuk anda. Mari mulakan dengan memasukkan kebergantungan dalam pom.xml (kami mengandaikan bahawa anda menggunakan Maven). Anda boleh melakukannya seperti ini:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Kemudian kita buat class Bot, warisi dari class TelegramLongPollingBot, mengatasi 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 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, kandungan kaedah 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 kaedah getBotUsername(), getBotToken()kami melancarkan bot. Buat masa ini, dia hanya mengubah hala kepada kami sebarang mesej yang kami hantar kepadanya, sejenis "cermin". Semuanya berfungsi seperti berikut: apabila anda melancarkan aplikasi, ia mula menghantar permintaan GET ke pelayan Telegram sekali setiap n bilangan saat di URL berikut: https://api.telegram.org/BotToken/getMe, di mana BotToken berada token bot anda, menerima dalam respons JSON yang mengandungi semua mesej. Setiap mesej sedemikian diproses oleh perpustakaan dan datang kepada kaedah OnUpdateReceived(Update update)sebagai objek Update. Itulah yang kami kerjakan. Ini adalah keindahan bot Telegram, mereka boleh berfungsi pada mana-mana komputer, untuk ujian anda hanya perlu melancarkan aplikasi, anda tidak perlu menggunakan ia ke pengehosan selepas setiap perubahan. Ia sangat selesa. Sudah tentu, bot boleh dikonfigurasikan untuk berfungsi menggunakan webhook; manual boleh didapati di Internet; untuk kesederhanaan, kami akan bekerja menggunakan LongPolling. Cara memproses mesej dan perkara yang perlu dihantar sebagai respons hanya dihadkan oleh alatan bahasa dan perpustakaan, segala-galanya adalah mengikut budi bicara anda. Anda boleh membuat bot yang akan mencari video di YouTube untuk anda, anda boleh membuat bot yang setiap hari akan menghantar apa yang anda hantar kepada diri sendiri, contohnya, dalam setahun, sejenis kapsul masa. Atau anda boleh belajar bagaimana untuk menyepadukan ke dalam sistem CRM dan membuat bot untuk perniagaan kecil, semuanya terhad oleh imaginasi anda. Teruskan. Mereka yang telah menggunakan bot tahu bahawa ia adalah mudah untuk berinteraksi dengan mereka menggunakan arahan bermula dengan tanda «/», sebagai contoh /start. Tetapi ada cara yang lebih mudah - butang. Terdapat dua jenis butang: butang yang muncul di bawah medan input ReplyKeyboardMarkupdan butang yang muncul terus di bawah mesej yang dipautkan kepada InlineKeyboardMarkup. Dalam dokumentasi, anda boleh membiasakan diri secara ringkas dengan penerangan mereka. ReplyKeyboardMarkup. Pada asasnya 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 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 kaedah sendMsg(), kami memanggil kaedah ini dengan menghantar mesej kepadanya, dengan itu menetapkan papan kekunci untuk mesej itu. Apabila kami menghantar mesej ini kepada pengguna, dia akan melihat teks mesej yang kami tetapkan, serta 2 butang yang menyatakan Helo dan Bantuan, bersebelahan antara satu sama lain. Dengan mengklik pada butang ini, mesej akan dihantar ke bot, yang teksnya adalah apa yang tertulis pada butang. Iaitu, jika pelanggan mengklik "Bantuan", bot akan menerima mesej dengan teks "Bantuan". Baginya, seolah-olah pelanggan sendiri menulis teks "Bantuan" dan menghantarnya kepadanya. Nah, kemudian anda memproses mesej sedemikian. InlineKeyboardMarkup Ini juga merupakan tatasusunan, ia serupa dengan Markup sebelumnya, tetapi logik pengendalian di sini sedikit berbeza. Papan kekunci sedemikian terikat pada mesej tertentu dan hanya wujud untuknya. Berikut ialah kaedah untuk memasang papan kekunci Sebaris
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 Listdalam List, tambah butang Sebaris pada baris pertama. Butang sedemikian boleh mengandungi URL, pautan ke saluran atau CallbackQuery, yang akan saya tulis kemudian. Di sini kami menetapkan teks untuk butang kami yang akan dilihat oleh pengguna dan kemudian menetapkan data yang akan dihantar ke bot. Dalam contoh kami, pengguna melihat "Hello", dan apabila diklik, bot akan dihantar nombor 17, ini adalah CallbackQuery. Sedikit perkataan tentang CallbackQuery. Untuk mendapatkan data sedemikian daripada objek, Updateanda perlu melaksanakan update.getCallbackQuery(), kaedah ini kembali CallbackQuery, yang mana anda sudah boleh mendapatkan data dipindahkan ke bot. Tidak perlu cuba mendapatkan data ini melalui kaedah 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 terdapat mesej, kami menghantar mesej untuk diproses ke urutan baharu; jika ada mesej CallbackQuery, kami menghantarnya untuk diproses ke urutan yang sesuai. Anda boleh menghantar jawapan kepada CallbackQuery. Setiap objek dalam Telegram mempunyai id sendiri. Untuk menghantar respons kepada yang tertentu, CallbackQuerykita hanya perlu mengetahui idnya, yang akan kita terima daripada objek yang sepadan. Untuk menghantar jawapan, hubungi 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 jawapan CallbackQuerytidak boleh lebih daripada 200 aksara! Apabila menghantar respons sedemikian, pelanggan akan menerima tetingkap pop timbul di mana mesej akan ditulis. Tetingkap sedemikian mungkin hilang beberapa saat selepas ia muncul, atau ia mungkin tergantung sehingga pengguna menekan OK. Untuk menukar mod ini, kami memanggil answer.setShowAlert(true). Apabila truetetingkap digantung sehingga anda menekan OK, apabila falseia hilang selepas 5 saat. Pada dasarnya, ini adalah semua ciri asas perpustakaan bot Telegram. Jika anda mahu, anda boleh mempelajari perkara seperti menghantar multimedia, geolokasi, dsb. daripada dokumentasi. Mari kita teruskan untuk menggunakan bot kami pada pengehosan. Untuk projek saya, saya memilih Heroku, kerana pada pendapat saya ia adalah hosting yang agak mudah yang mempunyai CLI sendiri. Ia adalah percuma, tetapi pada kadar ini bot anda akan masuk ke hibernasi selepas 30 minit jika tiada permintaan. Apabila permintaan dihantar kepadanya, dia bangun. Ini berlaku agak cepat, anda tidak akan perasan (melainkan, sudah tentu, sambungan ke pangkalan data diwujudkan semula). Had pada pelan percuma ialah pangkalan data 5MB, ruang cakera 100MB, trafik 2TB sebulan, 1 dino. Dino ialah aplikasi anda yang sedang berjalan. Saya akan katakan dengan segera bahawa peringkat penggunaan yang menyebabkan kesukaran kepada saya, kerana saya tidak pernah menggunakan aplikasi saya sebelum ini. Apabila menggunakan, Heroku memerlukan fail bernama Procfile (tanpa sambungan). worker: sh target/bin/workerBot Kami menciptanya dalam akar projek, tulis workerBot di sana - nama yang kami nyatakan dalam pom.xml Skrip sh yang dijana menggunakan pemalam Maven appassembler-maven-plugin akan dilancarkan. Skrip menerangkan menjalankan balang yang disusun. Nama kelas yang akan dilancarkan 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 memulakan proses ini, anda perlu mendaftar di Heroku, pasang Git dan Heroku CLI. Jika aplikasi anda memerlukan pangkalan data, maka semasa mendaftar aplikasi baru, jangan lupa untuk menambah pangkalan data yang anda perlukan. Seterusnya, anda perlu mengetahui hos, nama pengguna, kata laluan dan port pangkalan data anda, dan kemudian nyatakannya dalam aplikasi anda. Seterusnya, sebelum digunakan, bina projek anda menggunakan Maven.
mvn clean install
Sebagai permulaan, kami pergi ke direktori projek kami, mulakan repositori dengan arahangit init Kemudian kami menambah projek kami ke repositori ini
git add .
Selepas kita melakukan perubahan
git commit -m “First commit in project”
Seterusnya anda perlu log masuk ke heroku, tulis dalam baris arahan
heroku login
Masukkan data anda yang dinyatakan semasa pendaftaran. Kemudian anda perlu mengetahui URL repositori anda pada Heroku, ini dilakukan dalam tetapan. Kemudian kita menulis
git remote add heroku [url]
Repositori jauh heroku akan ditambahkan pada repositori anda. Seterusnya kita menulis
git push heroku master
Kami sedang menunggu... Jika penggunaan aplikasi berjaya, kami melaksanakan arahan
heroku ps:scale worker=1
Dan itu sahaja, aplikasi anda sedang berjalan. Jika ini tidak berlaku, lihat dengan teliti pada log; kemungkinan besar terdapat ralat dalam aplikasi anda yang menyebabkan ia ranap. Terima kasih kerana membaca artikel yang begitu panjang, saya harap seseorang mendapati ia berguna dan menjimatkan banyak masa di tempat yang saya tersandung semasa pembangunan.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION