JavaRush /Blog Java /Random-VI /Thêm bot telegram vào dự án - "Dự án Java từ A đến Z"
Roman Beekeeper
Mức độ

Thêm bot telegram vào dự án - "Dự án Java từ A đến Z"

Xuất bản trong nhóm
Xin chào các bạn thân mến của tôi. Vâng, vâng, chính xác là bạn bè. Tôi đã quá quen thuộc với loạt bài này đến nỗi những người thường xuyên viết lời tri ân trong phần bình luận và/hoặc thể hiện rằng họ đã đọc và hiểu tài liệu đã trở nên thân thiết. Bạn và tôi đang đi từ hai hướng hướng tới cùng một mục tiêu. Bạn muốn hiểu, nhưng tôi muốn giải thích. Và chúng ta có cùng một mục tiêu cuối cùng - một ứng dụng bằng văn bản mà bạn có thể hiểu được từ đầu đến cuối. Bạn có thể đã nghe nói về phần lớn những gì tôi sẽ mô tả trong bài viết này. Tôi không nghĩ rằng tôi sẽ kể cho bạn bất cứ điều gì mới và bất thường (nhưng trong khuôn khổ dự án cần phải biết/lặp lại điều này). "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 1Vào mùa xuân, tôi đã viết một bot cho chính mình, vì vậy chúng tôi sẽ dựa vào “mẫu” của nó.

Chúng tôi viết JRTB-2

Chúng ta sẽ làm tương tự như trong bài viết với task JRTB-0 :
  1. Chúng tôi cập nhật nhánh chính trong dự án cục bộ bằng cách sử dụng kết hợp ctrl + t ."Dự án Java từ A đến Z": thêm bot telegram vào dự án - 2
  2. Dựa trên nhánh chính, chúng tôi tạo:"Dự án Java từ A đến Z": thêm bot telegram vào dự án - 3
  3. Thêm bot.
  4. Chúng tôi tạo một cam kết mới với mô tả về những gì đã được thực hiện và đẩy nó lên GitHub.
  5. Tạo yêu cầu kéo cho nhánh chính và kiểm tra lại. Chúng tôi đang chờ quá trình xây dựng hoàn tất (hành động của github), hợp nhất nó vào nhánh chính.
  6. Đóng tác vụ tương ứng.

Bot điện tín là gì

Chúng tôi, những nhà phát triển, có thể tưởng tượng làm việc với bot điện tín như thế này: chúng tôi sử dụng ứng dụng khách của họ để làm việc với họ. Chúng tôi có một thư viện làm sẵn cho công việc. Có một tập hợp các hành động mà sau đó bot điện tín sẽ biết rằng nó được liên kết với chương trình của chúng tôi. Và trong chương trình, chúng ta sẽ học cách nhận thư, lệnh và bằng cách nào đó xử lý chúng. Có một thứ giống như một lệnh trong bot điện tín : nó bắt đầu bằng dấu gạch chéo “/”. Sau đó, chúng ta cùng nhau viết từ đó ngay lập tức và đây sẽ được coi là một mệnh lệnh. Ví dụ: có hai lệnh mà mọi người nên biết:
  • /start — bắt đầu làm việc với bot;
  • /stop - kết thúc công việc với bot.
Chúng tôi sẽ tự làm phần còn lại. Hãy để tôi đặt chỗ ngay: chúng tôi sẽ làm chính xác những gì và theo cách mà tôi đã học được. Và khi làm việc với bot, tôi chắc chắn rằng sẽ có thể làm tốt hơn. Và nếu ai đó muốn làm điều này, tôi sẽ rất vui và sẽ hỗ trợ nỗ lực này bằng mọi cách có thể. Nhân tiện, điều đầu tiên sẽ rất thú vị là nếu ai đó giải thích cho tôi cách lập trình mô tả lệnh thông qua mã chứ không phải thông qua cài đặt bot trong điện tín. Tôi đã không học được điều này. Chúng tôi có một số bài viết trên tài nguyên của mình mô tả cách tạo một bot cơ bản: hôm nay chúng tôi sẽ làm điều gì đó tương tự. Nếu bạn có thêm bất kỳ câu hỏi nào, tôi khuyên bạn nên lướt qua bài viết này .

Tạo bot với BotFather

Để kết nối bot, trước tiên bạn cần tạo nó. Telegram có một cách tiếp cận - tạo ra một bot có tên riêng. Nó cũng sẽ đi kèm với một mã thông báo (một chuỗi lớn hoạt động giống như mật khẩu). Tôi đã tạo bot cho JavaRush - @javarush_community_bot . Bot này vẫn trống và không thể làm gì cả. Điều quan trọng là phải có _bot ở cuối tên . Để chỉ ra cách thực hiện điều này, tôi sẽ tạo một bot để chúng tôi kiểm tra chức năng của mình. Đối với các dự án thực tế, đây sẽ là một môi trường thử nghiệm. Và môi trường chính của chúng ta sẽ là môi trường sản xuất (prod - production, tức là môi trường thực tế mà dự án sẽ được thực thi trên đó). Tất nhiên, có thể thêm một môi trường khác - môi trường hộp cát: một hộp cát chung, dễ thay đổi hơn và dễ tiếp cận hơn đối với tất cả những người tham gia phát triển. Nhưng điều này sẽ chỉ làm phức tạp thêm tình hình ở giai đoạn tạo dự án. Hiện tại, hãy tạo thêm hai bot nữa để thử nghiệm và cho môi trường sandbox. Bước đầu tiên là tạo (đăng ký) bot trong Telegram. Chúng ta cần tìm bot: @BotFather và viết lệnh cho nó: /newbot"Dự án Java từ A đến Z": thêm bot telegram vào dự án - 4 Tiếp theo, chúng ta được yêu cầu đặt tên cho bot này. Vì đây là bot dành cho các tác vụ thử nghiệm nên tên của nó sẽ phù hợp: [TEST] JavarushBot"Dự án Java từ A đến Z": thêm bot telegram vào dự án - 5 Bây giờ đã đến lúc đặt một tên duy nhất để luôn có thể tìm thấy nó - tên người dùng của nó: test_javarush_community"Dự án Java từ A đến Z": thêm bot telegram vào dự án - 6 Như tôi đã nói ở trên, bạn cần thêm _bot hậu tố cho tên người dùng, vì vậy chúng tôi viết lại: test_javarush_community_bot"Dự án Java từ A đến Z": thêm bot telegram vào dự án - 7 Và thế là xong! Bot đã được tạo. Bây giờ, bằng cách sử dụng tên người dùng và mã thông báo, nó có thể được kết nối với dự án của chúng tôi. Tất nhiên, để máy chủ thử nghiệm hoạt động trơn tru, tôi sẽ không hiển thị token (thực chất là mật khẩu để truy cập bot) của bot này cho công chúng xem.

Chúng tôi kết nối bot với dự án

Chúng tôi sẽ không bao gồm thư viện như thường lệ mà sẽ ngay lập tức tận dụng bộ xương của chúng tôi - SpringBoot. Anh ấy có một thứ như Starter. Bằng cách bao gồm thư viện, chúng tôi có thể sử dụng nó để cho SpringBoot biết rằng chúng tôi muốn định cấu hình dự án một cách chính xác. Nếu chúng ta đi theo con đường thông thường, được mô tả ở nhiều nơi, chúng ta sẽ cần tạo một cấu hình ở đâu đó có nội dung như thế này:
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
  telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
  e.printStackTrace();
}
Ở đây một đối tượng được tạo để bạn có thể thiết lập kết nối với bot. Trong trường hợp của chúng tôi, bộ khởi động mà chúng tôi muốn kết nối sẽ làm mọi thứ cho chúng tôi ở đâu đó “dưới mui xe” (đây cũng là bản dịch của một cụm từ thường được sử dụng trong CNTT - dưới mui xe). Đây là một liên kết đến phần khởi đầu này . Bạn có thể thấy ngay từ tệp README.md nó là gì, tại sao và cách sử dụng nó. Để kết nối nó, bạn chỉ cần thêm phần phụ thuộc này vào bộ nhớ. Chỉ vậy thôi :) Đây là phần phụ thuộc bắt buộc:
<dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-spring-boot-starter</artifactId>
        <version>5.0.1</version>
    </dependency>
Chúng tôi thêm nó vào bộ nhớ của chúng tôi. Chúng ta cài đặt phiên bản như mong đợi và cập nhật dự án Maven. "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 8Dựa trên mô tả, chúng ta chỉ cần tạo một lớp mới, kế thừa từ TelegramLongPollingBot và thêm lớp này vào Application Context của SpringBoot của chúng ta. Bối cảnh ứng dụng là nơi lưu trữ các đối tượng được tạo để chạy dự án. Để thêm một lớp, bạn cần sử dụng một trong các chú thích: @Component, @Service, @Repository, @Controller. Hoặc chú thích @Bean nếu được tạo thông qua một phương thức trong lớp cấu hình (nghĩa là trong lớp được đánh dấu bằng chú thích Cấu hình). Tôi hiểu rằng tất cả những điều này có vẻ vẫn chưa thể hiểu được. Nhưng khi bạn bắt đầu tìm hiểu, bạn sẽ thấy rằng không có gì phức tạp ở đó cả. Để hiểu nhanh về Spring Boot, tôi giới thiệu một cuốn sách hay - Spring In Action phiên bản thứ 5. Nếu có mong muốn, tôi có thể viết một loạt bài dựa trên cuốn sách này. Hãy quay trở lại. Trong gói chứa JavarushTelegramBotApplication, chúng tôi tạo gói bot , gói này sẽ chứa bot telegram của chúng tôi. Tên của nó sẽ là JavaRushTelegramBot :
package com.github.javarushcommunity.jrtb.bot;

import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Telegrambot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {

   @Override
   public void onUpdateReceived(Update update) {

   }

   @Override
   public String getBotUsername() {
       return null;
   }

   @Override
   public String getBotToken() {
       return null;
   }
}
Lớp này trừu tượng và có ba phương thức phải được triển khai. Hãy nói về chúng chi tiết hơn:
  • onUpdateReceured(Cập nhật cập nhật) - đây là điểm vào nơi tin nhắn từ người dùng sẽ đến. Tất cả logic mới sẽ đến từ đây;
  • getBotUsername() - ở đây bạn cần thêm tên người dùng của bot mà chúng tôi sẽ kết nối;
  • getBotToken() - và theo đó, đây là mã thông báo bot.
Về cơ bản, nó giống như thông tin đăng nhập và mật khẩu cho một trang web. Hiện tại chúng tôi sẽ không viết rõ ràng giá trị này. Điều này được gọi là "mã hóa cứng" (nghĩa là ràng buộc một số giá trị cụ thể - như thường lệ, truy tìm giấy từ mã cứng tiếng Anh). Bạn không nên làm điều đó. Chúng ta sẽ đi theo một cách khác - chúng ta sẽ ghi dữ liệu này vào lớp application.properties và đọc nó từ đây. Tại sao điều này là cần thiết? Sau đó, để khi ứng dụng khởi động, chúng ta có thể đặt các giá trị này ở bên ngoài. Nó linh hoạt, đúng vậy. Đi tới tệp src/main/resources/application.properties. Ở đó chúng ta sẽ nghĩ ra tên cho các biến này. Các tệp có phần mở rộng .properties được đọc dưới dạng cấu trúc khóa-giá trị được phân tách bằng “=”, mỗi cặp là một dòng riêng biệt. Vì vậy, tôi đã nghĩ ra các biến này:
  • bot.tên người dùng ;
  • bot.token .
Nó sẽ trông như thế này: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 9SpringBoot có một chú thích tuyệt vời - @Value. Nếu sử dụng đúng cách, nó sẽ kéo các giá trị từ tệp application.properties lên. Chúng tôi cập nhật dự án với điều này:
package com.github.javarushcommunity.jrtb.bot;

import org.springframework.beans.factory.annotation.Value;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;

/**
* Telegram bot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {

   @Value("${bot.username}")
   private String username;

   @Value("${bot.token}")
   private String token;

   @Override
   public void onUpdateReceived(Update update) {

   }

   @Override
   public String getBotUsername() {
       return username;
   }

   @Override
   public String getBotToken() {
       return token;
   }
}
Có thể thấy chúng ta đã chuyển giá trị của biến vào chú thích. Và khi SpringBoot tạo đối tượng bot của chúng ta thì các giá trị sẽ được lấy từ các thuộc tính (một lần nữa, giấy tra cứu từ tiếng Anh - Properties). Chúng ta gần đến rồi. Bạn cần làm cho bot trả lời điều gì đó. Vì vậy, hãy cập nhật phương thức onUpdateReceured . Chúng ta cần lấy lại tin nhắn đã gửi đến bot và gửi lại. Bằng cách này, chúng ta sẽ biết rằng bot đang hoạt động. Để làm điều này, chúng tôi sẽ viết đại khái và nhanh chóng những gì cần thiết:
@Override
public void onUpdateReceived(Update update) {
   if(update.hasMessage() && update.getMessage().hasText()) {
       String message = update.getMessage().getText().trim();
       String chatId = update.getMessage().getChatId().toString();

       SendMessage sm = new SendMessage();
       sm.setChatId(chatId);
       sm.setText(message);

       try {
           execute(sm);
       } catch (TelegramApiException e) {
           //todo add logging to the project.
           e.printStackTrace();
       }
   }
}
Mọi thứ ở đây cực kỳ đơn giản: chúng tôi kiểm tra xem tin nhắn có thực sự tồn tại hay không, vì vậy chúng tôi trích xuất chính tin nhắn đó ( tin nhắn ) và ID trò chuyện ( chatId ) trong đó thư từ đang diễn ra. Tiếp theo, chúng tôi tạo một đối tượng để gửi tin nhắn SendMessage , chuyển chính tin nhắn đó và ID trò chuyện vào đó - tức là những gì cần gửi cho bot và ở đâu. Chúng tôi đã có đủ thứ này rồi. Tiếp theo, chúng tôi chạy phương thức chính trong lớp JavarushTelegramBotApplication và tìm kiếm bot của chúng tôi trong Telegram: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 10Từ nhật ký, chúng tôi thấy rằng bot đã khởi động. Vì vậy, đã đến lúc truy cập Telegram và viết thư cho bot: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 11Chúng tôi nhấp vào bắt đầu và ngay lập tức nhận được câu trả lời: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 12Hãy viết thêm một số thứ nhảm nhí để kiểm tra: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 13Và thế là xong, tại thời điểm này, chúng tôi có thể nói rằng nhiệm vụ JRTB-2 của chúng tôi đã hoàn thành . Bạn thực sự chưa thể viết bất kỳ bài kiểm tra nào ở đây, vì vậy chúng tôi sẽ giữ nguyên mọi thứ. Tiếp theo, bạn cần tạo một cam kết mới: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 14Hãy chú ý đến tên của cam kết: một lần nữa tôi lưu ý bạn về điều này. Đầu tiên, một cam kết chứa tên của nhiệm vụ và sau đó là mô tả chi tiết hơn về những gì đã được thực hiện. Nhấp vào Cam kết và đẩy... và xác nhận bằng cách nhấp lại vào Đẩy : "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 15Chuyển đến dự án của chúng tôi . Như trước đây, GitHub đã thấy chi nhánh mới và đề nghị tạo yêu cầu kéo cho main. Chúng tôi không chống lại và tạo ra nó: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 16Như thường lệ, chúng tôi đã chọn một nhãn hiệu, một dự án và giao nó cho tôi. Cuối cùng, nhấp vào Tạo yêu cầu kéo. Chúng ta hãy đợi một chút trong khi quá trình xây dựng hoàn tất - và thế là xong, yêu cầu kéo đã sẵn sàng để hợp nhất:"Dự án Java từ A đến Z": thêm bot telegram vào dự án - 17

Phiên bản

Bằng cách nào đó tôi đã bỏ sót điểm mà chúng ta cần thực hiện việc lập phiên bản. Để làm điều này, chúng tôi sẽ thực hiện thêm một số thay đổi trong chi nhánh của mình. Chúng ta quay lại IDEA và xem phiên bản dự án trong bộ nhớ: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 18Phiên bản là 0.0.1-SNAPSHOT . Đây là phiên bản nhiệm vụ. Và chúng tôi sẽ bắt đầu bằng việc cập nhật phiên bản của dự án với từng vấn đề mới được giải quyết. Cho đến khi đạt MVP, phiên bản sẽ có hậu tố -SNAPSHOT. Sơ đồ phiên bản sẽ là gì? XYZ-SNAPSHOT Ở đâu:
  • X - bản cập nhật phiên bản chính, thường có vấn đề về khả năng tương thích ngược với phiên bản trước;
  • Y - không có thay đổi lớn lắm, hoàn toàn tương thích với phiên bản trước;
  • Z là bộ đếm các khiếm khuyết mà chúng tôi đã tìm thấy và sửa chữa.
Dựa vào đó, chúng ta sẽ có phiên bản đầu tiên - 0.1.0-SNAPSHOT - tức là chúng ta chưa có những bản cập nhật lớn, chỉ có một chút về mọi thứ và chưa đạt MVP nên có hậu tố -SNAPSHOT . Hãy thay đổi điều này trong bộ nhớ: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 19Đi tới tệp RELEASE_NOTES, nơi chúng tôi sẽ mô tả những thay đổi đối với dự án với mỗi phiên bản mới: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 20Mục nhập đầu tiên của chúng tôi. Bây giờ, với mỗi bản cập nhật phiên bản tiếp theo, chúng tôi sẽ mô tả chính xác điều gì đã xảy ra ở đây. Chúng tôi cam kết trường hợp này, viết mô tả: JRTB-2: phiên bản dự án được cập nhật và thêm vào RELEASE_NOTES Mọi thứ vẫn giống hệt như trước. Chúng tôi đang chờ quá trình xây dựng hoàn tất và chúng tôi có thể hợp nhất các thay đổi của mình. Chỉ ở đây nó sẽ khác một chút. Tôi muốn đảm bảo rằng mỗi tác vụ trong nhánh chính là một cam kết riêng biệt, vì vậy, việc chỉ đẩy yêu cầu kéo Hợp nhất sẽ không hiệu quả đối với chúng tôi. Git có tùy chọn git squat, tùy chọn này tập hợp tất cả các lần xác nhận thành một và hợp nhất chúng. Chúng tôi chọn tùy chọn này: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 21Nhấp vào Squash và Hợp nhất, và chúng tôi được đề nghị chỉnh sửa thông báo, cuối cùng sẽ là: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 22Rất tiện lợi và quan trọng nhất là những gì đang có nhu cầu. Nhân tiện, tôi chưa thấy tính năng như vậy trên bitbucket =/ Xác nhận việc hợp nhất. Điều duy nhất còn lại là thay đổi nhiệm vụ thành trạng thái Hoàn thành trong bảng của chúng tôi, viết nhận xét có liên kết đến yêu cầu kéo và đóng nó: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 23Bảng của chúng tôi bây giờ trông như thế này:"Dự án Java từ A đến Z": thêm bot telegram vào dự án - 24

Phần kết luận

Hôm nay chúng tôi đã từng bước tạo ra một bot telegram và triển khai nó trong dự án SpringBoot của mình. Bot hoạt động và đưa ra câu trả lời. Chúng tôi ngay lập tức truy cập vào dữ liệu bot thông qua các thuộc tính. Sắp tới: chúng tôi sẽ thực hiện một phần lớn - thực hiện JRTB-3 - thêm Mẫu lệnh cho dự án của chúng tôi. Ồ, còn một điều nữa... Tôi đã nói với bạn rằng tôi sẽ không xuất bản mã thông báo để nó không được sử dụng. Nhưng vì tôi viết bài này vào gần nửa đêm và sau giờ làm việc nên hóa ra tôi đã đăng một mã thông báo hợp lệ trong kho lưu trữ và GitGuardian đã nói với tôi về điều này trong một lá thư: "Dự án Java từ A đến Z": thêm bot telegram vào dự án - 25Cảm ơn họ vì điều này! Làm gì bây giờ? Sẽ không thể xóa nó khỏi git nữa, vì ngay cả khi tôi tải lên một cam kết mới mà không có mã thông báo này, nó vẫn sẽ vẫn ở cam kết cũ. Nhưng tôi không muốn xóa và khôi phục cam kết. Vì vậy, tôi đã vô hiệu hóa mã thông báo từ BotFather đã được đề cập. Bây giờ mã thông báo đã ở đó nhưng nó không còn hợp lệ nữa. Đăng ký tài khoản GitHub của tôi để xem tất cả mã trước khi xuất bản bài viết. Cảm ơn tất cả các bạn đã đọc, hẹn gặp lại.

Danh sách tất cả các tài liệu trong loạt bài này nằm ở đầu bài viết này.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION