JavaRush /Блоги Java /Random-TG /Эҷоди боти Telegram дар Java: аз идея то ҷойгиркунӣ
John Watson
Сатҳи

Эҷоди боти Telegram дар Java: аз идея то ҷойгиркунӣ

Дар гурӯҳ нашр шудааст
Ба ҳар ҳол ботҳо чист? Шумо метавонед дар ин бора ба таври муфассал дар ин ҷо бихонед . Аввалан, шумо бояд ҳуҷҷатҳои расмии китобхонаро барои таҳияи ботҳо дар Telegram (минбаъд API номида мешавад) хонед. Вай дар ин ҷо хобидааст . Эҷоди боти Telegram дар Java: аз идея то ҷойгиркунӣ - 1Ҳама чиз дар он ҷо хеле дастрас ва фаҳмо аст. Чунин ба назар мерасад, ки нависед ва шод бошед! Аммо ин чандон оддӣ нест. Пас аз сарф кардани вақти зиёд дар системаҳои ҷустуҷӯ, ман пораҳои донишро дар бораи таҳияи ботҳо пайдо кардам, масалан, чӣ гуна сохтани клавиатура, коркарди CallbackQuery ва ғайра. Ман ҳеҷ гоҳ дастури мукаммал ва ҳамаҷониба барои таҳияи ботҳо дар Java наёфтаам. Ин маро водор кард, ки ин мақоларо нависам. Дар Интернет сайтҳои зиёде мавҷуданд, ки шумо метавонед боти худро бо ҷойгиркунии омода созед. Аммо гап дар он аст. ки дар кисми зиёди он ботхо сохта мешаванд, ки маълумоти замина ва гайраро таъмин карда метавонанд. Боти мо як веб-барномаи мукаммалест, ки шумо метавонед ба пойгоҳи додаҳо пайваст кунед, ба API-ҳои гуногун дархост кунед, сайтҳоро таҳлил кунед, ҳисобҳои мураккаб анҷом диҳед ва ғайра. Масъала танҳо бо тасаввуроти шумо маҳдуд аст. Умедворам, ки дар ин сатрхо ба шумо каме тавзех додаам, ки дар бораи он чи хохам нависам. Бақайдгирии бот дар Telegram хеле содда аст; ин раванд дар ҳуҷҷатҳо дар истиноди боло муфассал тавсиф шудааст. Барои замимаи мо ба шумо танҳо номи бот ва нишонаеро, ки ҳангоми бақайдгирӣ гирифта мешавад, бидонед. Аслан, бот танҳо як веб-барномаи консолӣ аст. Не фронтент, коркарди фармони холис. Агар шумо хоҳед, ки Hibernate-ро хуб азхуд кунед ё тарзи таҳлor JSON-ро омӯзед, пас ин лоиҳа барои шумост. Биёед бо дохил кардани вобастагӣ ба pom.xml оғоз кунем (мо гумон мекунем, ки шумо Maven-ро истифода мебаред). Шумо метавонед инро чунин иҷро кунед:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Сипас, мо синф эҷод мекунем Botва онро аз class мерос мегирем 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()мо ботро оғоз мекунем. Ҳоло ӯ танҳо ҳар паёмеро, ки мо ба ӯ мефиристем, ба мо равона мекунад, як навъ «оина». Ҳамааш ба таври зерин кор мекунад: вақте ки шумо барномаро оғоз мекунед, он ба serverи Telegram як маротиба дар як сония дар URL-и зерин фиристодани дархости GET-ро оғоз мекунад: https://api.telegram.org/BotToken/getMe, ки дар он BotToken ҷойгир аст. аломати боти шумо, ки дар ҷавоби JSON дорои ҳама паёмҳо мебошад. Ҳар як чунин паём аз ҷониби китобхона коркард карда мешавад ва ба метод OnUpdateReceived(Update update)ҳамчун an object меояд Update. Ин аст он чизе ки мо бо он кор мекунем. Ин зебоии ботҳои Telegram аст, онҳо метавонанд дар ҳама гуна компютер кор кунанд, барои санҷиш шумо танҳо барномаро оғоз кардан лозим аст, пас аз ҳар як тағирот ба шумо лозим нест, ки онро дар хостинг ҷойгир кунед. Ин хеле қулай аст. Албатта, ботро метавон бо истифода аз вебхук танзим кард; дастурро дар Интернет пайдо кардан мумкин аст; барои содда, мо бо истифода аз LongPolling кор хоҳем кард. Тарзи коркарди паёмҳо ва чӣ дар ҷавоб фиристодан танҳо бо асбобҳои забонӣ ва китобхона маҳдуд аст, ҳама чиз дар ихтиёри шумост. Шумо метавонед бот созед, ки видеоҳоро дар YouTube барои шумо ҷустуҷӯ кунад, шумо метавонед бот созед, ки ҳар рӯз он чизеро, ки шумо ба худатон мефиристед, ба шумо мефиристад, масалан, дар як сол, як навъ капсулаи вақт. Ё шумо метавонед омӯзед, ки чӣ тавр ба системаҳои CRM ҳамроҳ шавед ва ботҳо барои тиҷорати хурд созед, ҳама чиз бо тасаввуроти шумо маҳдуд аст. Ба пеш. «/»Онҳое, ки ботҳоро истифода кардаанд, медонанд, ки бо онҳо бо истифода аз фармонҳое, ки аз аломат сар мешавад , муошират кардан қулай аст /start. Аммо роҳи қулайтар вуҷуд дорад - тугмаҳо. Ду намуди тугмаҳо вуҷуд доранд: тугмаҳое, ки дар зери майдони воридот пайдо мешаванд ReplyKeyboardMarkupва тугмаҳое, ки бевосита дар зери паёме, ки ба онҳо пайванданд, пайдо мешаванд InlineKeyboardMarkup. Дар ҳуҷҷатҳо шумо метавонед бо тавсифи онҳо ба таври мухтасар шинос шавед. ReplyKeyboardMarkup. Аслан ин як қатор массивҳои тугмаҳо мебошад, List<KeyboardRow<KeyboardButton>>. Ин аст рамзи намунае, ки клавиатураро эҷод мекунад
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 Ин инчунин массиви массивҳост, он ба Markup-и қаблӣ монанд аст, аммо мантиқи амалиётӣ дар ин ҷо каме фарқ мекунад. Чунин клавиатура ба паёми мушаххас пайваст аст ва танҳо барои он вуҷуд дорад. Ин аст усули насб кардани клавиатураи Inline
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, тугмаи Inline ба сатри аввал илова кунед. Чунин тугма метавонад URL, истинод ба канал ё -ро дар бар гирад CallbackQuery, ки ман дар бораи он каме дертар менависам. Дар ин ҷо мо матнро барои тугмаи худ насб мекунем, ки корбар онро мебинад ва сипас маълумотеро, ки ба бот фиристода мешавад, таъин мекунем. Дар мисоли мо, корбар "Салом" -ро мебинад ва ҳангоми клик ба бот рақами 17 фиристода мешавад, ин мост CallbackQuery. Якчанд сухан дар бораи CallbackQuery. Барои ба даст овардани чунин маълумот аз an object, 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. Ҳар як an object дар Telegram ID-и худро дорад. Барои фиристодани посух ба ягон мушаххас, CallbackQueryмо бояд танҳо id-и онро бидонем, ки мо онро аз an objectи мувофиқ мегирем. Барои фиристодани ҷавоб, ба ин усул занг занед:
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();
        }
    }
МУҲИМ:Матни ҷавоб CallbackQueryнабояд аз 200 аломат зиёд бошад! Ҳангоми фиристодани чунин посух, муштарӣ равзанаи поп-апро мегирад, ки дар он паём навишта мешавад. Чунин равзана пас аз пайдо шудани он метавонад чанд сония нопадид шавад ё то он даме ки корбар OK-ро пахш накунад, овезон монад. Барои иваз кардани ин режимҳо, мо ба answer.setShowAlert(true). Вақте ки trueтиреза овезон мешавад, то даме ки шумо OK-ро пахш кунед, вақте ки falseон пас аз 5 сония нопадид мешавад. Аслан, ин ҳама хусусиятҳои асосии китобхонаи ботҳои Telegram мебошанд. Агар хоҳед, шумо метавонед аз ҳуҷҷатҳо чунин чизҳоро, аз қабor фиристодани мултимедия, геолокатсия ва ғайраро омӯзед. Биёед ба ҷойгиркунии боти худ дар хостинг гузарем. Барои лоиҳаи худ ман Ҳерокуро интихоб кардам, зеро ба андешаи ман он хостинги хеле қулай аст, ки CLI-и худро дорад. Ин ройгон аст, аммо бо ин суръат боти шумо пас аз 30 дақиқа, агар ягон дархост вуҷуд надошта бошад, ба ҳолати интизорӣ мегузарад. Вақте ки ба ӯ дархост фиристода мешавад, ӯ аз хоб бедор мешавад. Ин хеле зуд рух медиҳад, шумо ҳатто пай намебаред (агар, албатта, пайвастшавӣ ба пойгоҳи додаҳо барқарор нашавад). Маҳдудияти нақшаи ройгон 5МБ пойгоҳи додаҳо, фазои диски 100МБ, трафики 2ТБ дар як моҳ, 1 дино мебошад. Dino барномаи иҷрошавандаи шумост. Ман дарҳол мегӯям, ки ин марҳилаи ҷойгиркунӣ буд, ки барои ман мушкилот ба бор овард, зеро ман қаблан ҳеҷ гоҳ барномаҳои худро ҷойгир накарда будам. Ҳангоми ҷойгиркунӣ, Heroku файлеро бо номи Procfile (бе васеъшавӣ) талаб мекунад. Мо онро дар решаи лоиҳа эҷод мекунем, дар он ҷо worker: sh target/bin/workerBot workerBot нависед - номе, ки мо дар pom.xml скрипти sh муайян мекунем, ки бо истифода аз плагини Maven appassembler-maven-plugin тавлид мешавад, оғоз мешавад. Скрипт иҷроиши кӯзаи тартибдодашударо тавсиф мекунад. Номи синфи оғозшаванда дар байни <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
Маълумоти худро дар вақти бақайдгирӣ ворид кунед. Пас шумо бояд URL-и анбори худро дар Heroku пайдо кунед, ин дар танзимот анҷом дода мешавад. Баъд мо менависем
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