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). Và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 :- 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ựa trên nhánh chính, chúng tôi tạo:
- Thêm bot.
- 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.
- 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.
- Đó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.
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 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 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 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 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ự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.
- bot.tên người dùng ;
- bot.token .
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: Từ 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: Chúng tôi nhấp vào bắt đầu và ngay lập tức nhận được câu trả lời: Hãy viết thêm một số thứ nhảm nhí để kiểm tra: Và 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: Hã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 : Chuyể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ó: Như 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:
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ớ: Phiê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.
GO TO FULL VERSION