CodeGym/Blog Java/Ngẫu nhiên/Tạo Bot Telegram bằng Java: từ ý tưởng đến triển khai

Tạo Bot Telegram bằng Java: từ ý tưởng đến triển khai

Xuất bản trong nhóm
Vậy bot là gì? Bạn có thể đọc thêm về điều này ở đây . Để bắt đầu, bạn cần xem lại tài liệu chính thức cho thư viện được sử dụng để phát triển bot Telegram (sau đây gọi là "API"). Nó có thể được tìm thấy ở đây .
Tạo Bot Telegram bằng Java: từ ý tưởng đến triển khai - 1
Mọi thứ ở đó đều rất dễ tiếp cận và rõ ràng. Có vẻ như chúng ta chỉ có thể viết mã và vui mừng! Nhưng nó không đơn giản như vậy. Sau khi dành nhiều thời gian tìm kiếm, tôi đã tìm thấy những mẩu kiến ​​thức về phát triển bot, chẳng hạn như cách tạo bàn phím, xử lý mộtCallbackQuery, và kể từ đó trở đi. Tuy nhiên, tôi không tìm thấy một hướng dẫn đầy đủ, toàn diện để phát triển bot Java. Điều đó thôi thúc tôi viết bài này. Có rất nhiều trang web nơi bạn có thể tạo bot có thể triển khai dễ dàng của riêng mình. Nhưng thực tế là, hầu hết các bot được tạo ra đều cung cấp thông tin tham khảo và những thứ tương tự. Bot của chúng tôi là một ứng dụng web chính thức. Bạn có thể liên kết cơ sở dữ liệu, thực hiện các yêu cầu API khác nhau, phân tích cú pháp trang web, thực hiện các phép tính phức tạp, v.v. Các khả năng chỉ bị giới hạn bởi trí tưởng tượng của bạn. Tôi hy vọng rằng những điều trên đã giúp làm sáng tỏ những gì tôi sắp viết. Rất dễ dàng để đăng ký bot trên Telegram. Quá trình này được mô tả chi tiết trong tài liệu được liên kết ở trên. Đối với ứng dụng của chúng tôi, bạn chỉ cần biết tên của bot và mã thông báo bạn nhận được khi đăng ký bot. Về cơ bản, bot chỉ là một ứng dụng web dựa trên bảng điều khiển. Không có giao diện người dùng, chỉ xử lý lệnh thuần túy. Nếu bạn muốn làm chủNgủ đông hoặc tìm hiểu cách phân tích cú pháp JSON , thì đây là dự án dành cho bạn. Hãy bắt đầu bằng cách thêm một phụ thuộc vào pom.xml(Tôi cho rằng bạn đang sử dụng Maven). Bạn có thể làm điều đó như thế này:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Sau đó, tạo một Botlớp kế thừa lớp đó TelegramLongPollingBotvà ghi đè các phương thức của nó:
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";
    }
}
Và bây giờ là nội dung của mainphương thức:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
Sau khi điền vào các phương thức getBotUsername()getBotToken(), hãy khởi động bot. Hiện tại, nó chỉ chuyển hướng tới chúng tôi bất kỳ thư nào chúng tôi gửi tới nó, giống như một " tấm gương ". Nó hoạt động như thế này: khi bạn khởi động ứng dụng, nó sẽ bắt đầu gửi yêu cầu đến máy chủ Telegram, cứ sau n giây một lần, tại URL sau: https://api.telegram.org/BotToken/getMe , trong đó BotToken là mã thông báo bot của bạn . Đáp lại, nó nhận được JSON chứa tất cả các tin nhắn. Mỗi thông báo này được xử lý bởi thư viện và được chuyển đến OnUpdateReceived(Update update)phương thức dưới dạngUpdatesự vật. Và đó là những gì chúng tôi làm việc với. Đây là điểm hay của các bot Telegram: chúng có thể chạy trên bất kỳ máy tính nào, việc kiểm tra nó chỉ cần khởi động ứng dụng và bạn không cần triển khai nó lên máy chủ sau mỗi lần thay đổi. Điều này rất thuận tiện. Tất nhiên, bạn có thể định cấu hình bot để hoạt động bằng cách sử dụng webhook. Bạn có thể tìm hướng dẫn cho điều đó trên Internet. Để đơn giản, chúng tôi sẽ sử dụng LongPolling. Cách các tin nhắn được xử lý và những gì bạn gửi để phản hồi chỉ bị giới hạn bởi khả năng của ngôn ngữ và thư viện. Mọi thứ khác là tùy thuộc vào bạn. Bạn có thể tạo một bot sẽ tìm kiếm video YouTube cho bạn. Bạn có thể tạo một bot sẽ gửi cho bạn những gì bạn gửi cho chính mình hàng ngày, chẳng hạn như viên nang thời gian từ một năm trước. Hoặc bạn có thể học cách tích hợp với các hệ thống CRM và tạo bot cho các doanh nghiệp nhỏ—bạn chỉ bị giới hạn bởi trí tưởng tượng của mình. Tiếp tục. Những người đã sử dụng bot biết rằng thật thuận tiện khi tương tác với chúng bằng cách sử dụng các lệnh bắt đầu bằng /ký tự " ", chẳng hạn như /start. Nhưng có một cách thuận tiện hơn: các nút. Có hai loại nút: những nút xuất hiện dưới trường nhập liệu ( ReplyKeyboardMarkup) và các nút nằm ngay bên dưới thư mà chúng được liên kết với (InlineKeyboardMarkup). Bạn có thể hiểu cơ bản về chúng từ các mô tả của chúng trong tài liệu.

Trả lờiKeyboardMarkup

Trong thực tế, đây là một mảng các mảng nút: List<KeyboardRow <KeyboardButton>>. Đây là mã mẫu tạo bàn phím:
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);
    }
Chúng tôi gọi phương thức này trong sendMsg()phương thức, sau khi truyền cho nó một thông báo. Đây là cách chúng tôi thiết lập bàn phím cho tin nhắn đó. Khi chúng tôi gửi tin nhắn này cho người dùng, anh ta sẽ thấy nội dung tin nhắn của chúng tôi và 2 nút có nội dung "Xin chào""Trợ giúp" , nút này nằm dưới nút kia. Khi một trong các nút này được nhấp, bot sẽ gửi một tin nhắn có chứa văn bản nút. Vì vậy, nếu khách hàng nhấp vào "Trợ giúp" , bot sẽ nhận được thông báo có nội dung "Trợ giúp". Đối với bot, có vẻ như chính khách hàng đã viết "Trợ giúp" và gửi văn bản đến bot. Và sau đó bạn xử lý các tin nhắn.

Đánh Dấu Bàn Phím Nội Tuyến

Đây cũng là một mảng của mảng. Nó tương tự như Markup trước đó, nhưng logic ở đây hoạt động hơi khác một chút. Loại bàn phím này được đính kèm với một tin nhắn cụ thể và chỉ tồn tại cho nó. Đây là một phương pháp để thiết lập bàn phím nội tuyến:
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);
    }
Tạo một Listbên trong Listvà thêm nút nội tuyến vào hàng đầu tiên. Nút này có thể chứa một URL, một liên kết đến một kênh hoặc một CallbackQuery, mà tôi sẽ viết sau một chút. Đây là nơi chúng tôi đặt văn bản của nút, là nội dung mà người dùng sẽ thấy, sau đó chúng tôi đặt dữ liệu sẽ được gửi đến bot. Trong ví dụ của chúng tôi, người dùng nhìn thấy "Xin chào" và khi nhấn nút, số 17 sẽ được gửi đến bot. Đây là của chúng tôi CallbackQuery. Một vài từ liên quan đến CallbackQuery. Để lấy dữ liệu này từ Updateđối tượng, bạn cần thực thi update.getCallbackQuery(). Phương thức này trả về một CallbackQuery, từ đó bạn có thể truy cập dữ liệu được truyền cho bot. Đừng cố lấy dữ liệu này thông qua update.getMessage().getText()phương pháp—bạn sẽ nhận được tệp 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());
        }
    }
Nếu có một tin nhắn, chúng tôi sẽ gửi nó đến một chủ đề mới để xử lý; nếu có CallbackQuery, chúng tôi sẽ gửi đến luồng thích hợp để xử lý. Bạn có thể gửi phản hồi tới tệp CallbackQuery. Mọi đối tượng trong Telegram đều có id riêng. Để gửi phản hồi đến một đối tượng cụ thể CallbackQuery, bạn chỉ cần biết id của nó, mà chúng tôi nhận được từ đối tượng tương ứng. Để gửi phản hồi, chúng tôi gọi phương thức này:
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();
        }
    }
QUAN TRỌNG:Nội dung phản hồi CallbackQuerykhông được dài hơn 200 ký tự! Sau khi gửi phản hồi như vậy, khách hàng sẽ thấy một cửa sổ bật lên chứa thông báo. Cửa sổ này có thể biến mất vài giây sau khi xuất hiện hoặc có thể tồn tại cho đến khi người dùng nhấn OK. Để chuyển chế độ, chúng ta gọi answer.setShowAlert(true)phương thức. Nếu bạn chuyển truesang phương thức, cửa sổ vẫn tồn tại cho đến khi nhấn OK. Nếu bạn vượt qua sai, thì nó sẽ biến mất sau 5 giây. Đây là tất cả các tính năng cơ bản của thư viện Telegram Bot . Nếu muốn, bạn có thể tìm hiểu những thứ như cách gửi đa phương tiện, định vị địa lý, v.v. Hãy chuyển sang triển khai bot của chúng ta lên một nền tảng lưu trữ. Đối với dự án của tôi, tôi đã chọn Heroku. Tôi nghĩ đó là một nền tảng lưu trữ khá thuận tiện với CLI của riêng nó. Nó miễn phí, nhưng với gói này, bot của bạn sẽ ngủ đông sau 30 phút không nhận được yêu cầu nào. Nó sẽ thức dậy khi nhận được yêu cầu. Điều này xảy ra quá nhanh, thậm chí bạn sẽ không nhận thấy (tất nhiên trừ khi kết nối cơ sở dữ liệu không khởi động lại). Gói miễn phí bị giới hạn bởi cơ sở dữ liệu 5 MB, dung lượng ổ đĩa 100 MB, dữ liệu 2 TB mỗi tháng và 1 dyno. Một dyno là ứng dụng đang chạy của bạn. Tôi sẽ nói ngay rằng chính việc triển khai đã gây khó khăn cho tôi, vì tôi chưa bao giờ triển khai các ứng dụng của mình trước đây. Trong quá trình triển khai, Heroku yêu cầu tệp có tên Procfile (không có phần mở rộng). Chúng tôi tạo nó trong thư mục gốc của dự án. Bên trong, chúng tôi viết worker: sh target/bin/workerBot, trong đó workerBot là tên được chỉ định trong pom.xml. một shtập lệnh, được tạo bởi Plugin trình biên dịch ứng dụng Maven (appassembler-maven-plugin), sẽ khởi chạy. Tập lệnh mô tả cách khởi chạy tệp jar đã biên dịch. Tên của lớp sẽ khởi chạy được chỉ định giữa <mainClass></mainClass>, trong khi tên của tập lệnh được đặt giữa <name></name>trong 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>
Trước khi bắt đầu quá trình này, bạn nên đăng ký trên Heroku và cài đặt cả GitHeroku CLI . Nếu ứng dụng của bạn cần cơ sở dữ liệu, thì đừng quên thêm cơ sở dữ liệu cần thiết khi bạn tạo ứng dụng mới. Hơn nữa, bạn cần xác định máy chủ, tên người dùng, mật khẩu và cổng cho cơ sở dữ liệu của mình, sau đó chỉ ra chúng trong ứng dụng của bạn. Tiếp theo, trước khi triển khai, hãy xây dựng dự án của bạn bằng Maven .
mvn clean install
Đầu tiên, chúng tôi chuyển đến thư mục dự án của mình và khởi tạo kho lưu trữ bằng lệnh git init. Sau đó, chúng tôi thêm dự án của mình vào kho lưu trữ này.
git add .
Sau đó, chúng tôi cam kết các thay đổi
git commit -m "First commit in the project"
Tiếp theo, bạn cần đăng nhập vào heroku. Viết đoạn sau vào dòng lệnh
heroku login
Nhập thông tin đăng nhập bạn đã tạo trong quá trình đăng ký. Sau đó, xác định URL của kho lưu trữ của bạn trên heroku. Bạn làm điều này trong cài đặt. sau đó chúng tôi viết
git remote add heroku [url]
Kho lưu trữ heroku từ xa được thêm vào kho lưu trữ của bạn. Tiếp theo chúng tôi viết
git push heroku master
Sau đó, chúng tôi chờ đợi… nếu ứng dụng triển khai thành công, hãy thực hiện lệnh sau
heroku ps:scale worker=1
Và thế là xong, ứng dụng của bạn đã được thiết lập và chạy. Nếu không, hãy xem nhật ký cẩn thận. Rất có thể, một lỗi trong ứng dụng của bạn đã khiến nó bị lỗi. Cảm ơn bạn đã đọc một bài viết dài như vậy. Tôi hy vọng ai đó sẽ thấy nó hữu ích và nó sẽ giúp bạn tiết kiệm rất nhiều thời gian trong những lĩnh vực đã gây khó khăn cho tôi trong quá trình phát triển.
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào