CodeGym /Java блог /Случаен /Създаване на Telegram Bot в Java: от концепцията до внедр...
John Squirrels
Ниво
San Francisco

Създаване на Telegram Bot в Java: от концепцията до внедряването

Публикувано в групата
И така, Howво са ботовете? Можете да прочетете повече за това тук . За да започнете, трябва да прегледате официалната documentация за библиотеката, използвана за разработване на ботове на Telegram (наричана по-долу „API“). Може да се намери тук .
Създаване на Telegram Bot в Java: от концепцията до внедряването - 1
Там всичко е много достъпно и ясно. Изглежда, че можем просто да пишем code и да се радваме! Но не е толкова просто. След като прекарах много време в търсене, открих хапки знания за разработването на ботове, например How да направя клавиатура, да боравя сCallbackQuery, и т.н. Но не намерих пълно, изчерпателно ръководство за разработка на Java бот. Това ме подтикна да напиша тази статия. Има много уебсайтове, където можете да създадете свой собствен лесно внедряем бот. Но факт е, че повечето от създадените ботове предоставят справочна информация и други подобни. Нашият бот е пълноценно уеб приложение. Можете да свържете база данни, да изпълнявате различни API заявки, да анализирате уебсайтове, да извършвате сложни изчисления и др. Възможностите са ограничени само от вашето въображение. Надявам се, че горното е помогнало за изясняване на това, за което ще пиша. Много е лесно да регистрирате бот в Telegram. Този процес е описан подробно в documentацията, свързана по-горе. За нашето приложение трябва да знаете само името на бота и токена, който получавате, когато регистрирате бота. по принцип, ботът е просто уеб приложение, базирано на конзола. Няма преден край, само чиста обработка на команди. Ако искате да овладеетеХибернация or научете How да анализирате 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 creating a message and sending it.
     * @param chatId chat id
     * @param s The String that you want 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());
        }
    }

    /**
     * This method returns the bot's name, which was specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        return "BotName";
    }

    /**
     * This method returns the bot's token for communicating with the Telegram server
     * @return the bot's token
     */
    @Override
    public String getBotToken() {
        return "BotToken";
    }
}
А сега съдържанието на mainметода:

public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
След като попълните getBotUsername()и getBotToken()методите, стартирайте бота. Засега той просто пренасочва към нас всички съобщения, които изпращаме до него, нещо като „ огледало “. Работи по следния начин: когато стартирате приложението, то започва да изпраща заявки до сървъра на Telegram веднъж на всеки n секунди на следния URL address: https://api.telegram.org/BotToken/getMe , където BotToken е токенът на вашия бот . В отговор получава JSON, съдържащ всички съобщения. Всяко от тези съобщения се обработва от библиотеката и се предава на OnUpdateReceived(Update update)метода като anUpdateобект. И това е, с което работим. Тук се крие красотата на ботовете на Telegram: те могат да работят на всеки компютър, тестването му просто изисква стартиране на приложението и не е необходимо да го разполагате на хоста след всяка промяна. Това е много удобно. Разбира се, можете да конфигурирате бот да работи с уеб кукички. Можете да намерите указания за това в интернет. За простота ще използваме LongPolling. Как се обработват съобщенията и това, което изпращате в отговор, са ограничени само от възможностите на езика и библиотеката. Всичко останало зависи от вас. Можете да направите бот, който ще търси видеоклипове в YouTube instead of вас. Можете да направите бот, който ще ви изпраща това, което вие изпращате всеки ден, като капсула на времето от преди година. Или можете да се научите да се интегрирате с CRM системи и да правите ботове за малкия бизнес - вие сте ограничени само от вашето въображение. Преместване на. Тези, които са използвали ботове, знаят, че е удобно да взаимодействат с тях с помощта на команди, които започват със знака " /", например, /start. Но има по-удобен начин: бутони. Има два вида бутони: тези, които се появяват под поле за въвеждане ( ReplyKeyboardMarkup) и бутони, които са директно под съобщението, към което са свързани (InlineKeyboardMarkup). Можете да получите основно разбиране за тях от описанията им в documentацията.

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 rows
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First keyboard row
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first keyboard row
        keyboardFirstRow.add(new KeyboardButton("Hi"));

        // Second keyboard row
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add the buttons to the second keyboard row
        keyboardSecondRow.add(new KeyboardButton("Help");

        // Add all of the keyboard rows to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and assign this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
Ние наричаме този метод в sendMsg()метода, след като му предадем съобщение. Ето How настройваме клавиатура за това съобщение. Когато изпратим това съобщение до потребителя, той ще види текста на нашето съобщение и 2 бутона, които казват "Здравей" и "Помощ" , един под друг. Когато се щракне върху един от тези бутони, на бота се изпраща съобщение, съдържащо текста на бутона. Така че, ако клиентът кликне върху „Помощ“ , ботът ще получи съобщение с „Помощ“. За бота ще изглежда, че самият клиент е написал „Помощ“ и е изпратил текста до бота. И след това обработвате съобщенията.

InlineKeyboardMarkup

Това също е масив от масиви. Подобен е на предишния Markup, но тук логиката работи малко по-различно. Този тип клавиатура е прикачена към конкретно съобщение и съществува само за него. Ето метод за настройка на вградена клавиатура:

private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
Създайте в Listрамките на Listи добавете вградения бутон към първия ред. Този бутон може да съдържа URL, връзка към канал or 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();
        }
    }
ВАЖНО:Текстът в отговор на a CallbackQueryне трябва да е по-дълъг от 200 знака! След като изпрати такъв отговор, клиентът ще види изскачащ прозорец, съдържащ съобщението. Този прозорец може да изчезне няколко секунди, след като се появи, or може да продължи, докато потребителят не натисне OK. За да превключим режимите, извикваме answer.setShowAlert(true)метода. Ако преминете trueкъм метода, прозорецът остава, докато не се натисне OK. Ако подадете false, той изчезва след 5 секунди. Това са всички основни функции на библиотеката на Telegram Bot . Ако искате, можете да научите неща като How да изпращате мултимедия, геолокация и т.н. Нека да преминем към разполагането на нашия бот в хостинг платформа. За моя проект избрах Heroku. Мисля, че това е доста удобна хостинг платформа със собствен CLI. Безплатно е, но при този план вашият бот ще влезе в хибернация след 30 minutesи след получаване на заявки. Ще се събуди, когато бъде получена заявка. Това се случва толкова бързо, че дори няма да забележите (освен ако, разбира се, връзката с базата данни не се рестартира). Безплатният план е ограничен от 5MB база данни, 100MB дисково пространство, 2TB данни на месец и 1 dyno. Дино е вашето приложение за бягане. Веднага ще кажа, че внедряването ми създаде затруднения, тъй като никога преди не бях внедрявал applicationsта си. По време на внедряването Heroku изисква файл с име Procfile (без разширение). Ние го създаваме в корена на проекта. Вътре пишем worker: sh target/bin/workerBot, където workerBot е името, посочено в pom.xml. A shще се стартира скрипт, генериран от приставката за асемблер на applications Maven (appassembler-maven-plugin). Скриптът описва How да стартирате компorран jar файл. Името на класа за стартиране е посочено между <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
Първо отиваме в нашата директория на проекта и инициализираме хранorщето с командата git init. След това добавяме нашия проект към това хранorще.

git add .
След това извършваме промените

git commit -m "First commit in the project"
След това трябва да влезете в heroku. Напишете следното в командния ред

heroku login
Въведете идентификационните данни, които сте създали по време на регистрацията. След това определете URL address на вашето хранorще в heroku. Правите това в настройките. След това пишем

git remote add heroku [url]
Към вашето хранorще се добавя отдалечено хранorще на heroku. След това пишем

git push heroku master
След това чакаме... ако приложението се внедри успешно, изпълнете следната команда

heroku ps:scale worker=1
И това е всичко, вашето приложение е готово и работи. Ако не е, погледнете внимателно дневниците. Най-вероятно грешка във вашето приложение е причинила неуспеха му. Благодаря ви, че прочетохте толкова дълга статия. Надявам се, че някой ще го намери за полезен и че ще ви спести много време в областите, които ми създаваха проблеми по време на разработката.
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION