JavaRush /Java Blog /Random-TL /Paglikha ng Telegram bot sa Java: mula sa ideya hanggang ...

Paglikha ng Telegram bot sa Java: mula sa ideya hanggang sa pag-deploy

Nai-publish sa grupo
Ano pa rin ang mga bot? Maaari mong basahin ang tungkol dito nang detalyado dito . Una, kailangan mong basahin ang opisyal na dokumentasyon para sa library para sa pagbuo ng mga bot sa Telegram (mula rito ay tinutukoy bilang API). Nakahiga siya dito . Paglikha ng Telegram bot sa Java: mula sa ideya hanggang sa pag-deploy - 1Lahat doon ay napaka-accessible at naiintindihan. Tila na magsulat at magalak! Ngunit hindi ito ganoon kasimple. Pagkatapos gumugol ng maraming oras sa mga search engine, nakakita ako ng mga snippet ng kaalaman sa pagbuo ng bot, halimbawa, kung paano gumawa ng keyboard, magproseso ng CallbackQuery, at mga katulad nito. Wala pa akong nakitang kumpleto at komprehensibong gabay para sa pagbuo ng mga bot sa Java. Ito ang nagtulak sa akin na isulat ang artikulong ito. Mayroong maraming mga site sa Internet kung saan maaari kang lumikha ng iyong sariling bot gamit ang isang handa na deployment. Ngunit ang punto ay. na para sa karamihan, ang mga bot ay nilikha na maaaring magbigay ng background na impormasyon at iba pa. Ang aming bot ay isang ganap na web application kung saan maaari kang mag-bind ng database, gumawa ng mga kahilingan sa iba't ibang mga API, mag-parse ng mga site, magsagawa ng mga kumplikadong kalkulasyon, atbp. Ang bagay ay limitado lamang sa pamamagitan ng iyong imahinasyon. Sana sa mga linyang ito ay naipaliwanag ko sa iyo ng kaunti ang aking isusulat. Ang pagrerehistro ng bot sa Telegram ay napakasimple; ang prosesong ito ay inilarawan nang detalyado sa dokumentasyon sa link sa itaas. Para sa aming aplikasyon kailangan mo lamang malaman ang pangalan ng bot at ang token na matatanggap mo sa pagpaparehistro. Sa pangkalahatan, ang bot ay isang console web application lamang. Walang frontend, puro command processing. Kung nais mong mahusay na makabisado ang Hibernate o matutunan kung paano i-parse ang JSON, kung gayon ang proyektong ito ay para sa iyo. Magsimula tayo sa pamamagitan ng pagsasama ng dependency sa pom.xml (ipagpalagay namin na gumagamit ka ng Maven). Magagawa mo ito tulad nito:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Pagkatapos ay lumikha kami ng isang class Bot, inherit ito mula sa class TelegramLongPollingBot, overriding ang mga pamamaraan nito:
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;
    }
}
Well, ang mga nilalaman ng pamamaraan main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Sa pamamagitan ng paglalagay nito sa mga pamamaraan getBotUsername(), getBotToken()inilulunsad namin ang bot. Sa ngayon, nire-redirect niya lang sa amin ang anumang mensahe na ipinapadala namin sa kanya, isang uri ng "salamin". Gumagana ang lahat tulad ng sumusunod: kapag inilunsad mo ang application, magsisimula itong magpadala ng kahilingan sa GET sa server ng Telegram isang beses bawat n bilang ng mga segundo sa sumusunod na URL: https://api.telegram.org/BotToken/getMe, kung saan ang BotToken ay ang token ng iyong bot, na natatanggap sa isang tugon ng JSON na naglalaman ng lahat ng mga mensahe. Ang bawat naturang mensahe ay pinoproseso ng aklatan at dumarating sa pamamaraan OnUpdateReceived(Update update)bilang isang bagay Update. Iyon ang pinagtatrabahuhan namin. Ito ang kagandahan ng mga bot ng Telegram, maaari silang gumana sa anumang computer, para sa pagsubok kailangan mo lamang ilunsad ang application, hindi mo kailangang i-deploy ito sa pagho-host pagkatapos ng bawat pagbabago. Ito ay napaka komportable. Siyempre, ang bot ay maaaring i-configure upang gumana gamit ang isang webhook; ang manual ay matatagpuan sa Internet; para sa pagiging simple, gagana kami gamit ang LongPolling. Kung paano iproseso ang mga mensahe at kung ano ang ipapadala bilang tugon ay limitado lamang ng mga tool sa wika at library, lahat ng iba ay nasa iyong paghuhusga. Maaari kang gumawa ng bot na maghahanap ng mga video sa YouTube para sa iyo, maaari kang gumawa ng bot na araw-araw ay magpapadala sa iyo ng kung ano ang ipapadala mo sa iyong sarili, halimbawa, sa isang taon, isang uri ng kapsula ng oras. O maaari mong matutunan kung paano mag-integrate sa mga CRM system at gumawa ng mga bot para sa maliliit na negosyo, lahat ay limitado ng iyong imahinasyon. Sige lang. Alam ng mga gumamit ng bot na maginhawang makipag-ugnayan sa kanila gamit ang mga utos na nagsisimula sa tanda «/», halimbawa /start. Ngunit mayroong isang mas maginhawang paraan - mga pindutan. Mayroong dalawang uri ng mga button: ang mga lumalabas sa ibaba ng input field, ReplyKeyboardMarkupat ang mga button na direktang lumilitaw sa ibaba ng mensahe kung saan sila naka-link InlineKeyboardMarkup. Sa dokumentasyon maaari mong madaling pamilyar ang iyong sarili sa kanilang paglalarawan. ReplyKeyboardMarkup. Mahalagang ito ay isang hanay ng mga array ng button, List<KeyboardRow<KeyboardButton>>. Narito ang isang halimbawang code na lumilikha ng keyboard
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);
    }
Sa isang paraan sendMsg(), tinatawag namin ang paraang ito sa pamamagitan ng pagpasa ng mensahe dito, kaya itinatakda ang keyboard para sa mensaheng iyon. Kapag ipinadala namin ang mensaheng ito sa user, makikita niya ang text ng mensahe na itinakda namin, pati na rin ang 2 button na nagsasabing Hello at Help, sa tabi ng isa't isa. Sa pamamagitan ng pag-click sa mga button na ito, isang mensahe ang ipapadala sa bot, ang teksto kung saan ay kung ano ang nakasulat sa button. Iyon ay, kung ang kliyente ay nag-click sa "Tulong", ang bot ay makakatanggap ng isang mensahe na may tekstong "Tulong". Para sa kanya, parang ang kliyente mismo ang nagsulat ng text na "Tulong" at ipinadala ito sa kanya. Well, pagkatapos ay pinoproseso mo ang mga ganoong mensahe. InlineKeyboardMarkup Isa rin itong hanay ng mga array, ito ay katulad ng nakaraang Markup, ngunit ang operating logic dito ay bahagyang naiiba. Ang nasabing keyboard ay nakatali sa isang partikular na mensahe at umiiral lamang para dito. Narito ang paraan ng pag-install ng Inline na keyboard
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);
    }
Lumikha Listsa List, magdagdag ng isang Inline na pindutan sa unang linya. Ang nasabing button ay maaaring maglaman ng isang URL, isang link sa isang channel, o CallbackQuery, na isusulat ko sa ibang pagkakataon. Dito namin itinakda ang text para sa aming button na makikita ng user at pagkatapos ay itakda ang data na ipapadala sa bot. Sa aming halimbawa, nakikita ng user ang "Hello", at kapag na-click, ipapadala sa bot ang numero 17, ito ang aming CallbackQuery. Ilang salita tungkol sa CallbackQuery. Upang makakuha ng naturang data mula sa isang bagay, Updatekailangan mong isagawa update.getCallbackQuery(), ang pamamaraang ito ay babalik CallbackQuery, kung saan maaari mo nang makuha ang data na mailipat sa bot. Hindi na kailangang subukang makuha ang data na ito sa pamamagitan ng paraan update.getMessage().getText(), kumuha 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());
        }
    }
Kung mayroong mensahe, ipinapadala namin ang mensahe para sa pagproseso sa isang bagong thread; kung may mensahe CallbackQuery, ipinapadala namin ito para sa pagproseso sa naaangkop na thread. Maaari kang magpadala ng tugon sa CallbackQuery. Ang bawat bagay sa Telegram ay may sariling id. Upang magpadala ng tugon sa isang tiyak, CallbackQuerykailangan lang nating malaman ang id nito, na matatanggap natin mula sa kaukulang bagay. Upang magpadala ng tugon, tawagan ang paraang ito:
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();
        }
    }
MAHALAGA:Ang teksto sa sagot CallbackQueryay hindi dapat mas mahaba sa 200 character! Kapag nagpapadala ng ganoong tugon, makakatanggap ang kliyente ng pop-up window kung saan isusulat ang mensahe. Maaaring mawala ang naturang window ilang segundo pagkatapos itong lumitaw, o maaaring mag-hang hanggang sa pinindot ng user ang OK. Upang ilipat ang mga mode na ito, tinatawag namin ang answer.setShowAlert(true). Kapag truenag-hang ang window hanggang sa pinindot mo ang OK, kapag falsenawala ito pagkatapos ng 5 segundo. Sa prinsipyo, ito ang lahat ng mga pangunahing tampok ng Telegram bot library. Kung gusto mo, maaari mong matutunan ang mga bagay tulad ng pagpapadala ng multimedia, geolocation, atbp. mula sa dokumentasyon. Magpatuloy tayo sa pag-deploy ng ating bot sa pagho-host. Para sa aking proyekto, pinili ko ang Heroku, dahil sa palagay ko ito ay isang medyo maginhawang pagho-host na may sariling CLI. Ito ay libre, ngunit sa rate na ito ang iyong bot ay mapupunta sa hibernation pagkatapos ng 30 minuto kung walang mga kahilingan. Kapag may ipinadalang kahilingan sa kanya, nagigising siya. Nangyayari ito nang mabilis, hindi mo mapapansin (maliban kung, siyempre, ang koneksyon sa database ay muling naitatag). Ang limitasyon sa libreng plano ay 5MB database, 100MB disk space, 2TB traffic bawat buwan, 1 dino. Dino ang iyong tumatakbong application. Sasabihin ko kaagad na ang yugto ng pag-deploy ang nagdulot ng mga paghihirap para sa akin, dahil hindi ko pa na-deploy ang aking mga aplikasyon noon. Kapag nagde-deploy, nangangailangan si Heroku ng file na pinangalanang Procfile (walang extension). Ginagawa namin ito sa ugat ng proyekto, isulat doon worker: sh target/bin/workerBot ang workerBot - ang pangalan na tinukoy namin sa pom.xml Ang sh script na nabuo gamit ang Maven plugin appassembler-maven-plugin ay ilulunsad. Inilalarawan ng script ang pagpapatakbo ng pinagsama-samang garapon. Ang pangalan ng klase na ilulunsad ay ipinahiwatig sa pagitan ng <mainClass></mainClass>, ang pangalan ng script sa pagitan ng <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>
Bago simulan ang prosesong ito, dapat kang magparehistro sa Heroku, i-install ang Git at Heroku CLI. Kung ang iyong aplikasyon ay nangangailangan ng isang database, pagkatapos ay kapag nagrerehistro ng isang bagong aplikasyon, huwag kalimutang idagdag ang database na kailangan mo. Susunod, kailangan mong malaman ang host, username, password at port ng iyong database, at pagkatapos ay tukuyin ito sa iyong application. Susunod, bago i-deploy, buuin ang iyong proyekto gamit ang Maven.
mvn clean install
Upang magsimula, pumunta kami sa direktoryo ng aming proyekto, simulan ang repositoryo gamit ang utosgit init Pagkatapos ay idagdag namin ang aming proyekto sa imbakan na ito
git add .
Pagkatapos naming gawin ang mga pagbabago
git commit -m “First commit in project”
Susunod na kailangan mong mag-log in sa heroku, sumulat sa command line
heroku login
Ipasok ang iyong data na tinukoy sa panahon ng pagpaparehistro. Pagkatapos ay kailangan mong malaman ang URL ng iyong imbakan sa Heroku, ginagawa ito sa mga setting. Tapos nagsusulat kami
git remote add heroku [url]
Ang heroku remote repository ay idaragdag sa iyong repository. Sunod naming isusulat
git push heroku master
Naghihintay kami... Kung matagumpay ang deployment ng application, ipapatupad namin ang command
heroku ps:scale worker=1
At iyon nga, tumatakbo na ang iyong application. Kung hindi ito mangyayari, tingnang mabuti ang mga log; malamang na mayroong error sa iyong application na naging sanhi ng pag-crash nito. Salamat sa pagbabasa ng napakahabang artikulo, umaasa ako na may nakakakita nito na kapaki-pakinabang at nakakatipid ng maraming oras sa mga lugar kung saan ako natitisod sa panahon ng pag-unlad.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION