JavaRush /Java Blog /Random-KO /프로젝트에 텔레그램 봇 추가 - "A부터 Z까지 Java 프로젝트"
Roman Beekeeper
레벨 35

프로젝트에 텔레그램 봇 추가 - "A부터 Z까지 Java 프로젝트"

Random-KO 그룹에 게시되었습니다
사랑하는 친구 여러분, 안녕하세요. 예, 예, 바로 친구입니다. 나는 이미 이 일련의 기사에 너무 익숙해져서 정기적으로 댓글에 감사의 글을 쓰거나 자료를 읽고 이해했음을 보여주는 사람들은 이미 친해졌습니다. 당신과 나는 같은 목표를 향해 양쪽에서 움직이고 있습니다. 당신은 이해하고 싶지만 설명하고 싶습니다. 그리고 우리는 처음부터 끝까지 귀하가 이해할 수 있는 서면 신청서라는 동일한 최종 목표를 가지고 있습니다. 이 기사에서 설명할 내용에 대해 이미 많이 들어보셨을 것입니다. 나는 여러분에게 새롭고 특별한 것을 말하지 않을 것이라고 생각합니다(그러나 프로젝트의 틀 내에서는 이것을 알고/반복할 필요가 있습니다). "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 1봄에 나는 나 자신을 위해 봇을 작성했으므로 우리는 그 "패턴"에 의존할 것입니다.

JRTB-2를 쓴다

JRTB-0 작업에 대한 기사에서 했던 것과 동일한 작업을 수행합니다 .
  1. ctrl + t 조합을 사용하여 로컬 프로젝트의 기본 분기를 업데이트합니다 ."A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 2
  2. 메인 브랜치를 기반으로 다음을 생성합니다."A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 3
  3. 봇을 추가하세요.
  4. 수행된 작업에 대한 설명이 포함된 새 커밋을 생성하고 이를 GitHub에 푸시합니다.
  5. 메인 브랜치에 대한 Pull Request를 생성하고 다시 확인해 보세요. 우리는 빌드가 (github 작업) 진행되어 메인 브랜치에 병합되기를 기다리고 있습니다.
  6. 해당 작업을 닫습니다.

텔레그램 봇이란 무엇인가요?

우리 개발자들은 텔레그램 봇을 사용하여 다음과 같이 작업하는 것을 상상할 수 있습니다. 우리는 클라이언트를 사용하여 작업합니다. 우리는 업무를 위해 미리 만들어진 라이브러리를 가지고 있습니다 . 텔레그램 봇이 우리 프로그램과 연관되어 있음을 알게 되는 일련의 작업이 있습니다. 그리고 이미 프로그램 내에서 우리는 편지와 명령을 받고 어떻게든 처리하는 방법을 배울 것입니다. 텔레그램 봇에는 슬래시 "/"로 시작하는 명령 과 같은 것이 있습니다 . 그 후에는 즉시 단어를 함께 쓰는데 이것이 명령으로 간주됩니다. 예를 들어, 모든 사람이 알아야 할 두 가지 명령이 있습니다.
  • /start — 봇 작업을 시작합니다.
  • /stop - 봇 작업을 종료합니다.
나머지는 우리가 직접 할게요. 지금 바로 예약하겠습니다. 제가 배운 방식으로 정확하게 수행하겠습니다. 그리고 봇과 함께 작업하면 더 나은 결과를 얻을 수 있을 것이라고 확신합니다. 그리고 누군가가 이 일을 하고 싶어 한다면 나는 기뻐할 것이며 가능한 모든 방법으로 이 노력을 지원할 것입니다. 그건 그렇고, 가장 멋진 것은 누군가가 전보의 봇 설정이 아닌 코드를 통해 명령 설명을 프로그래밍하는 방법을 나에게 설명해 준다는 것입니다. 나는 이것을 배우지 않았습니다. 우리 리소스에는 기본 봇을 만드는 방법을 설명하는 여러 기사가 있습니다. 오늘 우리는 비슷한 것을 할 것입니다. 더 궁금한 점이 있으면 기사를 훑어보는 것이 좋습니다.

BotFather로 봇 만들기

봇을 연결하려면 먼저 봇을 만들어야 합니다. Telegram에는 고유한 이름을 가진 봇을 만드는 접근 방식이 있습니다. 또한 토큰(비밀번호처럼 작동하는 큰 문자열)도 함께 제공됩니다. 저는 이미 JavaRush용 봇인 @javarush_community_bot 을 만들었습니다 . 이 봇은 아직 비어 있으며 아무것도 할 수 없습니다. 가장 중요한 것은 이름 끝에 _bot이 있어야 한다는 것입니다 . 이를 수행하는 방법을 보여주기 위해 기능을 테스트할 봇을 만들겠습니다. 실제 프로젝트의 관점에서 보면 이는 테스트 환경이 됩니다. 그리고 우리의 주요 환경은 prod 환경(prod - 프로덕션, 즉 프로젝트가 실행될 실제 환경)입니다. 물론 다른 환경, 즉 샌드박스 환경을 추가하는 것도 가능할 것입니다. 즉, 모든 개발 참가자가 더욱 변경 가능하고 액세스할 수 있는 공통 샌드박스입니다. 그러나 이는 프로젝트 생성 단계의 상황을 더욱 복잡하게 만들 뿐입니다. 지금은 테스트용과 샌드박스 환경용으로 두 개의 봇을 더 만들어 보겠습니다. 첫 번째 단계는 텔레그램 자체에 봇을 생성(등록)하는 것입니다. @BotFather 봇을 찾아 여기에 명령을 작성해야 합니다. /newbot"A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 4 다음으로 이 봇에 이름을 지정하라는 요청을 받습니다. 이것은 테스트 작업을 위한 봇이므로 이름이 적절할 것입니다: [TEST] JavarushBot"A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 5 이제 항상 찾을 수 있는 고유한 이름을 지정할 시간입니다. 사용자 이름: test_javarush_community"A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 6 위에서 말했듯이 _bot을 추가해야 합니다. 사용자 이름에 대한 접미사이므로 다시 작성합니다: test_javarush_community_bot"A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 7 그게 전부입니다! 봇이 생성되었습니다. 이제 사용자 이름과 토큰을 사용하여 프로젝트에 연결할 수 있습니다. 물론, 테스트 서버의 원활한 운영을 위해 본 봇의 토큰(본질적으로 봇에 접근하기 위한 비밀번호)을 공개적으로 표시하지는 않겠습니다.

봇을 프로젝트에 연결합니다

평소처럼 라이브러리를 포함하지 않고 즉시 뼈대인 SpringBoot를 활용하겠습니다. 그는 스타터와 같은 것을 가지고 있습니다. 라이브러리를 포함하면 이를 사용하여 프로젝트를 올바르게 구성하고 싶다는 사실을 SpringBoot에 알릴 수 있습니다. 여러 곳에서 설명되어 있는 일반적인 경로를 따르려면 다음과 같은 구성을 어딘가에 생성해야 합니다.
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
  telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
  e.printStackTrace();
}
여기서는 봇과의 연결을 설정할 수 있는 개체가 생성됩니다. 우리의 경우 연결하려는 스타터는 "under thehood" 어딘가에서 우리를 위해 모든 작업을 수행합니다(이는 IT에서 자주 사용되는 문구인 under thehood를 번역한 것이기도 합니다). 다음은 이 스타터 에 대한 링크입니다 . README.md 파일에서 그것이 무엇인지, 왜 그리고 어떻게 사용하는지 즉시 확인할 수 있습니다. 연결하려면 이 종속성을 메모리에 추가하기만 하면 됩니다. 그게 다입니다 :) 필수 종속성은 다음과 같습니다.
<dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-spring-boot-starter</artifactId>
        <version>5.0.1</version>
    </dependency>
우리는 그것을 기억에 추가합니다. 예상대로 버전을 설치하고 Maven 프로젝트를 업데이트합니다. "A부터 Z까지 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 8설명에 따라 새 클래스를 만들고 TelegramLongPollingBot에서 상속한 다음 이 클래스를 SpringBoot의 애플리케이션 컨텍스트에 추가하면 됩니다. Application Context는 프로젝트를 실행하기 위해 생성된 객체가 저장되는 곳입니다. 클래스를 추가하려면 @Component, @Service, @Repository, @Controller 주석 중 하나를 사용해야 합니다. 또는 구성 클래스(즉, 구성 주석으로 표시된 클래스)의 메서드를 통해 생성된 경우 @Bean 주석입니다. 나는 이 모든 것이 여전히 이해하기 어려운 것처럼 보일 수 있다는 것을 이해합니다. 하지만 이해하기 시작하면 거기에는 복잡한 것이 없다는 것을 알게 될 것입니다. Spring Boot를 빠르게 이해하려면 멋진 책인 Spring In Action 5판을 추천합니다. 의지만 있다면 이 책을 바탕으로 일련의 기사를 쓸 수도 있습니다. 돌아가자. JavarushTelegramBotApplication이 포함된 패키지에서 텔레그램 봇을 포함할 봇 패키지를 생성합니다. 이름은 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;
   }
}
이 클래스는 추상 클래스였으며 세 가지 메서드를 구현해야 했습니다. 이에 대해 더 자세히 이야기합시다.
  • onUpdateReceived(업데이트 업데이트) - 이는 사용자의 메시지가 도착하는 진입점입니다. 모든 새로운 논리는 여기에서 나옵니다.
  • getBotUsername() - 여기에 연결할 봇의 사용자 이름을 추가해야 합니다.
  • getBotToken() - 따라서 이는 봇 토큰입니다.
본질적으로 이는 사이트의 로그인 및 비밀번호와 같습니다. 지금은 이 값을 명시적으로 쓰지 않겠습니다. 이를 "하드코딩"이라고 합니다(즉, 특정 값을 바인딩하는 것 - 평소와 같이 영어 하드 코드의 추적 용지). 그렇게 해서는 안 됩니다. 우리는 다른 방향으로 갈 것입니다. 이 데이터를 application.properties 클래스에 쓰고 여기에서 읽어보겠습니다. 이것이 왜 필요한가요? 그런 다음 애플리케이션이 시작될 때 이러한 값을 외부에서 설정할 수 있습니다. 유연해요, 그렇죠. src/main/resources/application.properties 파일로 이동합니다. 여기서 우리는 이러한 변수의 이름을 생각해 낼 것입니다. .properties 확장자를 가진 파일은 "="로 구분된 키-값 구조로 읽혀지며, 각 쌍은 별도의 줄입니다. 그래서 저는 다음과 같은 변수를 생각해냈습니다.
  • 봇.사용자 이름 ;
  • 봇.토큰 .
SpringBoot에는 @Value라는 훌륭한 주석 이 있습니다 "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 9. 올바르게 사용하면 application.properties 파일에서 값을 가져옵니다. 다음과 같이 프로젝트를 업데이트합니다.
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;
   }
}
변수의 값을 주석에 전달한 것을 볼 수 있습니다. 그리고 SpringBoot가 봇 개체를 생성하면 속성에서 값을 가져옵니다(다시 말하면 영어의 추적 용지 - 속성). 거의 다 왔어. 봇이 무언가에 대답하도록 해야 합니다. 따라서 onUpdateReceived 메서드를 업데이트해 보겠습니다 . 봇으로 온 메시지를 검색하여 다시 전달해야 합니다. 이렇게 하면 봇이 작동하고 있음을 알 수 있습니다. 이를 위해 필요한 내용을 대략적이고 빠르게 작성하겠습니다.
@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();
       }
   }
}
여기서 모든 것은 매우 간단합니다. 메시지가 실제로 존재하는지 확인하고 메시지 자체( message )와 통신이 이루어지는 채팅 ID( chatId )를 추출합니다. 다음으로 SendMessage 메시지를 보내기 위한 개체를 만들고 메시지 자체와 채팅 ID를 여기에 전달합니다. 즉, 봇에 보낼 내용과 위치를 지정합니다. 우리는 이미 이것으로 충분합니다. 다음으로 JavarushTelegramBotApplication 클래스 에서 기본 메소드를 실행하고 Telegram에서 봇을 찾습니다. "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 10로그에서 봇이 시작된 것을 볼 수 있습니다. 이제 Telegram으로 이동하여 봇에 작성할 시간입니다. "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 11시작을 클릭하면 즉시 답변을 받습니다. "A부터 Z까지 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 12확인하기 위해 더 많은 내용을 작성해 보겠습니다. "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 13그게 전부입니다. 이 시점에서 JRTB-2 작업이 완료되었다고 말할 수 있습니다. . 아직 여기서는 어떤 테스트도 작성할 수 없으므로 모든 것을 그대로 두겠습니다. 다음으로 새 커밋을 만들어야 합니다. "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 14커밋 이름에 주의하세요. 다시 한 번 이것에 주의를 기울이십시오. 커밋에는 먼저 작업 이름이 포함되고 그 다음에는 수행된 작업에 대한 자세한 설명이 포함됩니다. Commit and Push...를 클릭 하고 Push를 다시 클릭하여 확인합니다 . 프로젝트"A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 15 로 이동합니다 . 이전과 마찬가지로 GitHub는 이미 새 브랜치를 확인했으며 기본에 대한 풀 요청 생성을 제안했습니다. 우리는 저항하지 않고 그것을 창조합니다. 평소처럼 우리는 이미 레이블과 프로젝트를 선택하고 그것을 나에게 할당했습니다. 마지막으로 Create Pull Request를 클릭합니다. 빌드가 진행되는 동안 잠시 기다려 보겠습니다. 그러면 끌어오기 요청을 병합할 준비가 완료됩니다."A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 16"A부터 Z까지 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 17

버전 관리

버전 관리를 해야 한다는 점을 어쩐지 놓쳤습니다. 이를 위해 우리는 브랜치에 몇 가지 변경 사항을 더 적용할 것입니다. IDEA로 돌아가서 메모리에 있는 프로젝트 버전을 살펴봅니다. "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 18버전은 0.0.1-SNAPSHOT 입니다 . 의무 버전입니다. 그리고 새로 해결된 문제마다 프로젝트 버전을 업데이트하는 것부터 시작하겠습니다. MVP에 도달할 때까지 버전에는 -SNAPSHOT이라는 접미사가 붙습니다. 버전 관리 체계는 어떻게 되나요? XYZ-SNAPSHOT 여기서:
  • X - 주요 버전 업데이트. 종종 이전 버전과의 하위 호환성 문제가 포함됩니다.
  • Y - 크게 변경되지 않았으며 이전 버전과 완벽하게 호환됩니다.
  • Z는 우리가 발견하고 수리한 결함의 카운터입니다.
이를 바탕으로 첫 번째 버전인 0.1.0-SNAPSHOT을 가지게 됩니다. 즉, 아직 주요 업데이트가 없었고 모든 것이 약간만 이루어졌으며 아직 MVP에 도달하지 않았으므로 접미사 -SNAPSHOT이 있습니다. . 메모리에서 이를 변경해 보겠습니다. "A부터 Z까지 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 19RELEASE_NOTES 파일로 이동하여 각 새 버전의 프로젝트 변경 사항을 설명합니다. "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 20첫 번째 항목입니다. 이제 후속 버전 업데이트마다 정확히 무슨 일이 일어났는지 설명하겠습니다. 이 사례를 커밋하고 설명을 작성합니다. JRTB-2: 업데이트된 프로젝트 버전 및 RELEASE_NOTES에 추가됨 모든 것이 이전과 정확히 동일합니다. 빌드가 통과되기를 기다리고 있으며 변경 사항을 병합할 수 있습니다. 여기서만 조금 다를 것입니다. 메인 브랜치의 각 작업이 별도의 커밋인지 확인하고 싶기 때문에 병합 풀 요청을 푸시하는 것만으로 는 작동하지 않습니다. Git에는 모든 커밋을 하나로 모아 병합하는 git squash 옵션이 있습니다. 이 옵션을 선택합니다. "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 21스쿼시 및 병합을 클릭하면 메시지를 편집할 수 있는 메시지가 표시됩니다. 메시지는 "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 22매우 편리하고 가장 중요한 것은 수요가 있다는 것입니다. 그건 그렇고, bitbucket에서는 그런 기능을 본 적이 없습니다 =/ 병합을 확인하세요. 남은 유일한 일은 보드에서 작업을 완료 상태로 변경하고 끌어오기 요청 링크가 포함된 댓글을 작성한 후 닫는 것입니다. "A부터 Z까지 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 23이제 보드는 다음과 같습니다."A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 24

결론

오늘 우리는 단계별로 텔레그램 봇을 만들고 이를 SpringBoot 프로젝트에 구현했습니다. 봇이 작동하고 답변을 제공합니다. 우리는 속성을 통해 즉시 봇 데이터에 액세스했습니다. 앞으로 더 많은 일이 있을 것입니다. JRTB-3을 수행하고 프로젝트에 명령 패턴을 추가하는 큰 작업을 수행할 것입니다. 아, 한 가지 더... 토큰이 사용되지 않도록 공개하지 않겠다고 말씀드렸습니다. 하지만 자정이 가까워지고 퇴근 후에 기사를 작성하고 있었기 때문에 저장소에 유효한 토큰을 게시했다는 것이 밝혀졌고 GitGuardian은 이에 대해 편지로 나에게 말했습니다. "A부터 Z까지의 Java 프로젝트": 프로젝트에 텔레그램 봇 추가 - 25감사합니다! 이제 무엇을 해야 할까요? 이 토큰 없이 새 커밋을 업로드하더라도 이전 커밋에 남아 있기 때문에 더 이상 git에서 삭제할 수 없습니다. 하지만 커밋을 삭제하고 롤백하고 싶지 않습니다. 그래서 저는 이미 언급된 BotFather의 토큰을 비활성화했습니다. 이제 토큰이 있지만 더 이상 유효하지 않습니다. 기사를 게시하기 전에 내 GitHub 계정을 구독하여 모든 코드를 확인하세요. 읽어주신 모든 분들께 감사드립니다. 곧 뵙겠습니다.

시리즈의 모든 자료 목록은 이 기사의 시작 부분에 있습니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION