JavaRush /Blog Java /Random-VI /Telegram bot là dự án đầu tiên và tầm quan trọng của nó đ...
Pavel Mironov (Miroha)
Mức độ
Москва

Telegram bot là dự án đầu tiên và tầm quan trọng của nó đối với sự phát triển nghề nghiệp dựa trên kinh nghiệm cá nhân

Xuất bản trong nhóm
Xin chào tất cả mọi người! Nói cho chúng tôi biết về bạn. Tôi 24 tuổi, tốt nghiệp đại học kỹ thuật năm ngoái và vẫn chưa có kinh nghiệm làm việc. Nhìn về phía trước, tôi muốn nói rằng ban đầu, trong kế hoạch đã đặt ra (được lập vào mùa thu năm 2019), tôi dự định đi làm vào tháng 3-tháng 4 năm 2020, nhưng không may, việc kiểm dịch đã can thiệp nên tôi đã hoãn lại mọi việc cho đến giữa năm. -mùa hè và trong tương lai tôi hy vọng sẽ viết nên câu chuyện thành công của riêng mình. Telegram bot như một dự án đầu tiên và tầm quan trọng của nó đối với sự phát triển nghề nghiệp dựa trên kinh nghiệm cá nhân - 1Tôi chưa bao giờ bị cuốn hút vào việc lập trình. Ở trường đại học, họ dạy đủ về lập trình, nhưng lúc đó tôi không hứng thú với nghề này. Ngoài ra còn có các ngôn ngữ thủ tục (C), khóa học kéo dài một năm về OOP (Java), cơ sở dữ liệu, thậm chí cả trình biên dịch mã và C++. Nhưng thành thật mà nói, nhìn chung tôi thờ ơ với việc học, vì hầu hết các môn học được dạy dường như vô dụng đối với tôi, chỉ phù hợp với mục đích báo cáo (về nguyên tắc là như vậy). Sau khi tốt nghiệp đại học, tôi phải đưa ra quyết định: Tôi không có được một số kỹ năng nhưng tôi cần phải làm việc. Tôi đã phải suy nghĩ về việc tự học (ồ, tôi đã bỏ lỡ ít nhất 2 năm chỉ vì ngồi im) và sự lựa chọn đương nhiên thuộc về Java, vì trong một khóa học OOP ở trường đại học, một trong những người đã giới thiệu khóa học javarush và anh ấy, như bạn biết đấy, chuyên tâm vào ngôn ngữ Java. Tôi quan tâm đến phần trình bày của khóa học. Đúng, lúc đó tôi không thích lập trình, vì khi gặp bất kỳ khó khăn nào tôi lập tức bỏ cuộc, và có quá đủ khó khăn trong việc lập trình. Nhưng đồng thời, tôi cũng cảm thấy muốn viết mã nên cuối cùng tôi quyết định dấn thân vào lập trình. Tôi sẽ kể ngắn gọn cho bạn về trải nghiệm của tôi với javarush. Tôi bắt đầu vào tháng 8 năm 2019, ngay lập tức mua đăng ký trong một tháng, nhưng ở cấp độ 7, tôi nhận ra rằng nhiệm vụ rất khó khăn. Tôi gác khóa học sang một bên và chọn Shildt. Thế là song song tôi đã hoàn thành khóa học trong 3 tháng. Tôi đạt đến cấp độ 20 (đây là tài khoản thứ hai của tôi), đọc gần như hoàn toàn Schildt, sau đó cảm thấy mệt mỏi với những nhiệm vụ ở đây, khiến tôi không còn thấy được những lợi ích thiết thực cho bản thân. Tôi truy cập codewars, leetcode và bắt đầu xem các khóa học video. Nhân tiện, trong 3 tháng, tôi đã chuyển từ "Ồ không, mảng là gì? Làm việc với nó như thế nào và tại sao nó lại đáng sợ như vậy"? đến nghiên cứu chi tiết về mã nguồn của các lớp sưu tập (ArrayList, HashMap, v.v.). Dựa trên kinh nghiệm cá nhân, tôi sẽ nói với những người mới bắt đầu: điều chính ở đây là vượt qua cảm giác nảy sinh nếu bạn không hiểu gì và không thể giải quyết được gì. Khi nó phát sinh, bạn chỉ muốn buông bỏ tất cả và dường như bạn quá ngu ngốc trong vấn đề này. Nếu bạn vượt qua được những khoảnh khắc như vậy trong bản thân và thư giãn tinh thần thì thành công sẽ đến. Tôi nghĩ nhiều người không thể đương đầu với điều này nên họ nhanh chóng từ bỏ những nỗ lực đó. Kết quả là vào tháng 12 năm 2019, tôi bắt đầu nghĩ về dự án của mình. Tôi quyết định chọn bot Telegram, nhưng không có ý kiến ​​gì. Đồng thời, một người bạn cần chức năng cho nhóm của anh ấy trong một bức điện tín mà anh ấy muốn tự động hóa. Anh ấy chỉ biết rằng tôi đang nghiên cứu chuyên sâu về lập trình và đề nghị cho tôi một dự án. Đối với tôi, vì kinh nghiệm và bản lý lịch trong tương lai, đối với anh ấy, vì sự phát triển của tập thể. Tôi thậm chí sẽ cho phép mình trích dẫn ý tưởng của anh ấy: "Недавно софтину хотел у программиста заказать, которая загружала бы в выбранное Облако файлы по прямым linkм. Это интересно, так How аналогов нет. И просто очень удобно. Суть: копируешь ссылку, вставляешь в окно и выбираешь нужное Облако (GDrive, Mail, Яндекс Диск и т.п), в своё время софт всё делает на стороне serverа и юзеру ничего не нужно загружать на свою машину (особенно круто, когда у тебя сборка на SSD-накопителях). Думали сделать в web-интерфейсе, чтобы можно было запускать How с телефонов, так и с десктопа... Можно в принципе через приложение реализовать, а не через web-интерфейс. Тебе такое по силам?"Tôi bắt đầu làm việc, nhưng cuối cùng, sau vài ngày, tôi nhận ra rằng chẳng có kết quả gì với chúng tôi, phần lớn là do thiếu kiến ​​thức. Một người bạn cũng cần những liên kết tương tự này tới Cloud.Mail, nhưng chúng vẫn không có' t có API. Đã có nỗ lực kết hợp thứ gì đó thông qua GDrive, nhưng việc triển khai không thành công, cộng thêm dịch vụ đám mây này không phù hợp với “khách hàng”. Mặc dù ban đầu anh ấy đưa ra một số đám mây để lựa chọn nhưng cuối cùng anh ấy đã từ chối mọi thứ ngoại trừ thư .ru, không tìm thấy giải pháp nào. Bằng cách nào đó, tất cả đều trở nên tốn kém, cần phải kết nối cơ sở dữ liệu, sử dụng máy chủ để lưu trữ, v.v. Nhân tiện, nó vẫn cần ứng dụng web này. Vì mọi thứ không như vậy' Để giải quyết vấn đề cho chúng tôi, tôi quyết định tạo một bot thông tin. Nó có nhiệm vụ nhận các liên kết đến trò chơi từ cửa hàng Google Play, phân tích liên kết và lưu thông tin nhận được vào thư viện, sau đó ghi nó vào tệp json. Như vậy, với mỗi yêu cầu, thư viện có thể mở rộng nhờ vào nỗ lực của người dùng, trong tương lai, bạn không thể lấy thông tin về trò chơi một cách thuận tiện bằng cách truy cập Google Play. Bạn chỉ cần viết lệnh /libraryHere_game_name và nhận mọi thứ bạn cần. Nhưng có một số khó khăn tôi sẽ kể cho bạn sau. Lúc đầu, tôi tiến bộ chậm vì tôi bắt đầu tham gia hai khóa học SQL cùng một lúc. Đơn giản là tôi không thể hiểu được cách thức hoạt động của bot cũng như cách xử lý các yêu cầu. Tôi đã gặp một người bạn cũng quan tâm đến việc thực hiện dự án. Phiên bản đầu tiên của bot đã sẵn sàng trong khoảng một tháng, nhưng đã nảy sinh những bất đồng với một người bạn (về phía tôi). Tôi đảm nhận phần bot chịu trách nhiệm phân tích cú pháp và anh ấy trực tiếp xử lý các yêu cầu gửi đến bot và quá trình xử lý chúng. Vì lý do nào đó, anh ấy bắt đầu phức tạp hóa bot, giới thiệu một số loại ủy quyền, phát minh ra quản trị viên, thêm chức năng không cần thiết, cộng thêm tôi không thực sự thích phong cách viết mã của anh ấy. Theo tôi, điều này là không cần thiết đối với một bot thông tin. Vì vậy, tôi quyết định sẽ tự viết một bot từ đầu với chức năng tôi cần. Bây giờ tôi sẽ cho bạn biết bot thực sự làm gì (sử dụng ví dụ từ mã dự án). Tôi sẽ đính kèm mã đầy đủ của dự án ở cuối bài viết và rất tiếc là tôi sẽ không thể bình luận đầy đủ về nó. Bất kỳ tin nhắn nào của người dùng được gửi tới bot đều là đối tượng của lớp Cập nhật. Nó chứa rất nhiều thông tin (id tin nhắn, id trò chuyện, id người dùng duy nhất, v.v.). Có một số loại cập nhật: có thể là tin nhắn văn bản, có thể là phản hồi từ bàn phím điện tín (gọi lại), ảnh, âm thanh, v.v. Để ngăn người dùng làm phiền quá nhiều, tôi chỉ xử lý các yêu cầu văn bản và cuộc gọi lại từ bàn phím. Nếu người dùng gửi một bức ảnh, bot sẽ thông báo rằng anh ta không có ý định làm bất cứ điều gì với nó. Trong lớp bot chính, trong phương thức onUpdateReceived, bot nhận được bản cập nhật.
@Override
    public void onUpdateReceived(Update update) {
        UpdatesReceiver.handleUpdates(update);
    }
mà tôi chuyển cho trình xử lý (lớp UpdatesReceiver của riêng):
public static void handleUpdates(Update update) {
        ...
        if (update.hasMessage() && update.getMessage().hasText()){
            log.info("[Update (id {}) типа \"Текстовое сообщение\"]", update.getUpdateId());
            new TextMessageHandler(update, replyGenerator).handleTextMessage();
        }
        else if (update.hasCallbackQuery()) {
            //логгирование
            new CallbackQueryHandler(update, replyGenerator).handleCallBackQuery();
        }
        else {
           //логгирование
            replyGenerator.sendTextMessage(update.getMessage().getChatId(), "Я могу принимать только текстовые messages!");
        }
    }
UpdatesReceiver là một trình xử lý trung tâm, tùy thuộc vào loại cập nhật, sẽ chuyển quyền kiểm soát sang một trình xử lý chuyên dụng khác: TextMessageHandler hoặc CallbackQueryHandler, mà tôi sẽ chuyển bản cập nhật tiếp theo trong chuỗi cho các hàm tạo của nó. Cập nhật là điều quan trọng nhất khi làm việc với bot và không nên bị mất, bởi vì với sự trợ giúp của thông tin được lưu trữ trong bản cập nhật, chúng tôi sẽ tìm ra phản hồi sẽ được gửi cho người dùng và cuộc trò chuyện nào. Để tạo phản hồi cho người dùng, tôi đã viết một lớp riêng. Nó có thể gửi tin nhắn văn bản thông thường, tin nhắn bằng bàn phím nội tuyến, tin nhắn có hình ảnh và tin nhắn bằng bàn phím trả lời. Bàn phím nội tuyến trông như thế này: Telegram bot như một dự án đầu tiên và tầm quan trọng của nó đối với sự phát triển nghề nghiệp dựa trên kinh nghiệm cá nhân - 1Nó xác định các nút mà khi nhấp vào chúng, người dùng sẽ gửi lệnh gọi lại đến máy chủ. Lệnh này có thể được xử lý gần giống như cách xử lý tin nhắn thông thường. Để “duy trì” nó, bạn cần có người xử lý riêng. Chúng tôi đặt hành động cho từng nút, sau đó hành động này được ghi vào đối tượng Cập nhật. Những thứ kia. đối với nút "Chi phí", chúng tôi đặt mô tả "/giá" cho lệnh gọi lại mà sau này chúng tôi có thể nhận được từ bản cập nhật. Tiếp theo, trong một lớp riêng biệt, tôi có thể xử lý cuộc gọi lại này:
public void handleCallBackQuery() {
  String call_data = update.getCallbackQuery().getData();
  long message_id = update.getCallbackQuery().getMessage().getMessageId();
  long chat_id = update.getCallbackQuery().getMessage().getChatId();
    switch (call_date){
      case "/price" :
        //тут что-то сделать
        break;
...
Bàn phím Trả lời trông như thế này: Telegram bot như một dự án đầu tiên và tầm quan trọng của nó đối với sự phát triển nghề nghiệp dựa trên kinh nghiệm cá nhân - 2Và về bản chất, nó thay thế thao tác gõ của người dùng. Nhấp vào nút "Thư viện" sẽ nhanh chóng gửi tin nhắn "Thư viện" tới bot. Đối với mỗi loại bàn phím, tôi viết lớp của riêng mình, triển khai mẫu Builder: inlinereply . Kết quả là, về cơ bản, bạn có thể “vẽ” bàn phím mong muốn tùy theo yêu cầu của mình. Điều này cực kỳ tiện lợi vì bàn phím có thể khác nhau nhưng nguyên tắc thì vẫn như cũ. Đây là một phương pháp trực quan để gửi tin nhắn bằng bàn phím nội tuyến:
public synchronized void sendInlineKeyboardMessage(long chat_id, String gameTitle) {
        SendMessage keyboard = InlineKeyboardMarkupBuilder.create(chat_id)
                .setText("Вы может узнать следующую информацию об игре " + gameTitle)
                .row()
                .button("Стоимость " + "\uD83D\uDCB0", "/price " + gameTitle)
                .button("Обновлено " + "\uD83D\uDDD3", "/updated " + gameTitle)
                .button("Версия " + "\uD83D\uDEE0", "/version " + gameTitle)
                .endRow()
                .row()
                .button("Требования " + "\uD83D\uDCF5", "/requirements " + gameTitle)
                .button("Покупки " + "\uD83D\uDED2", "/iap " + gameTitle)
                .button("Размер " + "\uD83D\uDD0E", "/size " + gameTitle)
                .endRow()
                .row()
                .button("Получить всю информацию об игре" + "\uD83D\uDD79", "/all " + gameTitle)
                .endRow()
                .row()
                .button("Скрыть клавиатуру", "close")
                .endRow()
                .build();
        try {
            execute(keyboard);
        } catch (TelegramApiException e) {
            log.error("[Не удалось отправить сообщение с -inline- клавиатурой]: {}", e.getMessage());
        }
    }
Để cung cấp cho bot chức năng nghiêm ngặt, các lệnh đặc biệt sử dụng ký tự gạch chéo đã được phát minh: /library, /help, /game, v.v. Nếu không, chúng tôi sẽ phải xử lý mọi rác mà người dùng có thể viết. Trên thực tế, đây chính là mục đích của MessageHandler:
if (message.equals(ChatCommands.START.getDescription())) {
     replyGenerator.sendTextMessage(chat_id, new StartMessageHandler().reply());
     replyGenerator.sendReplyKeyboardMessage(chat_id);
}
else if (message.equals(ChatCommands.HELP.getDescription())
             || message.equalsIgnoreCase("Помощь")) {
      replyGenerator.sendTextMessage(chat_id, new HelpMessageHandler().reply());
}
 ...
Do đó, tùy thuộc vào lệnh bạn gửi tới bot, một trình xử lý đặc biệt sẽ được đưa vào công việc. Chúng ta hãy đi xa hơn và xem xét công việc của trình phân tích cú pháp và thư viện. Nếu bạn gửi cho bot một liên kết tới một trò chơi trong cửa hàng Google Play, một trình xử lý đặc biệt sẽ tự động hoạt động . Đáp lại, người dùng sẽ nhận được thông tin về trò chơi theo dạng sau: Telegram bot như một dự án đầu tiên và tầm quan trọng của nó đối với sự phát triển nghề nghiệp dựa trên kinh nghiệm cá nhân - 3Đồng thời, một phương thức sẽ được gọi sẽ cố gắng thêm trò chơi vào thư viện của bot (đầu tiên là vào bản đồ cục bộ, sau đó vào -> tệp json ). Nếu trò chơi đã có trong thư viện thì quá trình kiểm tra sẽ được thực hiện (như trong bản đồ băm thông thường) và nếu dữ liệu trường (ví dụ: số phiên bản đã thay đổi), thì trò chơi trong thư viện sẽ bị ghi đè. Nếu không có thay đổi nào được phát hiện thì sẽ không có mục nào được thực hiện. Nếu không có trò chơi nào trong thư viện thì trước tiên nó sẽ được ghi vào bản đồ cục bộ (một đối tượng như tyk ), sau đó được ghi vào tệp json, vì nếu ứng dụng trên máy chủ bị đóng đột ngột, dữ liệu sẽ bị đóng. bị mất, nhưng nó luôn có thể được đọc bằng tệp. Trên thực tế, khi chương trình bắt đầu, thư viện luôn được tải lần đầu tiên từ một tệp từ khối tĩnh:
static {
        TypeFactory typeFactory = mapper.getTypeFactory();
        MapType mapType = typeFactory.constructMapType(ConcurrentSkipListMap.class, String.class, GooglePlayGame.class);

        try {
            Path path = Paths.get(LIBRARY_PATH);
            if (!Files.exists(path)) {
                Files.createDirectories(path.getParent());
                Files.createFile(path);
                log.info("[Файл библиотеки создан]");
            }
            else {
                ConcurrentMap<string, googleplaygame=""> temporary = mapper.readValue(new File(LIBRARY_PATH), mapType);
                games.putAll(temporary);
                log.info("[Количество игр в загруженной библиотеке] = " + games.size());
            }
        }
        catch (IOException e) {
            log.error("[Ошибка при чтении/записи file] {}", e.getMessage());
        }
    }
Ngoài ra, ở đây, bạn phải đọc dữ liệu từ tệp vào bản đồ tạm thời, sau đó được “sao chép” thành bản đồ đầy đủ để duy trì tính không phân biệt chữ hoa chữ thường khi tìm kiếm trò chơi trong tệp (bằng cách viết tITan QuEST, bot vẫn sẽ tìm thấy trò chơi Titan Quest trong thư viện). Không thể tìm ra giải pháp khác, đây là những tính năng của quá trình khử lưu huỳnh bằng Jackson. Vì vậy, với mỗi yêu cầu liên kết, trò chơi sẽ được thêm vào thư viện, nếu có thể và thư viện sẽ mở rộng. Bạn có thể lấy thêm thông tin về một trò chơi cụ thể bằng lệnh /libraryGame_Name. Bạn có thể tìm hiểu cả một tham số cụ thể (ví dụ: phiên bản hiện tại) và tất cả các tham số cùng một lúc. Điều này được thực hiện bằng bàn phím nội tuyến, đã được thảo luận trước đó. Trong quá trình làm việc, tôi cũng đã áp dụng những kỹ năng có được ở đây vào việc giải quyết vấn đề. Ví dụ: danh sách tên các trò chơi ngẫu nhiên có trong thư viện (tùy chọn khả dụng bằng lệnh /library):
private String getRandomTitles(){
        if (LibraryService.getLibrary().size() < 10){
            return String.join("\n", LibraryService.getLibrary().keySet());
        }
        List<string> keys = new ArrayList<>(LibraryService.getLibrary().keySet());
        Collections.shuffle(keys);
        List<string> randomKeys = keys.subList(0, 10);
        return String.join("\n", randomKeys);
    }
Bot xử lý các liên kết như thế nào? Nó kiểm tra xem chúng có thuộc về Google Play hay không (máy chủ, giao thức, cổng):
private static class GooglePlayCorrectURL {

        private static final String VALID_HOST = "play.google.com";

        private static final String VALID_PROTOCOL = "https";

        private static final int VALID_PORT = -1;

        private static boolean isLinkValid(URI link) {
            return (isHostExist(link) && isProtocolExist(link) && link.getPort() == VALID_PORT);
        }

        private static boolean isProtocolExist(URI link) {
            if (link.getScheme() != null) {
                return link.getScheme().equals(VALID_PROTOCOL);
            }
            else {
                return false;
            }
        }

        private static boolean isHostExist(URI link) {
            if (link.getHost() != null) {
                return link.getHost().equals(VALID_HOST);
            }
            else {
                return false;
            }
        }
Nếu mọi thứ đều ổn, thì bot sẽ kết nối thông qua một liên kết bằng thư viện Jsoup, thư viện này cho phép bạn lấy mã HTML của trang để phân tích và phân tích cú pháp thêm. Bạn sẽ không thể đánh lừa bot bằng một liên kết không chính xác hoặc có hại.
if (GooglePlayCorrectURL.isLinkValid(link)){
     if (!link.getPath().contains("apps")){
         throw new InvalidGooglePlayLinkException("К сожалению, бот работает исключительно с играми. Введите другую ссылку.");
     }
     URL = forceToRusLocalization(URL);
     document = Jsoup.connect(URL).get();
 }
     else {
         throw new NotGooglePlayLinkException();
      }
...
Ở đây chúng tôi phải giải quyết một vấn đề với cài đặt khu vực. Bot kết nối với cửa hàng Google Play từ một máy chủ đặt tại Châu Âu, do đó trang trong cửa hàng Google Play sẽ mở bằng ngôn ngữ thích hợp. Tôi đã phải viết một cái nạng để buộc phải "chuyển hướng" sang phiên bản tiếng Nga của trang này (dù sao thì dự án cũng nhắm đến khán giả của chúng tôi). Để thực hiện việc này, ở cuối liên kết, bạn cần cẩn thận thêm tham số hl: &hl=ru trong yêu cầu GET tới máy chủ Google Play .
private String forceToRusLocalization(String URL) {
        if (URL.endsWith("&hl=ru")){
            return URL;
        }
        else {
            if (URL.contains("&hl=")){
                URL = URL.replace(
                        URL.substring(URL.length()-"&hl=ru".length()), "&hl=ru");
            }
            else {
                URL += "&hl=ru";
            }
        }
        return URL;
    }
Sau khi kết nối thành công, chúng tôi nhận được một tài liệu HTML sẵn sàng để phân tích và phân tích cú pháp, nhưng điều này nằm ngoài phạm vi của bài viết này. Mã trình phân tích cú pháp ở đây . Bản thân trình phân tích cú pháp sẽ lấy thông tin cần thiết và tạo một đối tượng với trò chơi, sau đó sẽ được thêm vào thư viện nếu cần. <h2>Tóm tắt</h2>Bot này hỗ trợ một số lệnh có chức năng nhất định. Nó nhận tin nhắn từ người dùng và khớp chúng với các lệnh của nó. Nếu đó là một liên kết hoặc lệnh /game + link, nó sẽ kiểm tra liên kết đó để xem liệu nó có thuộc về Google Play hay không. Nếu liên kết chính xác, nó sẽ kết nối qua Jsoup và nhận tài liệu HTML. Tài liệu này được phân tích dựa trên trình phân tích cú pháp bằng văn bản. Thông tin cần thiết về trò chơi được trích xuất từ ​​tài liệu và sau đó đối tượng có trò chơi sẽ chứa đầy dữ liệu này. Tiếp theo, đối tượng có trò chơi sẽ được đặt vào bộ nhớ cục bộ (nếu trò chơi chưa có) và ngay lập tức được ghi vào một tệp để tránh mất dữ liệu. Bạn có thể lấy một trò chơi được ghi trong thư viện (tên của trò chơi là chìa khóa cho bản đồ, đối tượng của trò chơi là giá trị cho bản đồ) bằng cách sử dụng lệnh /library Game_name. Nếu trò chơi được chỉ định được tìm thấy trong thư viện của bot, người dùng sẽ được trả lại một bàn phím nội tuyến để có thể lấy thông tin về trò chơi. Nếu không tìm thấy trò chơi, bạn phải đảm bảo tên viết đúng chính tả (phải hoàn toàn khớp với tên trò chơi trong cửa hàng Google Play, trừ trường hợp này) hoặc thêm trò chơi vào thư viện bằng cách gửi bot một liên kết đến trò chơi. Tôi đã triển khai bot trên heroku và đối với những người trong tương lai dự định viết bot của riêng họ và lưu trữ nó miễn phí trên heroku, tôi sẽ đưa ra một số đề xuất để giải quyết những khó khăn mà bạn có thể gặp phải (vì chính tôi đã gặp phải chúng). Thật không may, do tính chất của Heroku, thư viện bot liên tục bị “reset” 24 giờ một lần. Gói của tôi không hỗ trợ lưu trữ tệp trên máy chủ Heroku nên nó chỉ lấy tệp trò chơi của tôi từ Github. Có một số giải pháp: sử dụng cơ sở dữ liệu hoặc tìm một máy chủ khác sẽ lưu trữ tệp này cùng với trò chơi. Tôi quyết định không làm bất cứ điều gì vào lúc này vì về cơ bản thì bot không hữu ích đến thế. Tôi cần nó hơn là để có được trải nghiệm đầy đủ, về cơ bản đó là những gì tôi đã đạt được. Vì vậy, khuyến nghị cho Heroku:
  1. Rất có thể bạn sẽ phải đăng ký trên heroku bằng VPN nếu bạn sống ở Nga.

  2. Ở thư mục gốc của dự án, bạn cần đặt một tệp không có phần mở rộng có tên Procfile. Nội dung của nó phải như thế này: https://github.com/miroha/Telegram-Bot/blob/master/Procfile

  3. Trong pom.xml, thêm các dòng sau theo ví dụ , trong đó thẻ mainClass chỉ ra đường dẫn đến lớp chứa phương thức chính: bot.BotApplication (nếu lớp BotApplication nằm trong thư mục bot).

  4. Không xây dựng bất kỳ dự án nào bằng lệnh gói mvn, v.v., Heroku sẽ tập hợp mọi thứ cho bạn.

  5. Nên thêm gitignore vào dự án, ví dụ:

    # Log file
    *.log
    
    # Compiled resources
    target
    
    # Tests
    test
    
    # IDEA files
    .idea
    *.iml
  6. Trên thực tế, hãy tải dự án lên github, sau đó kết nối kho lưu trữ với Heroku (hoặc sử dụng các phương pháp khác, có 3 trong số đó, nếu tôi không nhầm).

  7. Nếu quá trình tải xuống thành công ("Xây dựng thành công"), hãy nhớ truy cập Định cấu hình Dynos:

    Telegram bot như một dự án đầu tiên và tầm quan trọng của nó đối với sự phát triển nghề nghiệp dựa trên kinh nghiệm cá nhân - 4

    và chuyển thanh trượt, sau đó đảm bảo rằng nó ở vị trí BẬT (do tôi không làm điều này nên bot của tôi không hoạt động và tôi đã vắt óc vài ngày và thực hiện nhiều chuyển động không cần thiết ).

  8. Ẩn mã thông báo bot trên Github. Để làm điều này, bạn cần lấy mã thông báo từ biến môi trường:

    public class Bot extends TelegramLongPollingBot {
    
        private static final String BOT_TOKEN = System.getenv("TOKEN");
    
        @Override
        public String getBotToken() {
            return BOT_TOKEN;
        }
    ...
    }

    Và sau khi triển khai bot, hãy đặt biến này trong bảng điều khiển Heroku trong tab Cài đặt (ở bên phải TOKEN sẽ có trường GIÁ TRỊ, hãy sao chép mã thông báo bot của bạn vào đó):

    Telegram bot như một dự án đầu tiên và tầm quan trọng của nó đối với sự phát triển nghề nghiệp dựa trên kinh nghiệm cá nhân - 5
Tổng cộng, trong 2 tháng thực hiện dự án của riêng mình, tôi:
  • nhận được một dự án hoạt động hoàn chỉnh được viết bằng Java;
  • đã học cách làm việc với API của bên thứ ba (API Telegram Bot);
  • trong thực tế, tôi đã nghiên cứu sâu hơn về tuần tự hóa, làm việc rất nhiều với JSON và thư viện Jackson (ban đầu tôi sử dụng GSON, nhưng có vấn đề với nó);
  • củng cố kỹ năng làm việc với tệp, làm quen với Java NIO;
  • đã học cách làm việc với các tệp .xml cấu hình và làm quen với việc ghi nhật ký;
  • nâng cao trình độ trong môi trường phát triển (IDEA);
  • học cách làm việc với git và học được giá trị của gitignore;
  • đạt được kỹ năng phân tích cú pháp trang web (thư viện Jsoup);
  • đã học và sử dụng một số mẫu thiết kế;
  • phát triển ý thức và mong muốn cải thiện mã (tái cấu trúc);
  • Tôi học cách tìm giải pháp trực tuyến và không ngại đặt những câu hỏi mà tôi không thể tìm thấy câu trả lời.
Telegram bot như một dự án đầu tiên và tầm quan trọng của nó đối với sự phát triển nghề nghiệp dựa trên kinh nghiệm cá nhân - 7Tôi không biết bot này hữu ích hay vô dụng như thế nào, hay mã đẹp/xấu như thế nào, nhưng trải nghiệm tôi nhận được chắc chắn là xứng đáng. Tôi cảm thấy có trách nhiệm với dự án của mình. Thỉnh thoảng tôi muốn cải thiện nó, thêm một cái gì đó mới. Khi tôi có thể chạy nó và thấy mọi thứ hoạt động theo cách tôi muốn, đó thực sự là một cảm giác hồi hộp. Đó không phải là điều chính sao? Hãy tận hưởng những gì bạn làm và tận hưởng từng dòng mã đang hoạt động giống như thanh sô cô la cuối cùng. Vì vậy, nếu bạn đang thành thạo lập trình, thì lời khuyên của tôi dành cho bạn: đừng ở đây cho đến cấp 40 mà hãy bắt đầu dự án của riêng bạn càng sớm càng tốt. Nếu có ai quan tâm, mã nguồn của dự án có tại đây (viết lại cho Spring): https://github.com/miroha/GooglePlayGames-TelegramBot Trong hai tháng qua, tôi hầu như không nghiên cứu tài liệu mới, vì đối với tôi, có vẻ như nó rằng tôi đã đi đến ngõ cụt. Không có việc làm, tôi không còn biết phải phát triển ở đâu nữa, ngoại trừ việc dạy Spring Framework, đó là điều tôi dự định làm trong tháng tới. Và sau đó tôi sẽ cố gắng “viết lại” bot bằng khung này. Sẵn sàng trả lời mọi câu hỏi. :) Chúc mọi người may mắn! CẬP NHẬT từ ngày 07/07/2020 Kho lưu trữ bot bằng Java thuần túy đã bị mất (tôi đã xóa nó, một bản sao vẫn còn trên một máy cục bộ khác), nhưng tôi đã tải xuống bot viết lại cho Spring Boot: https://github.com/miroha /GooglePlayGames-TelegramBot
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION