JavaRush /Java блогы /Random-KK /Java тілінде Telegram ботын жасау: идеядан бастап орналас...
John Watson
Деңгей

Java тілінде Telegram ботын жасау: идеядан бастап орналастыруға дейін

Топта жарияланған
Боттар деген не? Бұл туралы толығырақ мына жерден оқи аласыз . Алдымен Telegram-да боттарды әзірлеуге арналған кітапхананың ресми құжаттамасын оқу керек (бұдан әрі API). Ол осында жатыр . Java тілінде Telegram ботын құру: идеядан бастап орналастыруға дейін - 1Онда бәрі өте қолжетімді және түсінікті. Жазып, қуанатын сияқты! Бірақ бұл қарапайым емес. Іздеу жүйелерінде көп уақыт өткізгеннен кейін мен боттарды әзірлеу бойынша білімнің үзінділерін таптым, мысалы, пернетақтаны қалай жасау керек, CallbackQuery өңдеу және т.б. Мен Java-да боттарды әзірлеуге арналған толық және жан-жақты нұсқаулықты ешқашан тапқан емеспін. Бұл мақаланы жазуыма түрткі болды. Интернетте көптеген сайттар бар, онда сіз өзіңіздің ботыңызды дайын орналастыру арқылы жасай аласыз. Бірақ мәселе мынада. көп жағдайда фондық ақпаратты және т.б. бере алатын боттар жасалады. Біздің бот – толыққанды веб-қосымшасы, оған дерекқорды байланыстыруға, әртүрлі API интерфейстеріне сұраныстар жасауға, сайттарды талдауға, күрделі есептеулерді орындауға және т.б. Мәселе тек сіздің қиялыңызбен шектеледі. Осы жолдарда мен сізге не туралы жазатынымды аздап түсіндірдім деп үміттенемін. Telegram-да ботты тіркеу өте қарапайым, бұл процесс жоғарыдағы сілтемедегі құжаттамада егжей-тегжейлі сипатталған. Біздің қосымшамыз үшін сізге тек боттың атын және тіркеу кезінде алатын токенді білу қажет. Негізінде, бот тек консольдық веб-қосымша болып табылады. Frontend жоқ, таза пәрменді өңдеу. Күту режимін жақсы меңгергіңіз келсе немесе JSON талдауын үйренгіңіз келсе, бұл жоба сізге арналған. Тәуелділікті pom.xml ішіне қосудан бастайық (сіз Maven пайдаланып жатырсыз деп есептейміз). Сіз мұны келесідей жасай аласыз:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Содан кейін біз класс жасаймыз Bot, оны класстан мұраға аламыз TelegramLongPollingBot, оның әдістерін ауыстырамыз:
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;
    }
}
Әдістің мазмұны main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Оны әдістерге енгізу арқылы getBotUsername()біз getBotToken()ботты іске қосамыз. Әзірге ол бізге жіберген кез келген хабарламаларды, «айна» түрін ғана бағыттайды. Мұның бәрі келесідей жұмыс істейді: қолданбаны іске қосқан кезде ол Telegram serverіне келесі URL мекенжайы бойынша секунд сайын бір рет GET сұрауын жібере бастайды: https://api.telegram.org/BotToken/getMe, мұнда BotToken орналасқан. барлық хабарларды қамтитын JSON жауабын алатын сіздің ботыңыздың белгісі. Әрбір осындай хабарлама кітапханамен өңделеді және әдіске OnUpdateReceived(Update update)an object ретінде келеді Update. Міне, біз жұмыс істейміз. Бұл Telegram боттарының сұлулығы, олар кез келген компьютерде жұмыс істей алады, тестілеу үшін қосымшаны іске қосу жеткілікті, әр өзгертуден кейін оны хостингке орналастырудың қажеті жоқ. Бұл өте ыңғайлы. Әрине, ботты webhook көмегімен жұмыс істеуге конфигурациялауға болады; нұсқаулықты Интернетте табуға болады; қарапайым болу үшін біз LongPolling арқылы жұмыс істейміз. Хабарламаларды қалай өңдеу керек және жауап ретінде не жіберу керек, тек тіл құралдары мен кітапханамен шектеледі, қалғанының барлығы сіздің қалауыңызда. Сіз YouTube сайтында бейнелерді іздейтін бот жасай аласыз, күнделікті өзіңізге жібергеніңізді жіберетін бот жасай аласыз, мысалы, бір жылдан кейін уақыт капсуласы түрі. Немесе сіз CRM жүйелеріне біріктіруді және шағын бизнеске арналған боттарды жасауды үйрене аласыз, бәрі сіздің қиялыңызбен шектеледі. Ілгері жүру. Боттарды пайдаланғандар біледі, «/»мысалы, белгісінен басталатын пәрмендерді пайдалана отырып, олармен әрекеттесу ыңғайлы /start. Бірақ одан да ыңғайлы әдіс бар - түймелер. Түймешіктердің екі түрі бар: енгізу өрісінің астында пайда болатын түймелер ReplyKeyboardMarkupжәне олар байланыстырылған хабардың астында тікелей пайда болатын түймелер InlineKeyboardMarkup. Құжаттамада олардың сипаттамасымен қысқаша танысуға болады. ReplyKeyboardMarkup. Негізінде бұл түймелер массивтерінің массиві, List<KeyboardRow<KeyboardButton>>. Мұнда пернетақтаны жасайтын мысал code берілген
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);
    }
Әдісте sendMsg()біз бұл әдісті оған хабарлама жіберу арқылы шақырамыз, осылайша сол хабарлама үшін пернетақтаны орнатамыз. Бұл хабарламаны пайдаланушыға жіберген кезде ол біз орнатқан хабарлама мәтінін, сондай-ақ бір-бірінің қасында Сәлем және Анықтама деген 2 түймені көреді. Осы түймелерді басу арқылы ботқа хабарлама жіберіледі, оның мәтіні түймеде жазылған. Яғни, егер клиент «Анықтама» түймесін басса, бот «Анықтама» мәтіні бар хабарлама алады. Ол үшін клиенттің өзі «Көмек» мәтінін жазып, оған жіберген сияқты. Онда сіз осындай хабарламаларды өңдейсіз. InlineKeyboardMarkup Бұл да массивтер жиымы, ол алдыңғы Белгілеуге ұқсас, бірақ мұндағы жұмыс логикасы сәл басқаша. Мұндай пернетақта белгілі бір хабарламаға байланысты және ол үшін ғана бар. Мұнда кірістірілген пернетақтаны орнату әдісі берілген
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);
    }
Listішінде жасаңыз List, бірінші жолға кірістірілген түймені қосыңыз. Мұндай түймеде URL мекенжайы, арнаға сілтеме немесе CallbackQueryмен сәл кейінірек жазамын. Мұнда біз пайдаланушы көретін батырманың мәтінін орнатамыз, содан кейін ботқа жіберілетін деректерді орнатамыз. Біздің мысалда пайдаланушы «Сәлеметсіз бе» дегенді көреді және басқан кезде ботқа 17 нөмірі жіберіледі, бұл біздің CallbackQuery. туралы бірнеше сөз CallbackQuery. Нысаннан мұндай деректерді алу үшін Updateорындау керек update.getCallbackQuery(), бұл әдіс қайтарады CallbackQuery, одан сіз ботқа жіберілген деректерді ала аласыз. Бұл деректерді әдіс арқылы алуға тырысудың қажеті жоқ update.getMessage().getText(), алу 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());
        }
    }
Егер хабарлама болса, біз оны өңдеуге жаңа ағынға жібереміз, егер хабарлама болса CallbackQuery, оны тиісті ағынға өңдеуге жібереміз. CallbackQueryЖауап жібере аласыз . Telegram-дағы әрбір нысанның өз идентификаторы бар. Белгілі бір адамға жауап жіберу үшін CallbackQueryбіз тек сәйкес нысаннан алатын оның идентификаторын білуіміз керек. Жауап жіберу үшін мына әдісті шақырыңыз:
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();
        }
    }
МАҢЫЗДЫ:Жауаптағы мәтін CallbackQuery200 таңбадан аспауы керек! Мұндай жауапты жіберген кезде клиент хабарлама жазылатын қалқымалы терезені алады. Мұндай терезе пайда болғаннан кейін бірнеше секундтан кейін жоғалып кетуі мүмкін немесе пайдаланушы OK түймесін басқанша ілулі тұруы мүмкін. Бұл режимдерді ауыстыру үшін біз answer.setShowAlert(true). trueТерезе OK түймесін басқанша ілулі тұрғанда , falseол 5 секундтан кейін жоғалады. Негізінде, бұл Telegram бот кітапханасының барлық негізгі мүмкіндіктері. Қаласаңыз, құжаттамадан мультимедиа жіберу, геолокация және т.б. Ботымызды хостингте орналастыруға көшейік. Менің жобам үшін мен Heroku таңдадым, өйткені менің ойымша, бұл өз CLI бар өте ыңғайлы хостинг. Бұл тегін, бірақ сұраулар болмаса, сіздің ботыңыз 30 minutesтан кейін күту күйіне өтеді. Оған сұрау жіберілсе, ол оянады. Бұл өте тез болады, сіз тіпті байқамайсыз (әрине, дерекқормен байланыс қайта орнатылмаса). Tagін жоспардағы шектеу - 5 МБ дерекқор, 100 МБ дискілік кеңістік, айына 2 ТБ трафик, 1 дино. Dino - сіздің іске қосылған қолданбаңыз. Бірден айтамын, бұл мен үшін қиындықтар туғызған орналастыру кезеңі болды, өйткені мен бұрын қолданбаларымды қолданбаған едім. Орналастыру кезінде Heroku Procfile (кеңейтімсіз) деп аталатын файлды қажет етеді. Біз оны жобаның түбірінде жасаймыз, онда worker: sh target/bin/workerBot workerBot деп жазамыз - Maven плагині appassembler-maven-plugin арқылы жасалған sh сценарийінде біз көрсеткен атау pom.xml іске қосылады. Сценарий құрастырылған банканы іске қосуды сипаттайды. Іске қосылатын сыныптың аты <mainClass></mainClass> арасында, сценарий аты <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>
Бұл процесті бастамас бұрын, Heroku жүйесінде тіркеліп, Git және Heroku CLI орнату керек. Қолданбаңыз дерекқорды қажет етсе, жаңа қосымшаны тіркеген кезде қажетті дерекқорды қосуды ұмытпаңыз. Әрі қарай, сіз өзіңіздің дерекқорыңыздың хостын, пайдаланушы атын, құпия сөзін және портын білуіңіз керек, содан кейін оны қолданбаңызда көрсетіңіз. Әрі қарай, орналастырудан бұрын Maven көмегімен жобаңызды жасаңыз.
mvn clean install
Бастау үшін біз жобамыздың каталогына барамыз, репозиторийді пәрменмен инициализациялаймызgit init Содан кейін жобамызды осы репозиторийге қосамыз.
git add .
Өзгерістерді енгізгеннен кейін
git commit -m “First commit in project”
Әрі қарай сіз heroku жүйесіне кіруіңіз керек, пәрмен жолына жазыңыз
heroku login
Тіркеу кезінде көрсетілген деректеріңізді енгізіңіз. Содан кейін сіз Heroku сайтындағы репозиторийдің URL мекенжайын білуіңіз керек, бұл параметрлерде жасалады. Сосын жазамыз
git remote add heroku [url]
Heroku қашықтағы репозиторийі репозиторийіңізге қосылады. Әрі қарай жазамыз
git push heroku master
Біз күтеміз... Егер қолданбаны орналастыру сәтті болса, біз пәрменді орындаймыз
heroku ps:scale worker=1
Міне, сіздің қолданбаңыз жұмыс істеп тұр. Егер бұл орын алмаса, журналдарды мұқият қарап шығыңыз, ең алдымен, қолданбаңызда оның бұзылуына әкелген қате бар. Осындай ұзақ мақаланы оқығаныңыз үшін рахмет, біреу оны пайдалы деп санайды және даму кезінде сүрінген жерлерде көп уақытты үнемдейді деп үміттенемін.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION