CodeGym /בלוג Java /Random-HE /יצירת בוט טלגרם ב-Java: מהתפיסה ועד לפריסה
John Squirrels
רָמָה
San Francisco

יצירת בוט טלגרם ב-Java: מהתפיסה ועד לפריסה

פורסם בקבוצה
אז מה זה בוטים? אתה יכול לקרוא עוד על זה כאן . כדי להתחיל, עליך לעיין בתיעוד הרשמי של הספרייה המשמשת לפיתוח בוטים של טלגרם (להלן "API"). ניתן למצוא אותו כאן .
יצירת בוט טלגרם ב-Java: מהתפיסה ועד לפריסה - 1
הכל שם מאוד נגיש וברור. נראה שאנחנו יכולים פשוט לכתוב קוד ולשמוח! אבל זה לא כל כך פשוט. לאחר שביליתי זמן רב בחיפושים, מצאתי מידע על פיתוח בוטים, למשל, כיצד ליצור מקלדת, לטפל ב- CallbackQueryוכו'. אבל, לא מצאתי מדריך שלם וממצה לפיתוח בוטים של Java. זה גרם לי לכתוב את המאמר הזה. יש הרבה אתרים שבהם אתה יכול ליצור בוט משלך שניתן לפריסה בקלות. אבל העובדה היא שרוב הבוטים שנוצרו מספקים מידע התייחסות וכדומה. הבוט שלנו הוא יישום אינטרנט מלא. ניתן לאגד מסד נתונים, לבצע בקשות API שונות, לנתח אתרים, לבצע חישובים מורכבים ועוד. האפשרויות מוגבלות רק על ידי הדמיון שלך. אני מקווה שהאמור לעיל עזר להבהיר על מה אני הולך לכתוב. קל מאוד לרשום בוט בטלגרם. תהליך זה מתואר בפירוט בתיעוד המקושר לעיל. עבור היישום שלנו, אתה רק צריך לדעת את שם הבוט ואת האסימון שאתה מקבל בעת רישום הבוט. בעיקרון, בוט הוא רק יישום אינטרנט מבוסס קונסולה. אין קצה קצה, רק עיבוד פקודות טהור. אם אתה רוצה להשתלט על Hibernate או ללמוד איך לנתח 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(), הפעל את הבוט. לעת עתה, הוא רק מפנה אלינו את כל ההודעות שאנו שולחים אליו, כמו " מראה ". זה עובד כך: כאשר אתה מפעיל את היישום, הוא מתחיל לשלוח בקשות לשרת הטלגרם, אחת ל-n שניות, בכתובת ה-URL הבאה: https://api.telegram.org/BotToken/getMe , כאשר BotToken הוא האסימון של הבוט שלך . בתגובה, הוא מקבל JSON המכיל את כל ההודעות. כל אחת מההודעות הללו מעובדת על ידי הספרייה ומועברת לשיטה OnUpdateReceived(Update update)כאובייקט Update. ועם זה אנחנו עובדים. כאן טמון היופי של הבוטים של טלגרם: הם יכולים לרוץ על כל מחשב, בדיקתו רק דורשת הפעלת האפליקציה, ואין צורך לפרוס אותו למארח לאחר כל שינוי. זה מאוד נוח. כמובן, אתה יכול להגדיר בוט לעבוד באמצעות webhooks. אתה יכול למצוא הנחיות לכך באינטרנט. לשם הפשטות, נשתמש ב- LongPolling . אופן עיבוד ההודעות ומה שאתה שולח בתגובה מוגבלים רק על ידי היכולות של השפה והספרייה. כל השאר תלוי בך. אתה יכול ליצור בוט שיחפש עבורך סרטוני יוטיוב. אתה יכול ליצור בוט שישלח לך את מה שאתה שולח לעצמך כל יום, כמו קפסולת זמן מלפני שנה. או שאתה יכול ללמוד להשתלב עם מערכות 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 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(), לאחר העברת הודעה. כך אנו מגדירים מקלדת עבור ההודעה הזו. כאשר אנו שולחים הודעה זו למשתמש, הוא יראה את הטקסט של ההודעה שלנו ו-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, קישור לערוץ או 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. לכל אובייקט בטלגרם יש מזהה משלו. כדי לשלוח תגובה לספציפי 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 תווים! לאחר שליחת תגובה כזו, הלקוח יראה חלון מוקפץ המכיל את ההודעה. חלון זה יכול להיעלם מספר שניות לאחר הופעתו, או שהוא יכול להימשך עד שהמשתמש ילחץ על אישור. כדי להחליף מצבים, אנו קוראים לשיטה answer.setShowAlert(true). אם תעבור trueלשיטה, החלון נמשך עד ללחיצה על אישור. אם אתה מעביר שקר, הוא נעלם לאחר 5 שניות. אלה כל התכונות הבסיסיות של ספריית Telegram Bot . אם תרצה, תוכל ללמוד דברים כמו שליחת מולטימדיה, מיקום גיאוגרפי וכו'. בוא נעבור לפריסת הבוט שלנו לפלטפורמת אירוח. עבור הפרויקט שלי, בחרתי בהרוקו . אני חושב שזו פלטפורמת אירוח נוחה למדי עם CLI משלה. זה בחינם, אבל בתוכנית זו הבוט שלך יעבור למצב שינה לאחר 30 דקות ללא קבלת בקשות. זה יתעורר כשתתקבל בקשה. זה קורה כל כך מהר, שאפילו לא תשים לב (אלא אם כן, כמובן, חיבור מסד הנתונים לא יופעל מחדש). התוכנית החינמית מוגבלת על ידי מסד נתונים של 5MB, שטח דיסק של 100MB, נתונים של 2TB בחודש ו-dyno אחד. Dyno הוא האפליקציה הפועלת שלך. אני אגיד מיד שהפריסה היא שגרמה לי לקשיים, שכן מעולם לא פרסתי את האפליקציות שלי לפני כן. במהלך הפריסה, Heroku דורש קובץ בשם Procfile (ללא סיומת). אנחנו יוצרים את זה בשורש הפרויקט. בפנים, אנו כותבים worker: sh target/bin/workerBot, כאשר workerBot הוא השם שצוין ב pom.xml. סקריפט sh , שנוצר על ידי תוסף Maven Application Assembler (appassembler-maven-plugin), יופעל. הסקריפט מתאר כיצד להפעיל קובץ 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
ראשית, אנו הולכים לספריית הפרויקט שלנו ומאתחלים את המאגר עם הפקודה git init. לאחר מכן אנו מוסיפים את הפרויקט שלנו למאגר הזה.
git add .
אז אנחנו מתחייבים לשינויים
git commit -m "First commit in the project"
לאחר מכן, עליך להיכנס ל-heroku. כתוב את הדברים הבאים בשורת הפקודה
heroku login
הזן את האישורים שיצרת במהלך הרישום. לאחר מכן, קבע את כתובת האתר של המאגר שלך ב-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