JavaRush /Blog Java /Random-PL /Bot telegramowy jako pierwszy projekt i jego znaczenie dl...
Pavel Mironov (Miroha)
Poziom 16
Москва

Bot telegramowy jako pierwszy projekt i jego znaczenie dla rozwoju zawodowego w oparciu o osobiste doświadczenia

Opublikowano w grupie Random-PL
Pozdrowienia dla wszystkich! Opowiedz nam o sobie. Mam 24 lata, rok temu skończyłem technikum i nadal nie mam doświadczenia zawodowego. Patrząc w przyszłość, chcę powiedzieć, że początkowo w ustalonym planie (opracowanym jesienią 2019 r.) Planowałem iść do pracy w marcu-kwietniu 2020 r., Ale niestety przeszkodziła mi kwarantanna, więc wszystko przełożyłem na połowę -lato i w przyszłości mam nadzieję napisać własną historię sukcesu. Bot telegramowy jako pierwszy projekt i jego znaczenie dla rozwoju zawodowego w oparciu o osobiste doświadczenia - 1Nigdy nie ciągnęło mnie do programowania. Na uniwersytecie uczyli dość programowania, ale wtedy to rzemiosło nie mogło mnie zainteresować. Nie zabrakło także języków proceduralnych (C), rocznego kursu OOP (Java), baz danych, a nawet asemblera i C++. Ale szczerze mówiąc, ogólnie byłem obojętny na naukę, ponieważ większość nauczanych dyscyplin wydawała mi się bezużyteczna, odpowiednia jedynie do celów sprawozdawczych (w zasadzie tak jest). Po skończeniu studiów musiałam podjąć decyzję: nie nabyłam pewnych umiejętności, ale musiałam pracować. Musiałem pomyśleć o samokształceniu (och, przegapiłem już co najmniej 2 pełne lata bezczynności) i wybór padł naturalnie na Javę, ponieważ na kursie OOP na uniwersytecie jeden z chłopaków polecił mi kurs javarush , a on, jak wiadomo, zajmuje się szczególnie językiem Java. Zainteresowała mnie prezentacja kursu. Tak, nie lubiłem wtedy programowania, bo natychmiast się poddawałem, gdy napotkałem jakąkolwiek trudność, a trudności w programowaniu jest aż nadto. Ale jednocześnie poczułem, że chcę pisać kod, więc w końcu zdecydowałem się zająć się programowaniem. Pokrótce opowiem Ci o moich doświadczeniach z javarushem. Zacząłem w sierpniu 2019, od razu kupiłem abonament na miesiąc, ale na poziomie 7 zdałem sobie sprawę, że zadania były trudne. Odłożyłem kurs i odebrałem Shildt. Równolegle ukończyłem kurs trwający 3 miesiące. Doszedłem do poziomu 20 (to moje drugie konto), przeczytałem Schildta niemal do końca, po czym znudziły mi się zadania tutaj, w których przestałem widzieć dla siebie praktyczne korzyści. Poszedłem do codewars, leetcode i zacząłem oglądać kursy wideo. Nawiasem mówiąc, po 3 miesiącach przeszedłem od „O nie, co to jest tablica? Jak z nią pracować i dlaczego jest taka przerażająca”? do szczegółowego badania kodu źródłowego klas kolekcji (ArrayList, HashMap itp.). Opierając się na osobistym doświadczeniu, powiem początkującym: najważniejsze jest tutaj przezwyciężenie uczucia, które pojawia się, jeśli niczego nie rozumiesz i nie możesz niczego rozwiązać. Kiedy się pojawia, masz ochotę po prostu rzucić wszystko i wydaje Ci się, że jesteś na to za głupi. Jeśli pokonasz w sobie takie chwile i odpoczniesz psychicznie, sukces nadejdzie. Myślę, że wiele osób nie jest w stanie sobie z tym poradzić, więc szybko rezygnują z takich przedsięwzięć. W rezultacie w grudniu 2019 roku zacząłem myśleć o swoim projekcie. Zdecydowałem się na bota Telegrama, ale nie miałem pomysłu. W tym samym czasie jeden znajomy potrzebował funkcjonalności dla swojej grupy w telegramie, którą chciał zautomatyzować. Po prostu wiedział, że dogłębnie studiuję programowanie i zaproponował mi projekt. Dla mnie dla doświadczenia i przyszłego życiorysu, dla niego dla rozwoju grupy. Pozwolę sobie nawet zacytować jego pomysł: „Недавно софтину хотел у программиста заказать, которая загружала бы в выбранное Облако файлы по прямым połączyćм. Это интересно, так Jak аналогов нет. И просто очень удобно. Суть: копируешь ссылку, вставляешь в окно и выбираешь нужное Облако (GDrive, Mail, Яндекс Диск и т.п), в своё время софт всё делает на стороне serwerа и юзеру ничего не нужно загружать на свою машину (особенно круто, когда у тебя сборка на SSD-накопителях). Думали сделать в web-интерфейсе, чтобы можно было запускать Jak с телефонов, так и с десктопа... Можно в принципе через приложение реализовать, а не через web-интерфейс. Тебе такое по силам?„Zacząłem pracować, ale w końcu po kilku dniach zdałem sobie sprawę, że nic nam nie wyjdzie, głównie z powodu braku wiedzy. Znajomy potrzebował tych samych linków do Cloud.Mail, ale nadal ich nie ma nie ma API. Była próba zmontowania czegoś przez GDrive, ale implementacja była kiepska, w dodatku ta usługa w chmurze nie pasowała „klientowi”. Choć początkowo oferował kilka chmur do wyboru, ostatecznie odrzucił wszystko oprócz poczty .ru, dla którego nie znaleziono rozwiązania. Jakoś wszystko okazało się drogie, konieczne było podłączenie bazy danych, użycie serwera do przechowywania itp. Nawiasem mówiąc, nadal potrzebuje tej aplikacji internetowej. Ponieważ wszystko nie działało u nas nie wyszło, postanowiłem zrobić bota informacyjnego, który miał pobierać linki do gry ze sklepu Google Play, analizować link i zapisywać otrzymane informacje do biblioteki, a następnie zapisywać je do pliku json. Tym samym przy każdym żądaniu biblioteka może się powiększać dzięki wysiłkom użytkowników.W przyszłości informacji o grze nie będzie można uzyskać w wygodnej formie wchodząc do Google Play. Po prostu napisz polecenie /libraryHere_game_name i uzyskaj wszystko, czego potrzebujesz. Ale jest kilka trudności, o których opowiem później. Na początku robiłem postępy powoli, zaczynając jednocześnie brać udział w dwóch kursach SQL. Po prostu nie rozumiałem, jak w ogóle działa bot i jak przetwarzać żądania. Spotkałem znajomego, który również był zainteresowany pracą nad projektem. Pierwsza wersja bota była gotowa po około miesiącu, jednak doszło do nieporozumień ze znajomym (z mojej strony). Ja przejąłem część bota odpowiedzialną za parsowanie, a on bezpośrednio zajmował się żądaniami kierowanymi do bota i ich przetwarzaniem. Z jakiegoś powodu zaczął komplikować bota, wprowadzać jakąś autoryzację, wymyślać administratorów, dodawać niepotrzebne funkcjonalności, a poza tym niezbyt podobał mi się jego styl kodowania. Moim zdaniem w bocie informacyjnym nie było to konieczne. Postanowiłem więc, że sam napiszę od podstaw bota z funkcjonalnością, której potrzebuję. Teraz opowiem Ci co właściwie bot robi (na przykładzie z kodu projektu). Pełny kod projektu załączę na końcu artykułu i niestety nie będę mógł go w pełni skomentować. Każda wiadomość użytkownika wysłana do bota jest obiektem klasy Update. Zawiera wiele informacji (identyfikator wiadomości, identyfikator czatu, unikalny identyfikator użytkownika itp.). Istnieje kilka rodzajów aktualizacji: może to być wiadomość tekstowa, może to być odpowiedź z klawiatury telegramu (oddzwonienie), zdjęcie, dźwięk itp. Aby uniemożliwić użytkownikowi zbytnie zamieszanie, przetwarzam wyłącznie żądania tekstowe i wywołania zwrotne z klawiatury. Jeśli użytkownik wyśle ​​zdjęcie, bot powiadomi go, że nie ma zamiaru nic z nim robić. W głównej klasie bota, w metodzie onUpdateReceived, bot otrzymuje aktualizację.
@Override
    public void onUpdateReceived(Update update) {
        UpdatesReceiver.handleUpdates(update);
    }
które przekazuję do modułu obsługi (własna klasa UpdatesReceiver):
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(), "Я могу принимать только текстовые wiadomości!");
        }
    }
UpdatesReceiver to centralny moduł obsługi, który w zależności od rodzaju aktualizacji przekazuje kontrolę do innego wyspecjalizowanego modułu obsługi: TextMessageHandler lub CallbackQueryHandler, którym konstruktorom przekazuję aktualizację w dalszej części łańcucha. Aktualizacja jest najważniejszą rzeczą podczas pracy z botem i nie powinna zostać zagubiona, ponieważ przy pomocy informacji zapisanych w aktualizacji dowiadujemy się, do jakiego użytkownika i na jaki czat należy wysłać odpowiedź. Aby wygenerować odpowiedzi dla użytkownika, napisałem osobną klasę. Może wysyłać zwykłe wiadomości tekstowe, wiadomości z wbudowaną klawiaturą, wiadomości ze zdjęciem i wiadomości z klawiaturą zwrotną. Klawiatura wbudowana wygląda następująco: Bot telegramowy jako pierwszy projekt i jego znaczenie dla rozwoju zawodowego w oparciu o osobiste doświadczenia - 1Definiuje przyciski, których kliknięcie powoduje wysłanie przez użytkownika wywołania zwrotnego do serwera, które można przetworzyć niemal w taki sam sposób, jak zwykłe wiadomości. Aby go „utrzymać”, potrzebujesz własnego handlera. Dla każdego przycisku ustawiamy akcję, która następnie jest zapisywana w obiekcie Update. Te. dla przycisku „Koszt” ustawiamy opis „/cena” dla wywołania zwrotnego, który możemy później uzyskać z aktualizacji. Następnie w osobnej klasie mogę już przetworzyć to wywołanie zwrotne:
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;
...
Klawiatura odpowiedzi wygląda następująco: Bot telegramowy jako pierwszy projekt i jego znaczenie dla rozwoju zawodowego w oparciu o osobiste doświadczenia - 2Zasadniczo zastępuje ona pisanie przez użytkownika. Kliknięcie przycisku „Biblioteka” spowoduje szybkie wysłanie do bota wiadomości „Biblioteka”. Dla każdego typu klawiatury napisałem własną klasę, implementując wzorzec Buildera: inline i respond . W rezultacie możesz zasadniczo „narysować” żądaną klawiaturę w zależności od wymagań. Jest to strasznie wygodne, ponieważ klawiatury mogą być różne, ale zasada pozostaje ta sama. Oto intuicyjna metoda wysyłania wiadomości za pomocą wbudowanej klawiatury:
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());
        }
    }
Aby zapewnić botowi ścisłą funkcjonalność, wymyślono specjalne polecenia wykorzystujące znak ukośnika: /library, /help, /game itp. W przeciwnym razie musielibyśmy przetworzyć wszelkie śmieci, które użytkownik mógłby zapisać. Właściwie do tego właśnie napisano 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());
}
 ...
Zatem w zależności od tego, jakie polecenie wyślesz botowi, do pracy zostanie włączony specjalny moduł obsługi. Pójdźmy dalej i przyjrzyjmy się pracy parsera i biblioteki. Jeśli wyślesz botowi link do gry w sklepie Google Play, automatycznie zadziała specjalny moduł obsługi . W odpowiedzi użytkownik otrzyma informację o grze w następującej formie: Bot telegramowy jako pierwszy projekt i jego znaczenie dla rozwoju zawodowego w oparciu o osobiste doświadczenia - 3Jednocześnie zostanie wywołana metoda, która spróbuje dodać grę do biblioteki bota (najpierw do mapy lokalnej, następnie do -> pliku json ). Jeśli gra znajduje się już w bibliotece, to zostanie przeprowadzone sprawdzenie (jak w zwykłej hashmapie), a jeśli zmieniły się dane w polu (np. numer wersji), to gra w bibliotece zostanie nadpisana. Jeśli nie zostaną wykryte żadne zmiany, żadne wpisy nie zostaną dokonane. Jeśli w bibliotece w ogóle nie było gry, to najpierw jest ona zapisywana na lokalną mapę (obiekt typu tyk ), a następnie zapisywana do pliku json, gdyż w przypadku nieoczekiwanego zamknięcia aplikacji na serwerze dane zostaną utracone, ale zawsze można je odczytać za pomocą pliku. Właściwie przy uruchomieniu programu biblioteka jest zawsze ładowana po raz pierwszy z pliku z bloku statycznego:
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("[Ошибка при чтении/записи plik] {}", e.getMessage());
        }
    }
Tutaj dodatkowo trzeba wczytać dane z pliku do mapy tymczasowej, która następnie jest „kopiowana” do pełnej mapy, aby zachować rozróżnianie wielkości liter przy wyszukiwaniu gry w pliku (wpisując tITan QuEST, bot i tak znajdzie gra Titan Quest w bibliotece). Nie udało się znaleźć innego rozwiązania, takie są cechy deserializacji przy użyciu Jacksona. Tak więc przy każdej prośbie o link gra jest dodawana do biblioteki, jeśli to możliwe, i w ten sposób biblioteka się powiększa. Dalsze informacje na temat konkretnej gry można uzyskać za pomocą polecenia /libraryGame_Name. Możesz znaleźć zarówno konkretny parametr (na przykład aktualną wersję), jak i wszystkie parametry na raz. Jest to realizowane za pomocą wbudowanej klawiatury, co zostało omówione wcześniej. W trakcie pracy wykorzystywałem także zdobyte tu umiejętności przy rozwiązywaniu problemów. Przykładowo lista nazw losowych gier znajdujących się w bibliotece (opcja dostępna przy pomocy komendy /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);
    }
Jak bot przetwarza linki? Sprawdza je, aby sprawdzić, czy należą do Google Play (host, protokół, port):
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;
            }
        }
Jeśli wszystko jest w porządku, bot łączy się poprzez link korzystając z biblioteki Jsoup, która pozwala na pobranie kodu HTML strony, który podlega dalszej analizie i parsowaniu. Nie oszukasz bota nieprawidłowym lub szkodliwym linkiem.
if (GooglePlayCorrectURL.isLinkValid(link)){
     if (!link.getPath().contains("apps")){
         throw new InvalidGooglePlayLinkException("К сожалению, бот работает исключительно с играми. Введите другую ссылку.");
     }
     URL = forceToRusLocalization(URL);
     document = Jsoup.connect(URL).get();
 }
     else {
         throw new NotGooglePlayLinkException();
      }
...
Tutaj musieliśmy rozwiązać problem z ustawieniami regionalnymi. Bot łączy się ze sklepem Google Play z serwera zlokalizowanego w Europie, dzięki czemu strona w sklepie Google Play otwiera się w odpowiednim języku. Musiałem napisać kulę, która wymusiłaby „przekierowanie” na rosyjską wersję strony (projekt był przecież skierowany do naszych odbiorców). Aby to zrobić należy na końcu linku ostrożnie dodać parametr hl: &hl=ru w żądaniu GET do serwera 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;
    }
Po udanym połączeniu otrzymujemy dokument HTML gotowy do analizy i parsowania, ale to wykracza poza zakres tego artykułu. Kod parsera znajduje się tutaj . Parser sam pobiera niezbędne informacje i tworzy z grą obiekt, który w razie potrzeby jest później dodawany do biblioteki. <h2>Podsumowując</h2>Bot obsługuje kilka poleceń, które zawierają określoną funkcjonalność. Otrzymuje wiadomości od użytkownika i dopasowuje je do swoich poleceń. Jeśli jest to link lub polecenie /game + link, sprawdza ten link, aby sprawdzić, czy należy do Google Play. Jeśli link jest poprawny, łączy się poprzez Jsoup i odbiera dokument HTML. Dokument ten jest analizowany w oparciu o zapisany parser. Z dokumentu pobierane są niezbędne informacje o grze, a następnie obiekt z grą jest tymi danymi wypełniany. Następnie obiekt z grą umieszczany jest w pamięci lokalnej (jeśli gry jeszcze tam nie ma) i od razu zapisywany do pliku, aby uniknąć utraty danych. Grę zapisaną w bibliotece (nazwa gry jest kluczem do mapy, obiekt z grą jest wartością dla mapy) można uzyskać za pomocą polecenia /library nazwa_gry. Jeśli określona gra zostanie znaleziona w bibliotece bota, użytkownikowi zostanie zwrócona wbudowana klawiatura, za pomocą której będzie mógł uzyskać informacje o grze. Jeśli gra nie zostanie znaleziona, musisz albo upewnić się, że nazwa jest wpisana poprawnie (musi całkowicie odpowiadać nazwie gry w sklepie Google Play, za wyjątkiem przypadku) lub dodać grę do biblioteki wysyłając bota link do gry. Wdrożyłem bota na heroku i dla tych, którzy w przyszłości planują napisać własnego bota i hostować go za darmo na heroku, dam kilka zaleceń dotyczących rozwiązania trudności, które możesz napotkać (ponieważ sam je spotkałem). Niestety, ze względu na naturę Heroku, biblioteka botów jest stale „resetowana” co 24 godziny. Mój plan nie obsługuje przechowywania plików na serwerach Heroku, więc po prostu pobiera plik mojej gry z Githuba. Rozwiązań było kilka: użyj bazy danych lub poszukaj innego serwera, który będzie przechowywał ten plik z grą. Postanowiłem na razie nic nie robić, ponieważ w zasadzie bot nie jest zbyt przydatny. Potrzebowałem tego raczej do zdobycia pełnego doświadczenia i to w zasadzie udało mi się osiągnąć. Zatem rekomendacje dla Heroku:
  1. Jeśli mieszkasz w Rosji, najprawdopodobniej będziesz musiał zarejestrować się na heroku za pomocą VPN.

  2. W katalogu głównym projektu musisz umieścić plik bez rozszerzenia o nazwie Procfile. Jego zawartość powinna wyglądać następująco: https://github.com/miroha/Telegram-Bot/blob/master/Procfile

  3. W pliku pom.xml dodaj linie zgodnie z przykładem , gdzie w tagu mainClass wskazujesz ścieżkę do klasy zawierającej metodę główną: bot.BotApplication (jeśli klasa BotApplication znajduje się w folderze bot).

  4. Nie buduj żadnego projektu za pomocą poleceń pakietu mvn itp., Heroku zmontuje wszystko za Ciebie.

  5. Wskazane jest dodanie do projektu gitignore, na przykład to:

    # Log file
    *.log
    
    # Compiled resources
    target
    
    # Tests
    test
    
    # IDEA files
    .idea
    *.iml
  6. Właściwie prześlij projekt na github, a następnie podłącz repozytorium do Heroku (lub użyj innych metod, są ich 3, jeśli się nie mylę).

  7. Jeśli pobieranie przebiegło pomyślnie („Kompilacja powiodła się”), koniecznie przejdź do opcji Konfiguruj Dynos:

    Bot telegramowy jako pierwszy projekt i jego znaczenie dla rozwoju zawodowego w oparciu o osobiste doświadczenia - 4

    i przełącz suwak, a następnie upewnij się, że jest w pozycji ON (ponieważ tego nie zrobiłem, mój bot nie działał i kręciłem się po głowie przez kilka dni i wykonałem wiele niepotrzebnych ruchów ).

  8. Ukryj token bota na Githubie. Aby to zrobić, musisz pobrać token ze zmiennej środowiskowej:

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

    A następnie po wdrożeniu bota ustaw tę zmienną w dashboardzie Heroku w zakładce Ustawienia (na prawo od TOKEN pojawi się pole WARTOŚĆ, skopiuj tam token swojego bota):

    Bot telegramowy jako pierwszy projekt i jego znaczenie dla rozwoju zawodowego w oparciu o osobiste doświadczenia - 5
Łącznie w ciągu 2 miesięcy pracy nad własnym projektem:
  • otrzymał w pełni działający projekt napisany w Javie;
  • nauczyłem się pracować z API stron trzecich (Telegram Bot API);
  • w praktyce zagłębiałem się w serializację, dużo pracowałem z JSON i biblioteką Jacksona (początkowo korzystałem z GSON, ale były z tym problemy);
  • udoskonaliłem swoje umiejętności pracy z plikami, zapoznałem się z Javą NIO;
  • nauczyłem się pracować z plikami konfiguracyjnymi .xml i przyzwyczaiłem się do logowania;
  • poprawa biegłości w środowisku programistycznym (IDEA);
  • nauczyłem się pracować z git i poznałem wartość gitignore;
  • zdobył umiejętności w zakresie parsowania stron internetowych (biblioteka Jsoup);
  • poznałem i zastosowałem kilka wzorców projektowych;
  • rozwinął zmysł i chęć ulepszenia kodu (refactoring);
  • Nauczyłam się znajdować rozwiązania w Internecie i nie bać się zadawać pytań, na które nie mogę znaleźć odpowiedzi.
Bot telegramowy jako pierwszy projekt i jego znaczenie dla rozwoju zawodowego w oparciu o osobiste doświadczenia - 7Nie wiem, jak przydatny lub bezużyteczny okazał się bot, ani jak ładny/brzydki był kod, ale doświadczenie, które zdobyłem, było zdecydowanie tego warte. Poczułem poczucie odpowiedzialności za swój projekt. Co jakiś czas mam ochotę to ulepszyć, dodać coś nowego. Kiedy udało mi się go uruchomić i zobaczyć, że wszystko działa tak, jak chciałem, był to prawdziwy dreszczyk emocji. Czy to nie jest najważniejsze? Ciesz się tym, co robisz i ciesz się każdą działającą linijką kodu jak ostatnią tabliczką czekolady. Dlatego jeśli opanujesz programowanie, moja rada dla ciebie: nie zostawaj tutaj do 40 poziomu, ale rozpocznij własny projekt tak wcześnie, jak to możliwe. Jeśli ktoś jest zainteresowany, kod źródłowy projektu znajduje się tutaj (przepisany na wiosnę): https://github.com/miroha/GooglePlayGames-TelegramBot Przez ostatnie dwa miesiące prawie nie uczyłem się nowego materiału, ponieważ wydaje mi się że doszedłem do ślepego zaułka. Bez pracy nie widzę już miejsca, w którym mógłbym się rozwijać, może poza nauczaniem Spring Framework, co planuję zrobić w następnym miesiącu. A potem spróbuję „przepisać” bota przy użyciu tego frameworka. Gotowy odpowiedzieć na wszelkie pytania. :) Powodzenia wszystkim! AKTUALIZACJA z 07.07.2020 Utracono repozytorium z botem w czystej Javie (usunąłem je, kopia pozostała na innej maszynie lokalnej), ale pobrałem przepisany bot dla Spring Boot: https://github.com/miroha /GooglePlayGames-TelegramBot
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION