JavaRush /จาวาบล็อก /Random-TH /การสร้างบอท Telegram ใน Java: จากแนวคิดสู่การใช้งาน
John Watson
ระดับ

การสร้างบอท Telegram ใน Java: จากแนวคิดสู่การใช้งาน

เผยแพร่ในกลุ่ม
บอทคืออะไรกันแน่? คุณสามารถอ่านรายละเอียดเกี่ยวกับเรื่องนี้ได้ที่นี่ ขั้นแรก คุณต้องอ่านเอกสารอย่างเป็นทางการสำหรับไลบรารีสำหรับการพัฒนาบอทบน Telegram (ต่อไปนี้จะเรียกว่า API) เธอนอนอยู่ที่ นี่ การสร้างบอท Telegram ใน Java: จากแนวคิดสู่การใช้งาน - 1ทุกสิ่งที่นั่นเข้าถึงได้และเข้าใจได้มาก ดูเหมือนว่าจะเขียนและชื่นชมยินดี! แต่มันไม่ง่ายขนาดนั้น หลังจากใช้เวลาส่วนใหญ่ในเสิร์ชเอ็นจิ้น ฉันพบเกร็ดความรู้เกี่ยวกับการพัฒนาบอท เช่น วิธีสร้างคีย์บอร์ด ประมวลผล CallbackQuery และอื่นๆ ฉันไม่เคยพบคำแนะนำที่สมบูรณ์และครอบคลุมสำหรับการพัฒนาบอทใน Java สิ่งนี้ทำให้ฉันต้องเขียนบทความนี้ มีเว็บไซต์มากมายบนอินเทอร์เน็ตที่คุณสามารถสร้างบอทของคุณเองด้วยการปรับใช้แบบสำเร็จรูป แต่ประเด็นก็คือ โดยส่วนใหญ่แล้ว บอทจะถูกสร้างขึ้นซึ่งสามารถให้ข้อมูลพื้นหลังและอื่นๆ ได้ บอทของเราเป็นเว็บแอปพลิเคชันเต็มรูปแบบที่คุณสามารถผูกฐานข้อมูล ส่งคำขอไปยัง API ต่างๆ แยกวิเคราะห์ไซต์ ทำการคำนวณที่ซับซ้อน ฯลฯ เรื่องนี้ถูกจำกัดด้วยจินตนาการของคุณเท่านั้น ฉันหวังว่าในบรรทัดเหล่านี้ฉันได้อธิบายให้คุณฟังเล็กน้อยเกี่ยวกับสิ่งที่ฉันจะเขียน การลงทะเบียนบอทใน Telegram นั้นง่ายมาก กระบวนการนี้อธิบายไว้โดยละเอียดในเอกสารประกอบที่ลิงก์ด้านบน สำหรับการสมัครของเรา คุณจะต้องทราบชื่อของบอทและโทเค็นที่คุณจะได้รับเมื่อลงทะเบียนเท่านั้น โดยพื้นฐานแล้ว บอทเป็นเพียงเว็บแอปพลิเคชันคอนโซล ไม่มีส่วนหน้า การประมวลผลคำสั่งล้วนๆ หากคุณต้องการเชี่ยวชาญ 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 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;
    }
}
เนื้อหาของวิธีการmain:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
getBotUsername()โดย การ ป้อนลงในวิธีการgetBotToken()เราจะเปิดบอท สำหรับตอนนี้ เขาเปลี่ยนเส้นทางมาหาเราเฉพาะข้อความใด ๆ ที่เราส่งถึงเขาเท่านั้น ซึ่งเป็น "กระจกเงา" ทุกอย่างทำงานดังนี้: เมื่อคุณเปิดแอปพลิเคชัน แอปพลิเคชันจะเริ่มส่งคำขอ GET ไปยังเซิร์ฟเวอร์ Telegram ทุกๆ n วินาทีที่ URL ต่อไปนี้: https://api.telegram.org/BotToken/getMe โดยที่ BotToken อยู่ โทเค็นของบอทของคุณ โดยรับในการตอบกลับ JSON ที่มีข้อความทั้งหมด แต่ละข้อความดังกล่าวได้รับการประมวลผลโดยไลบรารีและมาถึงวิธีการOnUpdateReceived(Update update)ในรูปแบบUpdateวัตถุ นั่นคือสิ่งที่เราร่วมงานด้วย นี่คือข้อดีของบอท Telegram ซึ่งสามารถทำงานบนคอมพิวเตอร์เครื่องใดก็ได้ สำหรับการทดสอบที่คุณเพียงแค่ต้องเปิดแอปพลิเคชัน คุณไม่จำเป็นต้องปรับใช้กับโฮสต์หลังจากการเปลี่ยนแปลงแต่ละครั้ง มันสะดวกสบายมาก แน่นอนว่าบอทสามารถกำหนดค่าให้ทำงานโดยใช้ webhook ได้ คู่มือนี้สามารถพบได้บนอินเทอร์เน็ต เพื่อความง่าย เราจะทำงานโดยใช้ LongPolling วิธีประมวลผลข้อความและสิ่งที่จะส่งตอบกลับนั้นถูกจำกัดโดยเครื่องมือภาษาและไลบรารีเท่านั้น ส่วนอย่างอื่นจะขึ้นอยู่กับดุลยพินิจของคุณ คุณสามารถสร้างบอทที่จะค้นหาวิดีโอบน YouTube ให้คุณได้ คุณสามารถสร้างบอทที่จะส่งสิ่งที่คุณส่งถึงตัวคุณเองทุกวัน เช่น แคปซูลเวลาประเภทหนึ่งภายในหนึ่งปี หรือคุณสามารถเรียนรู้วิธีบูรณาการเข้ากับระบบ CRM และสร้างบอทสำหรับธุรกิจขนาดเล็ก ทุกอย่างถูกจำกัดด้วยจินตนาการของคุณ ไปข้างหน้า. ผู้ที่เคยใช้บอทรู้ดีว่าการโต้ตอบกับบอทโดยใช้คำสั่งที่ขึ้นต้นด้วยเครื่องหมาย«/»เป็นต้น เป็นเรื่อง/startที่ สะดวก แต่มีวิธีที่สะดวกกว่าคือปุ่ม ปุ่มมีสองประเภท: ปุ่มที่ปรากฏใต้ช่องป้อนข้อมูลReplyKeyboardMarkupและปุ่มที่ปรากฏใต้ข้อความที่เชื่อมโยงInlineKeyboardMarkupอยู่ ในเอกสารประกอบ คุณสามารถทำความคุ้นเคยกับคำอธิบายโดยย่อได้ ตอบกลับKeyboardMarkup. 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 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);
    }
ใน method sendMsg()เราเรียกเมธอดนี้โดยการส่งข้อความไปให้เมธอด ดังนั้นการตั้งค่าคีย์บอร์ดสำหรับข้อความนั้น เมื่อเราส่งข้อความนี้ให้ผู้ใช้เขาจะเห็นข้อความที่เราตั้งไว้พร้อมปุ่ม 2 ปุ่มที่เขียนว่า Hello และ Help อยู่ข้างๆ กัน เมื่อคลิกที่ปุ่มเหล่านี้ ข้อความจะถูกส่งไปยังบอท ซึ่งเป็นข้อความที่เขียนอยู่บนปุ่ม นั่นคือหากลูกค้าคลิก "ช่วยเหลือ" บอทจะได้รับข้อความพร้อมข้อความ "ช่วยเหลือ" สำหรับเขา มันเหมือนกับว่าลูกค้าเองเขียนข้อความ “ช่วยเหลือ” และส่งไปให้เขา ถ้าอย่างนั้นคุณก็ประมวลผลข้อความดังกล่าว InlineKeyboardMarkup นี่เป็นอาร์เรย์ของอาร์เรย์เช่นกัน ซึ่งคล้ายกับมาร์กอัปก่อนหน้า แต่ตรรกะการทำงานที่นี่แตกต่างออกไปเล็กน้อย แป้นพิมพ์ดังกล่าวเชื่อมโยงกับข้อความเฉพาะและมีไว้เพื่อข้อความนั้นเท่านั้น ต่อไปนี้เป็นวิธีการติดตั้งแป้นพิมพ์แบบอินไลน์
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ในListเพิ่มปุ่ม Inline ไปที่บรรทัดแรก ปุ่มดังกล่าวอาจมี 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สามารถส่งคำตอบ แต่ละวัตถุใน 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();
        }
    }
สำคัญ:ข้อความในคำตอบCallbackQueryไม่ควรยาวเกิน 200 ตัวอักษร! เมื่อส่งการตอบกลับ ลูกค้าจะได้รับหน้าต่างป๊อปอัปสำหรับเขียนข้อความ หน้าต่างดังกล่าวอาจหายไปไม่กี่วินาทีหลังจากที่ปรากฏขึ้น หรืออาจค้างจนกว่าผู้ใช้จะกดตกลง หากต้องการเปลี่ยนโหมดเหล่านี้ เราเรียกไฟล์answer.setShowAlert(true). เมื่อtrueหน้าต่างค้างจนกว่าคุณจะกด OK เมื่อfalseหน้าต่างหายไปหลังจากผ่านไป 5 วินาที โดยหลักการแล้ว สิ่งเหล่านี้คือคุณสมบัติพื้นฐานทั้งหมดของไลบรารีบอท Telegram หากต้องการ คุณสามารถเรียนรู้สิ่งต่างๆ เช่น การส่งมัลติมีเดีย ตำแหน่งทางภูมิศาสตร์ ฯลฯ ได้จากเอกสารประกอบ มาดูการนำบอทของเราไปใช้งานบนโฮสติ้งกันดีกว่า สำหรับโปรเจ็กต์ของฉัน ฉันเลือก Heroku เพราะในความคิดของฉัน มันเป็นโฮสติ้งที่ค่อนข้างสะดวกซึ่งมี CLI ของตัวเอง ใช้งานได้ฟรี แต่ในอัตรานี้ บอทของคุณจะเข้าสู่โหมดไฮเบอร์เนตหลังจากผ่านไป 30 นาที หากไม่มีคำขอใดๆ เมื่อมีการส่งคำขอถึงเขา เขาก็ตื่นขึ้นมา สิ่งนี้เกิดขึ้นค่อนข้างเร็ว คุณจะไม่สังเกตเห็นด้วยซ้ำ (ยกเว้นในกรณีที่มีการเชื่อมต่อกับฐานข้อมูลอีกครั้ง) ขีดจำกัดของแผนฟรีคือฐานข้อมูล 5MB พื้นที่ดิสก์ 100MB ปริมาณการใช้งาน 2TB ต่อเดือน 1 dino Dino เป็นแอปพลิเคชั่นที่ทำงานอยู่ของคุณ ฉันจะบอกทันทีว่าขั้นตอนการปรับใช้นี่แหละที่ทำให้เกิดปัญหาสำหรับฉัน เนื่องจากฉันไม่เคยปรับใช้แอปพลิเคชันมาก่อน เมื่อปรับใช้ Heroku ต้องใช้ไฟล์ชื่อ Procfile (ไม่มีนามสกุล) worker: sh target/bin/workerBot เราสร้างมันขึ้นมาในรูทของโปรเจ็กต์ เขียน workerBotที่นั่น - ชื่อที่เราระบุในpom.xml สคริปต์ sh ที่สร้างขึ้นโดยใช้ปลั๊กอิน Maven 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 project”
ถัดไปคุณต้องเข้าสู่ระบบ heroku เขียนในบรรทัดคำสั่ง
heroku login
ป้อนข้อมูลของคุณที่ระบุระหว่างการลงทะเบียน จากนั้นคุณจะต้องค้นหา URL ของที่เก็บของคุณบน 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