본문 바로가기

개발/스프링부트

LogBack과 슬랙, 텔레그램 봇 사용하기 with Springboot

안녕하세요. 

저번 시간에 이어서 오늘은 슬랙, 텔레그램 봇도 마저 만들어보려고 합니다.


슬랙 앱 생성

먼저 슬랙에서 앱 생성을 해보도록 하겠습니다.

슬랙 워크스페이스에서 Slack 찾아보기 > 앱 으로 이동합니다.

그리고 Incoming Webhooks 앱을 찾아서 추가해줍니다.

그리고 메세지를 보낼 채널을 선택해 줍니다.

그러면 디스코드 때와 마찬가지로 슬랙에 메세지를 보낼 수 있는 웹훅 URL을 받을 수 있습니다.


슬랙 메세지 생성하기

저는 디스코드 때 처럼 메세지 객체를 직접 구현해서 슬랙 메세지를 생성했는데요.

위와 같은 형식으로 메세지를 생성했습니다. 생성하고 보니 Slack에서 자체적으로 지원하는 라이브러리가 있는 것을 확인했는데요. 사용하실 분들은 뛰어난 검색을 해보시길 바랍니다.

저는 다 만들고 봐버려서...

슬랙은 디스코드와 마찬가지로 위와 같이 메세지 구성해서 보내면 정상적으로 잘 보내집니다.

위와 같이 슬랙에서 에러 내용을 확인할 수 있습니다 :)


텔레그램 봇 생성

이번에는 텔레그램 봇을 만들어보겠습니다.

텔레그램에서 BotFather를 검색해서 추가해줍니다.

그리고 /newbot 명령어를 통해 봇을 만들 수 있습니다. 이름을 정해달라고 하는데요.

봇의 이름을 정하면 위와같이 토큰을 받을 수 있습니다. 그리고 텔레그램에서 에러로그를 받을 채팅방을 만들어서 생성한 봇을 추가해주면 됩니다.

💡 참고 사항

저 같은 경우 PC 버전에서 채팅방을 만들었을 때는 제대로 진행되지 않았고, 모바일에서 진행했을 때 제대로 진행되었습니다. 혹시나 진행이 잘 되지 않으신다면 모바일로 진행하는 것을 권장드립니다.

텔레그램 봇 문서에서 확인해보면 봇에게 메세지를 보내게 하는 API는 위와 같은데 chat_id 즉, 채팅방의 고유번호가 필수 항목인 것을 확인할 수 있습니다.

https://api.telegram.org/bot{부여받은 봇의 토큰}/getUpdates을 통해 채팅방 id를 확인할 수 있습니다.


텔레그램 메세지 보내기

sendMessage API 문서를 확인해보면 디스코드, 슬랙 과 달리 파라미터로 모든 정보를 넘기는 것을 확인할 수 있습니다.

public static void generate(IThrowableProxy throwableProxy) {
   String message = TelegramMessage.generateMessage(throwableProxy);

   DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(URL);
   defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);

   WebClient.builder()
      .uriBuilderFactory(defaultUriBuilderFactory).build()
      .get()
      .uri(v -> v.queryParam(CHAT_ID, CHAT_ROOM_ID)
         .queryParam(TEXT, "{message}")
         .queryParam(PARSE_MODE, MARKDOWN)
         .build(message))
      .retrieve()
      .toBodilessEntity()
      .subscribe((e) -> {
      }, (error) -> {
         logger.error(error.getMessage());
      });
}

그래서 위와 같이 get방식으로 파라미터들을 추가해서 보내주었습니다.

한 가지 주의할 점은

queryParam(TEXT, "{message}")

이 부분인데요

queryParam(TEXT, message)

저는 처음에 위와 같이 바로 message를 저 곳에 넣어주었는데 API가 제대로 동작하지 않아 한참 헤맸습니다. 아마 마크다운 형식으로 특수문자들을 잔뜩 넣어서 URL에 포함하다 보니 잘 작동하지 않은 것 같은데요. 꼭 마크다운이나 html 형식으로 text를 보내실 때 후자의 방식으로 보내시길 바랍니다.

그리고 위와 같이 정상적으로 전달이 된 것을 확인할 수 있습니다.