본문 바로가기
카테고리 없음

Python으로 Slack App Bot 만들기(1)_로컬PC Ver.

by BTC_SHINN 2023. 7. 19.

 

베하! 안녕하세요~

BTC_수신자표시제한 입니다 😊

오늘은 로컬PC에서 Python으로 Slack App Bot을 만들어 보도록 하겠습니다. 

 


업무를 하다 보면 자주 찾게 되는 파일이나 정보들이 있죠. 

하지만 매번 그 정보가 어디 있었는지 헷갈리는 경험, 하신 적 있지 않나요?

 

이럴 때 활용해 보면 좋을 Slack App Bot을 만들어 보도록 하겠습니다. 

 

오늘 소개해 드릴 Slack App Bot은

특정 키워드에 대한 응답 값을 매칭해놓고 키워드를 통해 정보를 찾는 형태의 Bot입니다.

 

Hands-on

 

1. https://api.slack.com/apps 에 접속하여 'Create New App'을 클릭한 후 'From scratch'를 선택합니다.

 

2. App 이름을 입력하고 해당 App을 사용할 workspace를 선택한 후 'Create App' 합니다.

 

3. Basic Information - Add features and functionality - Bots를 지정해줍니다. 

 

4-1. Features - OAuth & Permissions - Scopes - Add an OAuth Scope 에서 다음과 같이 권한을 추가해줍니다. 

4-2. Event Subscriptions - Subscribe to bot events에서 다음과 같이 권한을 추가해줍니다

 

5. OAuth & Permissions - OAuth Tokens for Your Workspace - Install to Workspace - 안내메시지가 뜨면 '허용'을 선택합니다

 

6. 5번을 완료하면 사진과 같이 토큰 값이 뜹니다.

    이 토큰값은 App Bot이 Slack에 메세지 전송시 사용하게 되는 Token 값입니다.

 


다음으로 로컬 PC에서 Slack App 호출을 할 수 있도록 ngrok과 Flask 를 설치해보겠습니다. 

 

7. ngrok 사이트로 이동하여 로그인 후 파일을 다운로드 받아 설치해줍니다.

 

8. 기본적으로 ngrok는 기본 세션 유효기간이 8시간으로 설정되어 있습니다.

    그러나 가입 후 토큰을 등록하면 세션을 시간제한 없이 사용할 수 있습니다.

    세션을 제한 없이 사용하기 위해 auth token을 등록합니다. 

    홈페이지에서 토큰 인증 명령어를 복사하여 로컬 PC의 터미널에서 실행합니다. 

 

9. ngrok에서 지원해주는 정적 도메인을 활성화합니다.

 

 

10. 이제 원하는 포트로 ngrok를 실행합니다. 저는 파이썬 파일에서 열어줄 9008 포트로 실행하겠습니다. 

ngrok http --domain=<도메인명> 9008

 


11. 이후 작업 전 다음과 같은 Python 파일을 만들어줍니다. 

   11-1. token 부분에 5번에서 생성된 token 값을 넣어줍니다. 

   11-2. answer_dict 부분에 검색 키워드와 응답받고싶은 정보값을 넣어줍니다. 

   11-3. app.run부분에 열고자하는 port를 설정해줍니다.(ngrok 실행시 열어준 port와 동일해야합니다.)

# slackBot.py
import json
from datetime import datetime
from flask import Flask, request, make_response
from slack_sdk import WebClient
import logging

token = "슬랙에서 생성한 토큰값 넣어주기(5번 참고)"
app = Flask(__name__)
client = WebClient(token)

logger = logging.getLogger()

def get_day_of_week():
    weekday = datetime.today().strftime("%A")
    date = datetime.today().strftime("Year %Y %m Month %d Day")
    return f'{date} ({weekday})'

def get_time():
    return datetime.today().strftime("%H hour %M minutes %S seconds")

answer_dict = {
    '안녕': '안녕하세요. 수신자표시제한 Bot 입니다.',
    '요일': f':calendar: 오늘은 {get_day_of_week()} 입니다',
    '시간': f':clock9: 현재시간은 {get_time()} 입니다',
    '테크블로그' : 'https://btcd.tistory.com/'
}

def get_answer(text):
    trim_text = text.replace(" ", "")
    for key, value in answer_dict.items():
        if trim_text == key or trim_text in value:
            return value
    return f"{text} 는 존재하지 않는 질문입니다."

def set_message(event_type, slack_event):
    channel = slack_event["event"]["channel"]
    user_query = slack_event['event']['blocks'][0]['elements'][0]['elements'][1]['text']
    answer = get_answer(user_query)
    result = client.chat_postMessage(channel=channel, text=answer)
    return make_response("ok", 200)

@app.route('/', methods=['POST'])
def chat_main():
    slack_event = json.loads(request.data)
    bot_id = slack_event.get("event", {}).get("bot_id")
    if bot_id is not None:
        return make_response("Turning retries off", 200, {"X-Slack-No-Retry": 1})

    if "challenge" in slack_event:
        return make_response(slack_event["challenge"], 200, {"content_type": "application/json"})

    if "event" in slack_event:
        event_type = slack_event["event"]["type"]
        return set_message(event_type, slack_event)
    return make_response("Turning retries off", 404, {"X-Slack-No-Retry": 1})

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=9008)

 

12. Flask와 Slack_sdk 를 설치해 줍니다.

  ※ flask를 설치했음에도 flask 모듈이 없다고 뜨면 시스템 환경 변수 설정을 해주세요.

# flask랑 slack_sdk 모듈 설치

pip install flask 
pip install slack_sdk

 

13. 다시 Slack에서  Event Subscriptions - Enable Events - Request URL 에 ngrok 도메인을 입력해줍니다.
      Verified 라고 뜨면 잘 설정된겁니다. 

 

14. App Home - Messages Tab에서

     Allow users to send Slash commands and messages from the messages tab을 활성화해줍니다.

 


15. 여기까지 설정을 완료하셨다면 슬랙 채널 하단의 앱 추가에서 Answer_Bot을 선택해줍니다. 

 

16. 이제 설치된 앱에서 키워드를 물어보면

Python 코드에 입력해둔 데이터를 기반으로 response값을 받아볼수있게됩니다. 

 


여기까지 로컬PC에서 Python을 통해 Slack App Bot 생성하는 방법에 대해 알아보았습니다. 

도움이 되셨으면 좋겠습니다.😊

 

다음엔 AWS EC2에서 동일한 Slack App Bot을 만들어보도록 하겠습니다.
다음에 또 만나요 👋👋

댓글