JavaRush /Java Blogu /Random-AZ /Java-da Telegram botunun yaradılması: ideyadan tətbiqə qə...
John Watson
Səviyyə

Java-da Telegram botunun yaradılması: ideyadan tətbiqə qədər

Qrupda dərc edilmişdir
Hər halda botlar nədir? Bu barədə ətraflı burada oxuya bilərsiniz . Əvvəlcə Telegram-da botların hazırlanması üçün kitabxananın rəsmi sənədlərini oxumalısınız (bundan sonra API adlandırılacaq). O, burada yatır . Java-da Telegram botunun yaradılması: ideyadan tətbiqə qədər - 1Orada hər şey çox əlçatan və başa düşüləndir. Deyəsən yaz və sevin! Amma bu o qədər də sadə deyil. Axtarış sistemlərində çox vaxt sərf etdikdən sonra botların inkişafı ilə bağlı bilik parçaları tapdım, məsələn, klaviaturanın necə hazırlanması, CallbackQuery-nin işlənməsi və s. Mən heç vaxt Java-da botların inkişafı üçün tam və hərtərəfli bələdçi tapmamışam. Bu, məni bu yazını yazmağa vadar etdi. İnternetdə bir çox sayt var ki, orada hazır yerləşdirmə ilə öz botunuzu yarada bilərsiniz. Amma məsələ ondadır. ki, əksər hallarda fon məlumatı və s. təmin edə bilən botlar yaradılır. Bizim bot tam hüquqlu veb proqramdır, ona verilənlər bazasını bağlaya, müxtəlif API-lərə sorğu verə, saytları təhlil edə, mürəkkəb hesablamalar apara və s. Məsələ yalnız sizin təsəvvürünüzlə məhdudlaşır. Ümid edirəm ki, bu sətirlərdə yazacağım şeyləri sizə bir az da izah etdim. Telegram-da botun qeydiyyatı çox sadədir, bu proses yuxarıdakı linkdəki sənədlərdə ətraflı təsvir edilmişdir. Tətbiqimiz üçün yalnız botun adını və qeydiyyat zamanı alacağınız tokeni bilməlisiniz. Əslində, bot sadəcə konsol veb tətbiqidir. Frontend yoxdur, təmiz əmr emalı. Hibernate rejimini yaxşı mənimsəmək və ya JSON-u təhlil etməyi öyrənmək istəyirsinizsə, bu layihə sizin üçündür. Pom.xml-ə asılılığı daxil etməklə başlayaq (biz Maven istifadə etdiyinizi güman edirik). Bunu belə edə bilərsiniz:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Sonra bir sinif yaradırıq , metodlarını ləğv edərək Botonu sinifdən miras alırıq :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;
    }
}
Yaxşı, metodun məzmunu main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Onu üsullara daxil etməklə getBotUsername()biz getBotToken()botu işə salırıq. Hələlik o, yalnız ona göndərdiyimiz mesajları bizə yönləndirir, bir növ “güzgü”. Hamısı aşağıdakı kimi işləyir: proqramı işə saldığınız zaman o, aşağıdakı URL-də saniyədə bir dəfə Telegram serverinə GET sorğusu göndərməyə başlayır: https://api.telegram.org/BotToken/getMe, burada BotToken bütün mesajları ehtiva edən JSON cavabını alan botunuzun nişanı. Hər bir belə mesaj kitabxana tərəfindən işlənir və metoda OnUpdateReceived(Update update)obyekt kimi gəlir Update. Biz bununla işləyirik. Telegram botlarının gözəlliyi budur, onlar istənilən kompüterdə işləyə bilirlər, sınaqdan keçmək üçün proqramı işə salmaq kifayətdir, hər dəyişiklikdən sonra onu hostinqdə yerləşdirməyə ehtiyac yoxdur. Çox rahatdır. Əlbəttə ki, bot veb-qancadan istifadə etməklə işləmək üçün konfiqurasiya edilə bilər; təlimatı İnternetdə tapmaq olar; sadəlik üçün biz LongPolling-dən istifadə edəcəyik. Mesajları necə emal etmək və cavab olaraq nə göndərmək yalnız dil alətləri və kitabxana ilə məhdudlaşır, qalan hər şey sizin ixtiyarınızdadır. Sizin üçün YouTube-da video axtaracaq bir bot edə bilərsiniz, hər gün özünüzə göndərdiyinizi sizə göndərəcək bir bot edə bilərsiniz, məsələn, bir ildə bir növ zaman kapsulu. Və ya CRM sistemlərinə inteqrasiya etməyi və kiçik biznes üçün botlar hazırlamağı öyrənə bilərsiniz, hər şey sizin təsəvvürünüzlə məhdudlaşır. Davam et. «/»Botlardan istifadə edənlər bilirlər ki , məsələn , işarə ilə başlayan əmrlərdən istifadə etməklə onlarla ünsiyyət qurmaq rahatdır /start. Ancaq daha rahat bir yol var - düymələr. Düymələrin iki növü var: giriş sahəsinin altında görünən ReplyKeyboardMarkupdüymələr və əlaqələndirildiyi mesajın birbaşa altında görünən düymələr InlineKeyboardMarkup. Sənədlərdə onların təsviri ilə qısaca tanış ola bilərsiniz. ReplyKeyboard Markup. Əslində bu, düymə massivlərinin bir sırasıdır, List<KeyboardRow<KeyboardButton>>. Klaviaturanı yaradan kod nümunəsidir
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);
    }
Metodda sendMsg()biz ona mesaj ötürməklə bu metodu çağırırıq və beləliklə, həmin mesaj üçün klaviaturanı təyin edirik. Bu mesajı istifadəçiyə göndərdiyimiz zaman o, bizim təyin etdiyimiz mesaj mətnini, həmçinin Salam və Kömək deyən 2 düyməni bir-birinin yanında görəcək. Bu düymələrə basmaqla bota mesaj göndəriləcək, mətni düymənin üzərində yazılmışdır. Yəni, müştəri “Kömək” düyməsini klikləsə, bot “Kömək” mətni ilə mesaj alacaq. Onun üçün sanki müştəri özü “Kömək” mətnini yazıb ona göndərib. Yaxşı, o zaman belə mesajları emal edirsiniz. InlineKeyboardMarkup Bu da massivlər massividir, əvvəlki İşarəyə bənzəyir, lakin burada əməliyyat məntiqi bir qədər fərqlidir. Belə bir klaviatura müəyyən bir mesaja bağlıdır və yalnız onun üçün mövcuddur. Budur Inline klaviaturanı quraşdırmağın üsulu
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-də yaradın List, birinci sətirə Inline düyməsi əlavə edin. CallbackQueryBelə bir düymədə bir az sonra yazacağım URL, kanala keçid və ya . Burada istifadəçinin görəcəyi düyməmiz üçün mətni təyin edirik və sonra bota göndəriləcək məlumatları təyin edirik. Bizim nümunəmizdə istifadəçi “Salam” görür və kliklədikdə bota 17 nömrəsi göndəriləcək, bu bizim CallbackQuery. haqqında bir neçə söz CallbackQuery. Bir obyektdən bu cür məlumatları əldə etmək üçün Updateicra etməlisiniz update.getCallbackQuery(), bu üsul geri qayıdır CallbackQuery, ondan artıq bota ötürülən məlumatları əldə edə bilərsiniz. Metod vasitəsilə bu məlumatları əldə etməyə çalışmaq lazım deyil update.getMessage().getText(), alın 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());
        }
    }
Mesaj varsa, emalı üçün mesajı yeni başlığa göndəririk; mesaj varsa CallbackQuery, onu emal üçün müvafiq mövzuya göndəririk. -a cavab göndərə bilərsiniz CallbackQuery. Telegram-da hər bir obyektin öz id-si var. Müəyyən bir birinə cavab göndərmək üçün CallbackQueryyalnız müvafiq obyektdən alacağımız onun id-sini bilməliyik. Cavab göndərmək üçün bu metodu çağırın:
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();
        }
    }
ƏHƏMİYYƏTLİ:Cavabdakı mətn CallbackQuery200 simvoldan çox olmamalıdır! Belə bir cavab göndərərkən, müştəri mesajın yazılacağı bir pop-up pəncərə alacaq. Belə bir pəncərə göründükdən bir neçə saniyə sonra yox ola bilər və ya istifadəçi OK düyməsini basana qədər asa bilər. Bu rejimləri dəyişmək üçün answer.setShowAlert(true). truePəncərə OK düyməsini basana qədər asılı qaldıqda , false5 saniyədən sonra yox olduqda. Prinsipcə, bunlar Telegram bot kitabxanasının bütün əsas xüsusiyyətləridir. İstəyirsinizsə, sənədlərdən multimedia göndərmə, geolokasiya və s. kimi şeyləri öyrənə bilərsiniz. Botumuzu hostinqdə yerləşdirməyə davam edək. Layihəm üçün Heroku seçdim, çünki mənim fikrimcə, öz CLI-si olan kifayət qədər rahat hostingdir. Bu pulsuzdur, lakin bu sürətlə heç bir sorğu olmadıqda botunuz 30 dəqiqədən sonra qışlama rejiminə keçəcək. Ona sorğu göndəriləndə o, ayılır. Bu, olduqca tez baş verir, hətta fərqinə varmayacaqsınız (əlbəttə ki, verilənlər bazası ilə əlaqə yenidən qurulmazsa). Pulsuz plan üzrə limit 5MB verilənlər bazası, 100MB disk sahəsi, ayda 2TB trafik, 1 dinodur. Dino çalışan tətbiqinizdir. Dərhal deyəcəyəm ki, mənim üçün çətinlik yaradan yerləşdirmə mərhələsi idi, çünki əvvəllər tətbiqlərimi yerləşdirməmişdim. Yerləşdirmə zamanı Heroku Procfile adlı fayl tələb edir (uzatma olmadan). Biz onu layihənin kökündə yaradırıq, orada worker: sh target/bin/workerBot workerBot yazırıq - Maven plaginindən istifadə edərək yaradılan sh skriptində göstərdiyimiz ad pom.xml appassembler-maven-plugin işə salınacaq. Skript tərtib edilmiş kavanozun işləməsini təsvir edir. Başlanacaq sinfin adı <mainClass></mainClass>, skriptin adı <name></name> pom.xml arasında göstərilir:
...
<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 prosesə başlamazdan əvvəl Heroku-da qeydiyyatdan keçməli, Git və Heroku CLI-ni quraşdırmalısınız. Əgər ərizəniz verilənlər bazası tələb edirsə, o zaman yeni tətbiqi qeydiyyatdan keçirərkən sizə lazım olan verilənlər bazasını əlavə etməyi unutmayın. Sonra, verilənlər bazanızın hostunu, istifadəçi adını, parolunu və portunu tapmalı və sonra onu ərizənizdə göstərməlisiniz. Sonra, yerləşdirmədən əvvəl Maven istifadə edərək layihənizi qurun.
mvn clean install
Başlamaq üçün layihəmizin kataloquna gedirik, əmri ilə repozitoriyanı işə salırıq git init Sonra layihəmizi bu depoya əlavə edirik.
git add .
Dəyişiklikləri etdikdən sonra
git commit -m “First commit in project”
Sonra heroku-ya daxil olmalısınız, əmr satırına yazın
heroku login
Qeydiyyat zamanı göstərilən məlumatlarınızı daxil edin. Sonra Heroku-da anbarınızın URL-ni tapmalısınız, bu parametrlərdə edilir. Sonra yazırıq
git remote add heroku [url]
Heroku uzaq deposu anbarınıza əlavə olunacaq. Bundan sonra yazırıq
git push heroku master
Biz gözləyirik... Proqramın yerləşdirilməsi uğurlu olarsa, əmri yerinə yetiririk
heroku ps:scale worker=1
Və budur, tətbiqiniz işləyir. Əgər bu baş vermirsə, qeydlərə diqqətlə baxın, çox güman ki, tətbiqinizdə qəzaya səbəb olan xəta var. Belə uzun bir məqaləni oxuduğunuz üçün təşəkkür edirəm, ümid edirəm ki, kimsə onu faydalı hesab edir və inkişaf zamanı büdrədiyim yerlərdə çox vaxt qənaət edir.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION