JavaRush /Java Blog /Random-TK /Java-da Telegram botyny döretmek: pikirden ýaýbaňlandyrma...
John Watson
Dereje

Java-da Telegram botyny döretmek: pikirden ýaýbaňlandyrmak

Toparda çap edildi
Botlar näme? Bu hakda jikme-jik şu ýerden okap bilersiňiz . Ilki bilen, Telegramda (mundan beýläk API diýilýär) botlary ösdürmek üçin kitaphananyň resmi resminamalaryny okamaly. Ol şu ýerde ýatýar . Java-da Telegram botyny döretmek: pikirden ýaýbaňlandyrmak - 1Ol ýerdäki hemme zat gaty elýeterli we düşnükli. Writeazyp, begenýän ýaly! Emma bu ýönekeý däl. Gözleg motorlarynda köp wagt geçirenimden soň, botyň ösüşi barada bilimleriň böleklerini tapdym, mysal üçin, klawiaturany nädip ýasamaly, CallbackQuery gaýtadan işlemeli we ş.m. Java-da botlary ösdürmek üçin doly we giňişleýin gollanma tapmadym. Bu meni bu makalany ýazmaga iterdi. Internetde taýýar enjam bilen öz botyňyzy döredip boljak köp sanly sahypa bar. Pointöne esasy zat. köplenç fon maglumatlary berip bilýän botlaryň döredilýändigini we ş.m. Botumyz doly hukukly web programmasy bolup, oňa maglumat bazasyny baglap, dürli API-lerden haýyşlar edip bilersiňiz, sahypalary derňäp bilersiňiz, çylşyrymly hasaplamalary ýerine ýetirip bilersiňiz we ş.m. Mesele diňe hyýalyňyz bilen çäklenýär. Bu setirlerde size näme hakda ýazjakdygymy azajyk düşündirdim diýip umyt edýärin. Telegramda bot bellige almak gaty ýönekeý, bu amal ýokardaky baglanyşykdaky resminamalarda jikme-jik beýan edilýär. Arzamyz üçin diňe botyň adyny we hasaba alnandan soň aljak belligiňizi bilmeli. Aslynda, bot diňe konsol web programmasydyr. Öň tarapy, arassa buýrugy gaýtadan işlemek ýok. Gibernate-ni gowy özleşdirmek ýa-da JSON-y nädip derňemegi öwrenmek isleseňiz, bu taslama siziň üçin. Pom.xml-e baglylygy goşmak bilen başlalyň (Maven ulanýarsyňyz öýdýäris). Muny şeýle edip bilersiňiz:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Soňra bolsa, usullaryny ýok edip, synp döredýäris , Botsynpdan miras alýarys :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;
    }
}
Usulyň mazmuny main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Usullara girizip getBotUsername(), getBotToken()boty işe girizýäris. Häzirlikçe, diňe bize iberýän habarlarymyzy, “aýna” görnüşini gönükdirýär. Bularyň hemmesi aşakdaky ýaly işleýär: programmany işe girizeniňizde, aşakdaky URL-de her sekuntda bir gezek GET haýyşyny iberip başlaýar: https://api.telegram.org/BotToken/getMe, BotToken ýerleşýän ýeri ähli habarlary öz içine alýan JSON jogabyny alýan botuňyzyň nyşany. Şeýle habarlaryň her biri kitaphana tarapyndan işlenýär we usula OnUpdateReceived(Update update)obýekt hökmünde gelýär Update. Bu biziň işleýän zadymyz. Bu, “Telegram” botlarynyň gözelligi, olar islendik kompýuterde işläp bilerler, programmany işe girizmegiňize synanyşmak üçin, her üýtgeşmeden soň ony hostinge ýerleşdirmegiň zerurlygy ýok. Bu örän amatly. Elbetde, bot webhook ulanyp işlemek üçin düzülip bilner; gollanmany internetde tapyp bilersiňiz; ýönekeýligi üçin LongPolling ulanyp işläris. Habarlary nädip işlemeli we jogap hökmünde näme ibermeli diňe dil gurallary we kitaphana bilen çäklenýär, galan zatlaryň hemmesi siziň ygtyýaryňyzda. “YouTube” -da wideo gözleýän bot ýasap bilersiňiz, her gün özüňize iberýän zadyňyzy iberjek bot ýasap bilersiňiz, mysal üçin bir ýylda, wagt kapsulasynyň bir görnüşi. Ora-da CRM ulgamlaryna nädip goşulmalydygyny we kiçi kärhanalar üçin bot ýasamagy öwrenip bilersiňiz, hemme zat hyýalyňyz bilen çäklenýär. Öňe git. Botlary ulananlar, «/»meselem, belgi bilen başlaýan buýruklary ulanyp, olar bilen aragatnaşyk saklamagyň amatlydygyny bilýärler /start. Emma has amatly ýol - düwmeler bar. Düwmeleriň iki görnüşi bar: giriş meýdanynyň aşagynda görünýänler ReplyKeyboardMarkupwe baglanyşdyrylan habaryň aşagynda görünýän düwmeler InlineKeyboardMarkup. Resminamalarda olaryň beýany bilen gysgaça tanşyp bilersiňiz. ReplyKeyboardMarkup. Aslynda bu düwmeleriň massiwidir List<KeyboardRow<KeyboardButton>>. Ine, klawiaturany döredýän mysal kody
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);
    }
Bir usul bilen sendMsg(), bu habary oňa habar iberip, şol habar üçin klawiaturany düzýäris. Bu habary ulanyja iberenimizde, ol bellän habarymyzyň tekstini, biri-biriniň gapdalynda “Salam we kömek” diýilýän 2 düwmäni görer. Bu düwmelere basmak bilen, düwmä ýazylan tekst bot-a habar iberiler. .Agny, müşderi “Kömek” düwmesine bassa, bot “Kömek” teksti bilen habar alar. Onuň üçin, müşderiniň özi “Kömek” tekstini ýazyp, özüne iberen ýaly. Onda, şeýle habarlary gaýtadan işleýärsiňiz. InlineKeyboardMarkup Bu hem bir topar massiw, öňki Markupa meňzeýär, ýöne bu ýerdäki iş logikasy birneme tapawutlanýar. Şeýle klawiatura belli bir habara bagly bolup, diňe şonuň üçin bar. Ine, Inline klawiaturasyny gurmagyň usuly
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);
    }
Dörediň , birinji setire Giriş düwmesini goşuň List. ListŞeýle düwme URL, kanala baglanyşyk ýa-da CallbackQuerybiraz soňrak ýazjak bolup biler. Bu ýerde ulanyjynyň görjek düwmesi üçin tekst düzýäris we soňra bot-a iberiljek maglumatlary düzýäris. Mysal üçin, ulanyjy “Salam” görýär we basylanda bot 17 belgisini iberer, bu biziň CallbackQuery. Bu barada birnäçe söz CallbackQuery. Obýektden şeýle maglumatlary almak üçin Updateýerine ýetirmeli update.getCallbackQuery(), bu usul gaýdyp gelýär CallbackQuery, ondan maglumatlary bot-a geçirip bilersiňiz. update.getMessage().getText()Bu maglumatlary usul arkaly almaga synanyşmagyň zerurlygy ýok 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());
        }
    }
Habar bar bolsa, habary täze sapaga ibermek üçin iberýäris; habar bar bolsa CallbackQuery, degişli sapaga gaýtadan işlemek üçin iberýäris. CallbackQueryJogap iberip bilersiňiz . Telegramdaky her bir obýektiň öz şahsyýeti bar. Belli birine jogap ibermek üçin CallbackQuerydiňe degişli obýektden aljak idini bilmeli. Jogap ibermek üçin şu usula jaň ediň:
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();
        }
    }
Möhüm:Jogapdaky tekst CallbackQuery200 simwoldan köp bolmaly däldir! Şeýle jogap iberilende, müşderi habaryň ýazyljak penjiresini alar. Şeýle penjire peýda bolanyndan birnäçe sekunt soň ýitip biler ýa-da ulanyjy OK basýança asylyp biler. Bu reesimleri üýtgetmek üçin jaň edýäris answer.setShowAlert(true). Haçan true-da OK basýançaňyz penjire asylsa, false5 sekuntdan soň ýitirim bolanda. Aslynda, bularyň hemmesi Telegram bot kitaphanasynyň esasy aýratynlyklary. Isleseňiz, resminamalardan multimediýa ibermek, geolokasiýa we ş.m. ýaly zatlary öwrenip bilersiňiz. Geliň, hostingimizi ýerleşdirmäge geçeliň. Taslamam üçin Heroku saýladym, sebäbi meniň pikirimçe, öz CLI-si bolan gaty amatly hosting. Mugt, ýöne bu ýagdaýda haýyş ýok bolsa, botyňyz 30 minutdan soň gibrasiýa girer. Oňa haýyş iberilende, oýanýar. Bu gaty çalt bolup geçýär, hatda duýmarsyňyz (elbetde, maglumatlar bazasyna birikme täzeden gurulmasa). Mugt meýilnamanyň çägi 5MB maglumat bazasy, 100MB disk meýdançasy, aýda 2TB traffigi, 1 dino. Dino siziň işleýän programmaňyz. Dessine aýdaryn, ýerleşdiriş tapgyry maňa kynçylyk döretdi, sebäbi ozal arzalarymy ýerleşdirmändim. Heroku ýerleşdirilende Procfile atly bir faýl talap edýär (giňeltmezden). worker: sh target/bin/workerBot Taslamanyň düýbünde döredýäris, “WorkBot” ýazyň - “Maven” plugin appassembler-maven-plugin ulanyp döredilen ş skriptinde görkezýän adymyz pom.xml işe giriziler. Scriptazgy, düzülen bankanyň işleýşini suratlandyrýar. Işe başlajak synpyň ady <mainClass> </mainClass> arasynda, <name> </name> pom.xml arasyndaky skriptiň ady görkezilýär:
...
<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>
Bu prosese başlamazdan ozal Herokuda hasaba alynmaly, Git we Heroku CLI gurmaly. Programmaňyz maglumatlar binýadyny talap edýän bolsa, täze programma bellige alnanda, zerur maglumat bazasyny goşmagy ýatdan çykarmaň. Ondan soň, maglumat bazasynyň eýesini, ulanyjy adyny, parolyny we portuny tapmaly we ony programmaňyzda görkezmeli. Ondan soň, ýerleşdirmezden ozal, “Maven” -i ulanyp, taslamaňyzy guruň.
mvn clean install
Ilki bilen, taslamamyzyň katalogyna geçýäris, buýrugy bilen ammary başlaýarysgit init Soňra taslamamyzy bu ammarda goşýarys
git add .
Üýtgeşmelerden soň
git commit -m “First commit in project”
Ondan soň heroku-a girmeli, buýruk setirine ýazmaly
heroku login
Hasaba alyş wagtynda görkezilen maglumatlaryňyzy giriziň. Soňra Herokudaky ammaryňyzyň URL-ni tapmaly, bu sazlamalarda ýerine ýetirilýär. Soň ýazýarys
git remote add heroku [url]
“Heroku” uzakdaky ammary ammaryňyza goşular. Indiki ýazarys
git push heroku master
Biz garaşýarys ... Programmany ýerleşdirmek üstünlikli bolsa, buýrugy ýerine ýetirýäris
heroku ps:scale worker=1
Ine, programmaňyz işleýär. Bu bolmasa, surnallara üns bilen serediň; programmaňyzda näsazlygyň ýüze çykmagyna sebäp bolan ýalňyşlyk bar. Şeýle uzyn makalany okanyňyz üçin sag boluň, kimdir biri muny peýdaly hasaplar we ösüş döwründe büdrän ýerlerimde köp wagt tygşytlar diýip umyt edýärin.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION