ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA로 Slack API를 활용한 알림봇[자동알림] 설정하기 (feat. chat.postMessage)
    IT/Java 2020. 11. 21. 20:11

    #개요

    IT업계 뿐만아니라 일반적인 기업도 요즘은 필수로 사용되는 생산성 툴 중 전사적인 협업툴로 불리는 Slack이 몹시 유명하다.

    이러한 Slack에는 트랜드에 맞게 유용한 API를 몹시 많이 제공해주는데, 이 API를 실제 서비스에 연동하면 아주 유용하게 사용할 수 있다.

     

    이 Slack API 중에서도 아마 가장많이 쓰일 API라면 Chat API 를 이용하여 자동알림설정을 하는것일텐데, 이를 연동해보려고 하니 우선 문서가 모두 영어라서 바쁜일정을 위해 요약되어있는 블로그를 찾아나섰으나... (제발 영어 공식문서 보는 습관을 들입시다 나님)

    예상과 달리 생각보다 딱! 딱! 따라했을때 딱! 하고 해결되는 솔루션이 쉽게 나오지않았다.

     

    그래서 딱! 딱! 따라하면 딱! 나올수있도록 내가 재 정리했다.

     

     

     

     

     


    #목차

    #1. Chatbot을 적용하기 위한 사전준비

    #2. Chatbot 생성

    #3. Slack 채널 생성 및 채널정보 얻기

    #4. Chat API 호출 및 소스코드 구현

     

     

     

     

     


    #1. Chatbot을 적용하기 위한 사전준비

    먼저 간략하게 작업할 내용들을 한번 나열하면 아래의 순서로 작업을 진행할 예정이다.

     * 작업할 Slack 계정과 워크스페이스 준비

     * Slack API에서 자동봇으로 사용할 App 생성
     * 해당 App에게 필요한 권한부여

     * Slack 메신저에서 알림봇을 적용할 공개채널 생성하고 해당 채널에 위 App 추가

     * 채널의 ID를 받아오는 API 호출

     * Chat API 호출

     

     

    - 당연하겠지만, Slack 계정과 본인이 속해있는 워크스페이스가 있어야 한다.

    우선 Slack 에 채널을 생성한다.

    이때 반드시 공개채널로 생성해야하며, 비공개로 만들면 안된다.

     

     

     

     

     


    #2. Chatbot 생성

     - 먼저 api.slack.com/apps 로 접속, Create An App 을 클릭하여 알림봇으로 사용할 App을 생성한다.

    App Name은 이후 채널 내에서 알람을 해주는 녀석의 이름으로 적용되니, 참고하여 이름을 지어주고,

    development Slack Workspace 는 알람봇을 적용할 워크스페이스를 지정하면 된다.

     

     

     

    -  App을 생성하면 생성된 App이 표시되는데 이를 클릭한 뒤 좌측네비바에 OAuto & Permissions 로 입장하여 App에 권한을 부여해주러 간다.

     

     

     

    - App이 채널목록을 불러올 수 있어야 하므로 Scopes 항목의 Add an OAuth Scope 를 클릭하여 channels:read 를 선택해주고 마찬가지로 채팅을 보낼 수 있어야 하므로 chat:write 권한을 준다.

     

     

     

    - 그런다음 Install App로 들어가서 Install To Workspce 를 클릭해주면, 우측과 같이 xoxb-................... 와 같은 모양으로 긴 문자열의 OAuth Tokens을 발급해준다.

    알림봇의 인증키로 사용될 토큰이니 잘 적어두자.

     

     

     

     

     


    #3. Slack 채널 생성 및 채널정보 얻기

    - Slack에서 알림봇을 적용할 채널을 하나 생성한다. 이때 채널은 반드시 공개채널이여야 한다.

     

     

     

    - 이후 상단 i버튼 ->  더보기 -> 앱 추가로 들어가서 알림봇으로 만든 App을 추가해준다

     

     

     

    - 알림을 보내는 API를 사용하기 위해서는 전송하려는 채널의 ID를 알아야하는데, 워크스페이스의 전체 채널의 리스트 정보를 조회하는 API를 먼저 확인해야 한다.

    api.slack.com/methods/conversations.list/test 에 접속하여 궁금한 사람은 Documentation을 쭉 보고, 급한사람은 바로 Tester 탭으로 들어가서 항목에 데이터를 넣고 바로 호출해보자.

    token에 위에 생성했던 xoxb... 꼴로 생긴 긴 OAuto token을 통째로 갖다 넣고 Test Method를 클릭하면 하단에 채널의 리스트 정보가 호출된다.

     

     

     

    - 결과 중 channels 라는 배열요소에 해당앱이 접근가능한(비공개 채널은 안나옴) 채널들의 정보가 표기되는데, 그 중 알림봇이 작동할 채널의 ID값이 필요하다.

    채널의 이름이 영문이면 CTRL + F 를 이용해 채널명으로 찾을 수 있으나, 채널명이 한글인 경우 유니코드로 표기되어 알아볼 수 없게 되어있다.

     

    예를들어 "일반" 이라는 채널명을 찾는다고 하면, www.online-toolz.com/tools/text-unicode-entities-convertor.php

     에 접속하여 일반이라는 문자열을 유니코드로 변환할 수 있는데, 나오는 결과값에 %를 \로 바꾸어 채널리스트API 결과에서 찾아보면 일치하는 채널항목을 볼 수 있다.

     

    이러한 방식으로 알람봇이 작동할 채널의 ID값을 취득한다.

     

     

     

     

     


    #4. Chat API 호출 및 소스코드 구현

    - 위 단계를 통해 알람봇 앱의 OAuth KeyChannel ID를 취득했다면 사전준비가 끝났다.

    api.slack.com/methods/chat.postMessage 에서 token에는 앱의 OAuth Key를 입력하고, channel에는 채널의 ID를 입력, text에는 알람봇이 전송할 문자열을 입력하고 Test Method를 클릭.

    알람봇이 정상적으로 채널에 메세지를 보내고 리턴값으로 여러가지 응답결과 데이터를 반환한다.

     

     

     

     - 만약 호출에 실패한다면 아래와같이 "ok" 항목에 false를 내뱉는데 error 메세지를 보고 뭐가 잘못되었는지 유추하자.

    invalid_auth : Key가 잘못되었거나 #2. Chatbot 생성 에서 이야기했던 Scope의 설정에 chat:write 권한이 적용되지 않았을것이다.

    not_in_channel : 입력한 ID의 채널에 해당 알림봇 App이 추가되지 않았을것이다.

    channel_not_found : 채널의 ID가 잘못되었을것이다.

     

     

     

     

    - 알림봇이 정상적으로 알림을 전송한다면 모든 세팅이 끝났다. HTTP로 통신하는 로직을 소스코드로 구현만 하면 된다.

    다만, chat.postMessage 의 Documentation을 보면 POST로 호출하라고 안내하고 있으나, 무슨이유인지 실제 Tester로 호출할땐 GET 방식으로 호출하고있다.

    실제로 호출하는 Full URL을 브라우저에서 호출하더라도 응답봇이 정상적으로 작동한다.

    그래서 나도 GET방식으로 그냥 간단하게 호출하는 로직을 구현했다.

    public void sendSlack() throws Exception  {
    	String urlStr = "https://slack.com/api/chat.postMessage?";
    	urlStr += "token={본인 App의 OAuth Key}&";
    	urlStr += "channel={응답할 Channel의 ID}";
    	urlStr += "text="+URLEncoder.encode("{전송할 말}", "UTF-8");
    
    	HttpURLConnection conn = null;
    	URL url = new URL(urlStr);
    	conn = (HttpURLConnection) url.openConnection();
    	conn.setRequestProperty("Accept", "application/json");
    	conn.setRequestMethod("GET");
    	conn.connect();
    	new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    }

    혹시나 전송할 말에 줄바꿈을 넣고싶다면 \n 을 사용하여 개행처리를 하면 된다.

     

     

     

     


     

    댓글

다치지 말고 운동하자.