JavaRush /Java blogi /Random-UZ /Java-da Telegram botini yaratish: g'oyadan tortib to joyl...
John Watson
Daraja

Java-da Telegram botini yaratish: g'oyadan tortib to joylashtirishgacha

Guruhda nashr etilgan
Botlar nima? Bu haqda batafsil bu yerda o'qishingiz mumkin . Birinchidan, Telegram’da botlarni ishlab chiqish uchun kutubxona uchun rasmiy hujjatlarni (keyingi o‘rinlarda API deb yuritiladi) o‘qib chiqishingiz kerak. U shu yerda yotadi . Java-da Telegram botini yaratish: g'oyadan tortib to joylashtirishgacha - 1U erda hamma narsa juda qulay va tushunarli. Yozing va xursand bo'ling! Lekin bu unchalik oddiy emas. Qidiruv tizimlarida ko'p vaqt sarflaganimdan so'ng, men botni ishlab chiqish bo'yicha bilim parchalarini topdim, masalan, klaviaturani qanday yasash, CallbackQuery-ni qayta ishlash va boshqalar. Men hech qachon Java-da botlarni ishlab chiqish bo'yicha to'liq va keng qamrovli qo'llanmani topa olmadim. Bu meni ushbu maqolani yozishga undadi. Internetda tayyor joylashtirish bilan o'z botingizni yaratishingiz mumkin bo'lgan ko'plab saytlar mavjud. Lekin gap shundaki. ko'pincha fon ma'lumotlarini taqdim eta oladigan botlar yaratiladi va hokazo. Bizning botimiz to'liq huquqli veb-ilova bo'lib, unga ma'lumotlar bazasini bog'lashingiz, turli API-larga so'rovlar qilishingiz, saytlarni tahlil qilishingiz, murakkab hisob-kitoblarni bajarishingiz va hokazo. Bu masala faqat sizning tasavvuringiz bilan cheklangan. Umid qilamanki, bu satrlarda men sizga nima haqida yozmoqchi ekanligimni biroz tushuntirdim. Telegram’da botni ro‘yxatdan o‘tkazish juda oddiy, bu jarayon yuqoridagi havoladagi hujjatlarda batafsil tavsiflangan. Bizning arizamiz uchun siz faqat bot nomini va ro'yxatdan o'tganingizda oladigan tokenni bilishingiz kerak. Aslida, bot shunchaki konsol veb-ilovasi. Frontend yo'q, sof buyruqlarni qayta ishlash. Agar siz Hibernate rejimini yaxshi o'zlashtirmoqchi bo'lsangiz yoki JSONni qanday tahlil qilishni o'rganmoqchi bo'lsangiz, unda bu loyiha siz uchun. Pom.xml ga qaramlikni qo'shishdan boshlaylik (biz siz Maven dan foydalanyapsiz deb taxmin qilamiz). Siz buni shunday qilishingiz mumkin:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Keyin biz class ni yaratamiz Bot, uni class dan meros qilib olamiz TelegramLongPollingBotva uning usullarini bekor qilamiz:
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;
    }
}
Xo'sh, usulning mazmuni main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Uni usullarga kiritish orqali getBotUsername()biz getBotToken()botni ishga tushiramiz. Hozircha u bizga yuboradigan har qanday xabarlarni, o'ziga xos "oyna"ni yo'naltiradi. Hammasi quyidagicha ishlaydi: ilovani ishga tushirganingizda, u Telegram serveriga quyidagi URL manzilida har n soniyada bir marta GET so‘rovini yuborishni boshlaydi: https://api.telegram.org/BotToken/getMe, bu yerda BotToken barcha xabarlarni o'z ichiga olgan JSON javobini olgan botingizning tokeni. OnUpdateReceived(Update update)Har bir bunday xabar kutubxona tomonidan qayta ishlanadi va ob'ekt sifatida usulga keladi Update. Biz shu bilan ishlaymiz. Bu Telegram botlarining go'zalligi, ular istalgan kompyuterda ishlashi mumkin, sinovdan o'tish uchun dasturni ishga tushirish kifoya, har bir o'zgarishdan keyin uni xostingga joylashtirish shart emas. Bu juda qulay. Albatta, botni webhook yordamida ishlash uchun sozlash mumkin; qo'llanmani Internetda topish mumkin; soddaligi uchun biz LongPolling yordamida ishlaymiz. Xabarlarni qanday qayta ishlash va javob sifatida nima yuborish faqat til vositalari va kutubxona bilan cheklangan, qolgan hamma narsa sizning ixtiyoringizda. Siz o'zingiz uchun YouTube'da videolarni qidiradigan bot qilishingiz mumkin, siz har kuni o'zingizga yuborgan narsalaringizni sizga yuboradigan bot qilishingiz mumkin, masalan, bir yilda, bir turdagi vaqt kapsulasi. Yoki siz CRM tizimlariga qanday integratsiya qilishni va kichik biznes uchun botlarni yaratishni o'rganishingiz mumkin, hamma narsa sizning tasavvuringiz bilan cheklangan. Davom etishga ruxsat. Botlardan foydalanganlar, «/»masalan, belgi bilan boshlangan buyruqlar yordamida ular bilan muloqot qilish qulay ekanligini bilishadi /start. Lekin qulayroq yo'l bor - tugmalar. Ikki turdagi tugmalar mavjud: kiritish maydoni ostida paydo bo'ladigan ReplyKeyboardMarkuptugmalar va ular bog'langan xabar ostida to'g'ridan-to'g'ri ko'rinadigan tugmalar InlineKeyboardMarkup. Hujjatlarda siz ularning tavsifi bilan qisqacha tanishishingiz mumkin. ReplyKeyboardMarkup. Aslini olganda, bu tugma massivlari massivi, List<KeyboardRow<KeyboardButton>>. Klaviaturani yaratuvchi kod misoli
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);
    }
Usulda sendMsg()biz ushbu usulni unga xabar yuborish orqali chaqiramiz va shu bilan ushbu xabar uchun klaviaturani o'rnatamiz. Ushbu xabarni foydalanuvchiga yuborganimizda, u biz o'rnatgan xabar matnini, shuningdek, Salom va Yordam degan 2 tugmani bir-birining yonida ko'radi. Ushbu tugmalarni bosish orqali botga xabar yuboriladi, uning matni tugmachada yozilgan. Ya'ni, agar mijoz "Yordam" tugmasini bosgan bo'lsa, bot "Yordam" matni bilan xabar oladi. Uning uchun mijozning o'zi "Yordam" matnini yozib, unga yuborgandek. Xo'sh, siz bunday xabarlarni qayta ishlaysiz. InlineKeyboardMarkup Bu ham massivlar massivi bo'lib, u avvalgi Belgilanishga o'xshaydi, lekin bu erda ishlash mantig'i biroz boshqacha. Bunday klaviatura ma'lum bir xabarga bog'langan va faqat u uchun mavjud. Bu erda Inline klaviaturani o'rnatish usuli
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);
    }
Listni yarating List, birinchi qatorga Inline tugmachasini qo'shing. Bunday tugmachada URL manzili, kanalga havola yoki CallbackQuerybirozdan keyin yozaman. Bu erda biz foydalanuvchi ko'radigan tugmachamiz uchun matnni o'rnatamiz va keyin botga yuboriladigan ma'lumotlarni o'rnatamiz. Bizning misolimizda foydalanuvchi "Salom" ni ko'radi va bosilganda botga 17 raqami yuboriladi, bu bizning CallbackQuery. haqida bir necha so'z CallbackQuery. Ob'ektdan bunday ma'lumotlarni olish uchun Updatesiz bajarishingiz kerak update.getCallbackQuery(), bu usul qaytadi CallbackQuery, undan siz allaqachon botga o'tkazilgan ma'lumotlarni olishingiz mumkin. Usul orqali, bu ma'lumotlarni olish uchun harakat qilish kerak emas update.getMessage().getText(), olish 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());
        }
    }
Agar xabar bo'lsa, biz xabarni qayta ishlash uchun yangi mavzuga yuboramiz; agar xabar bo'lsa CallbackQuery, biz uni tegishli mavzuga qayta ishlash uchun yuboramiz. Siz CallbackQueryjavob yuborishingiz mumkin. Telegram’dagi har bir obyekt o‘z identifikatoriga ega. Muayyan biriga javob yuborish uchun CallbackQuerybiz uning identifikatorini bilishimiz kerak, biz uni mos keladigan ob'ektdan olamiz. Javob yuborish uchun ushbu usulni chaqiring:
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();
        }
    }
MUHIM:Javobdagi matn CallbackQuery200 belgidan oshmasligi kerak! Bunday javob yuborilganda, mijoz xabar yoziladigan qalqib chiquvchi oynani oladi. Bunday oyna paydo bo'lgandan keyin bir necha soniyadan so'ng yo'qolishi yoki foydalanuvchi "OK" tugmasini bosguncha osilib turishi mumkin. Ushbu rejimlarni almashtirish uchun biz ni chaqiramiz answer.setShowAlert(true). trueOK tugmasini bosmaguningizcha oyna osilib tursa, 5 falsesoniyadan keyin yo'qoladi. Asosan, bularning barchasi Telegram bot kutubxonasining asosiy xususiyatlari. Agar xohlasangiz, hujjatlardan multimedia, geolokatsiya va hokazolarni yuborish kabi narsalarni o'rganishingiz mumkin. Keling, botimizni xostingda joylashtirishga o'tamiz. Loyiham uchun men Heroku-ni tanladim, chunki mening fikrimcha, bu o'z CLI-ga ega bo'lgan juda qulay hosting. Bu bepul, ammo so'rovlar bo'lmasa, botingiz 30 daqiqadan so'ng kutish rejimiga o'tadi. Unga so'rov yuborilsa, u uyg'onadi. Bu juda tez sodir bo'ladi, siz buni sezmaysiz (agar, albatta, ma'lumotlar bazasiga ulanish qayta tiklanmasa). Bepul rejadagi cheklov - 5 MB ma'lumotlar bazasi, 100 MB disk maydoni, oyiga 2 TB trafik, 1 dino. Dino - bu sizning ishlaydigan ilovangiz. Darhol aytamanki, bu men uchun qiyinchilik tug'dirgan joylashtirish bosqichi edi, chunki men ilgari hech qachon ilovalarimni joylashtirmaganman. Joylashtirishda Heroku Procfile nomli faylni talab qiladi (kengaytmasiz). Biz uni loyihaning ildizida yaratamiz, u erda worker: sh target/bin/workerBot workerBot yozamiz - Maven plaginidan foydalangan holda yaratilgan sh skriptida ko'rsatgan nom pom.xml appassembler-maven-plugini ishga tushiriladi. Skript kompilyatsiya qilingan jarning ishlashini tasvirlaydi. Ishga tushiriladigan sinf nomi <mainClass></mainClass> orasida, skript nomi <name></name> pom.xml orasida ko'rsatilgan:
...
<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>
Ushbu jarayonni boshlashdan oldin, siz Heroku-da ro'yxatdan o'tishingiz, Git va Heroku CLI-ni o'rnatishingiz kerak. Agar ilovangiz ma'lumotlar bazasini talab qilsa, yangi ilovani ro'yxatdan o'tkazishda kerakli ma'lumotlar bazasini qo'shishni unutmang. Keyinchalik, siz ma'lumotlar bazasining xostini, foydalanuvchi nomini, parolini va portini bilib olishingiz kerak va keyin uni ilovangizda ko'rsatishingiz kerak. Keyinchalik, joylashtirishdan oldin, Maven yordamida loyihangizni yarating.
mvn clean install
Boshlash uchun biz loyihamiz katalogiga o'tamiz, buyruq bilan omborni ishga tushiramizgit init Keyin loyihamizni ushbu omborga qo'shamiz.
git add .
O'zgarishlarni amalga oshirganimizdan so'ng
git commit -m “First commit in project”
Keyinchalik, heroku-ga kirishingiz kerak, buyruq satriga yozing
heroku login
Ro'yxatdan o'tish paytida ko'rsatilgan ma'lumotlarni kiriting. Keyin Heroku-da omboringizning URL manzilini topishingiz kerak, bu sozlamalarda amalga oshiriladi. Keyin yozamiz
git remote add heroku [url]
Heroku masofaviy ombori sizning omboringizga qo'shiladi. Keyinchalik yozamiz
git push heroku master
Biz kutmoqdamiz ... Agar dasturni joylashtirish muvaffaqiyatli bo'lsa, biz buyruqni bajaramiz
heroku ps:scale worker=1
Va bu, sizning ilovangiz ishlamoqda. Agar bu sodir bo'lmasa, jurnallarni diqqat bilan ko'rib chiqing, ehtimol ilovangizda xatolik yuzaga kelgan bo'lib, bu uning ishdan chiqishiga olib keldi. Bunday uzoq maqolani o'qiganingiz uchun tashakkur, umid qilamanki, kimdir uni foydali deb topadi va rivojlanish jarayonida qoqilib ketgan joylarda ko'p vaqtni tejaydi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION