CodeGym /จาวาบล็อก /สุ่ม /การสร้าง Telegram Bot ใน Java: ตั้งแต่แนวคิดไปจนถึงการปรั...
John Squirrels
ระดับ
San Francisco

การสร้าง Telegram Bot ใน Java: ตั้งแต่แนวคิดไปจนถึงการปรับใช้

เผยแพร่ในกลุ่ม
แล้วบอทคืออะไร? คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่นี่ ในการเริ่มต้น คุณต้องตรวจสอบเอกสารอย่างเป็นทางการสำหรับไลบรารีที่ใช้ในการพัฒนาบอท Telegram (ต่อไปนี้เรียกว่า "API") ได้ที่ นี่
การสร้าง Telegram Bot ใน Java: ตั้งแต่แนวคิดไปจนถึงการปรับใช้ - 1
ทุกอย่างสามารถเข้าถึงได้และชัดเจนมาก ดูเหมือนว่าเราจะสามารถเขียนโค้ดและชื่นชมยินดีได้! แต่มันไม่ง่ายอย่างนั้น หลังจากใช้เวลาค้นหาอยู่พักใหญ่ ผมก็พบเกร็ดความรู้เล็กๆ น้อยๆ เกี่ยวกับการพัฒนาบอท เช่น วิธีสร้างคีย์บอร์ด จัดการCallbackQueryและอื่น ๆ แต่ฉันไม่พบคำแนะนำที่สมบูรณ์และละเอียดถี่ถ้วนสำหรับการพัฒนาบอต Java นั่นทำให้ฉันเขียนบทความนี้ มีเว็บไซต์จำนวนมากที่คุณสามารถสร้างบอทที่ปรับใช้ได้ง่ายของคุณเอง แต่ความจริงก็คือ บอทส่วนใหญ่ที่สร้างขึ้นนั้นให้ข้อมูลอ้างอิงและสิ่งที่คล้ายกัน บอทของเราเป็นเว็บแอปพลิเคชันที่เต็มเปี่ยม คุณสามารถผูกฐานข้อมูล ดำเนินการคำขอ API ต่างๆ แยกวิเคราะห์เว็บไซต์ ทำการคำนวณที่ซับซ้อน และอื่นๆ อีกมากมาย ความเป็นไปได้ถูกจำกัดด้วยจินตนาการของคุณเท่านั้น ฉันหวังว่าข้อความข้างต้นจะช่วยอธิบายสิ่งที่ฉันกำลังจะเขียนให้ชัดเจนขึ้น การลงทะเบียนบอทบน Telegram นั้นง่ายมาก กระบวนการนี้มีรายละเอียดอธิบายไว้ในเอกสารประกอบที่เชื่อมโยงกับด้านบน สำหรับแอปพลิเคชันของเรา คุณจะต้องทราบชื่อบอทและโทเค็นที่คุณได้รับเมื่อลงทะเบียนบอทเท่านั้น โดยพื้นฐานแล้ว บอทเป็นเพียงเว็บแอปพลิเคชันบนคอนโซล ไม่มีส่วนหน้ามีเพียงการประมวลผลคำสั่งเท่านั้น หากคุณต้องการที่จะเชี่ยวชาญไฮเบอร์เนตหรือเรียนรู้วิธีแยกวิเคราะห์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 ต่อไปนี้: https://api.telegram.org/BotToken/getMeโดยที่ BotToken เป็นโทเค็นของบอทของคุณ . ในการตอบสนอง จะได้รับ JSON ที่มีข้อความทั้งหมด แต่ละข้อความเหล่านี้ได้รับการประมวลผลโดยไลบรารีและส่งผ่านไปยังOnUpdateReceived(Update update)เมธอดเป็น anUpdateวัตถุ. และนั่นคือสิ่งที่เราทำงานร่วมกัน ความสวยงามของบ็อต Telegram มีอยู่ในที่นี้: พวกมันสามารถทำงานบนคอมพิวเตอร์เครื่องใดก็ได้ การทดสอบนั้นเพียงแค่ต้องเริ่มแอปพลิเคชัน และคุณไม่จำเป็นต้องปรับใช้กับโฮสต์หลังจากการเปลี่ยนแปลงแต่ละครั้ง สะดวกมาก แน่นอน คุณสามารถกำหนดค่าบอทให้ทำงานโดยใช้เว็บฮุคได้ คุณสามารถค้นหาเส้นทางได้บนอินเทอร์เน็ต เพื่อความง่าย เราจะใช้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 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 ปุ่มที่เขียนว่า"สวัสดี"และ"ช่วยเหลือ" ซึ่ง อยู่ด้านล่างอีกปุ่มหนึ่ง เมื่อคลิกปุ่มใดปุ่มหนึ่ง บอทจะส่งข้อความที่มีข้อความของปุ่มนั้น ดังนั้น หากไคลเอ็นต์คลิก"Help"บอทจะได้รับข้อความ"Help" ดูเหมือนว่าลูกค้าจะเขียน"Help"และส่งข้อความถึงบอท เอง จากนั้นคุณประมวลผลข้อความ

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);
    }
สร้าง a ListภายในListและเพิ่มปุ่มอินไลน์ในแถวแรก ปุ่มนี้สามารถมี URL ลิงก์ไปยังช่อง หรือCallbackQueryซึ่งฉันจะเขียนถึงในภายหลัง นี่คือที่ที่เราตั้งค่าข้อความของปุ่ม ซึ่งเป็นสิ่งที่ผู้ใช้จะเห็น จากนั้นเราตั้งค่าข้อมูลที่จะส่งไปยังบอท ในตัวอย่างของเรา ผู้ใช้เห็น "สวัสดี" และเมื่อกดปุ่ม หมายเลข 17 จะถูกส่งไปยังบอท นี่คือของCallbackQueryเรา คำสองสามคำเกี่ยวกับCallbackQuery. ในการรับข้อมูลนี้จากUpdateวัตถุ คุณต้องดำเนินupdate.getCallbackQuery()การ เมธอดนี้ส่งคืน a 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();
        }
    }
สำคัญ:ข้อความในการตอบกลับCallbackQueryต้องมีความยาวไม่เกิน 200 ตัวอักษร! หลังจากส่งการตอบกลับดังกล่าว ลูกค้าจะเห็นหน้าต่างป๊อปอัปที่มีข้อความ หน้าต่างนี้อาจหายไปหลังจากปรากฏขึ้นไม่กี่วินาที หรืออาจคงอยู่จนกว่าผู้ใช้จะกดตกลง ในการสลับโหมด เราเรียกanswer.setShowAlert(true)เมธอด หากคุณผ่านtrueไปยังวิธีการ หน้าต่างจะคงอยู่จนกว่าจะกด OK หากคุณส่งเป็นเท็จ จะหายไปหลังจาก 5 วินาที ทั้งหมดนี้เป็นคุณลักษณะพื้นฐานของไลบรารี Telegram Bot หากต้องการ คุณสามารถเรียนรู้สิ่งต่างๆ เช่น วิธีส่งมัลติมีเดีย ตำแหน่งทางภูมิศาสตร์ ฯลฯ เรามาเริ่มปรับใช้บอทของเรากับแพลตฟอร์มโฮสติ้งกัน สำหรับโครงการของฉัน ฉันเลือกHeroku. ฉันคิดว่ามันเป็นแพลตฟอร์มโฮสติ้งที่ค่อนข้างสะดวกด้วย CLI ของตัวเอง ไม่มีค่าใช้จ่าย แต่ในแผนนี้ บอทของคุณจะจำศีลหลังจากไม่ได้รับคำขอเป็นเวลา 30 นาที มันจะตื่นขึ้นเมื่อได้รับการร้องขอ สิ่งนี้เกิดขึ้นเร็วมาก คุณจะไม่ทันสังเกตด้วยซ้ำ (แน่นอนว่าการเชื่อมต่อฐานข้อมูลจะไม่เริ่มใหม่) แผนฟรีจำกัดด้วยฐานข้อมูล 5MB พื้นที่ดิสก์ 100MB ข้อมูล 2TB ต่อเดือน และ 1 ไดโน dyno คือแอปพลิเคชันที่กำลังทำงานอยู่ของคุณ ฉันจะบอกทันทีว่าการติดตั้งใช้งานนั้นทำให้ฉันลำบาก เนื่องจากฉันไม่เคยติดตั้งแอปพลิเคชันของฉันมาก่อน ในระหว่างการปรับใช้ Heroku ต้องการไฟล์ชื่อ Procfile (ไม่มีนามสกุล) เราสร้างมันในรูทโปรเจ็กต์ ข้างใน เราเขียนworker: sh target/bin/workerBotว่า โดยที่workerBotเป็นชื่อที่ระบุpom.xmlใน อาย_สคริปต์ที่สร้างโดยMaven Application Assembler Plugin (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
ป้อนข้อมูลประจำตัวที่คุณสร้างขึ้นระหว่างการลงทะเบียน หลังจากนั้น กำหนด 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