본문 바로가기
API

[Slack Bot] Python, Slack-bolt를 이용해 간단한 Bot 만들기

by 오늘의개발부 2022. 3. 2.
반응형

  사내에서 사용하는 Slack App에 구내식당 메뉴를 알려주는 Bot을 추가하려고 한다.

  새로운 회사건물의 구내식당은 저번 회사건물 구내식당보다 맛있는 편이지만 선호하지 않는 메뉴가 나올 땐 외식하고 싶어지곤 한다. 하지만 여기 구내식당은 위치가 2층. 메뉴를 확인하고 내려가기엔 직장인의 점심시간은 늘 짧다. 외식을 결정하고 당장에 메뉴까지 결정하려면 더더욱 짧다. 점심 시간이 되기 전에 미리 구내식당 메뉴를 확인할 수 있도록 하여 효율적인 점심식사 시간을 만들고자한다.

  점심메뉴를 알려주는 Slack Bot은 구글링 해보니 예제가 아주 많다. 역시 직장인의 삶은 비슷비슷하구나.. 그런데 예제 하나만 보고 따라하니 제대로 동작하지 않아 이리 저리 찾아보느라고 시간이 들었다. 2022년 2월 기준으로 이 글만 보고 따라하면 동작까지 확인할 수 있게끔 정리해놓는 포스트다.

 

 

 

 

  슬랙 API 사이트로 접속 (https://api.slack.com/)

 

Slack은 미래의 업무가 이루어지는 곳입니다

Slack은 여러분의 팀과 소통할 새로운 방법입니다. 이메일보다 빠르고, 더 조직적이며, 훨씬 안전합니다.

slack.com

 

 

 

  Create an app 버튼을 눌러 앱을 생성하자

 

 

 

 

  밑에껀 뭔지 잘 모르겠고 우리는 From scratch를 선택할 것이다

 

 

 

 

  앱 이름을 입력하고 workspace를 선택한다. 앱 이름은 변경할 수 있지만 workspace는 변경하지 못하니 주의하라고 한다.

 

 

 

 

 

  우리 봇은 사용자가 특정 메세지를 보내거나 앱을 언급하는 등의 event에 반응하여 응답할 것이다.

그러기 위해서 사용자 이벤트를 구독할 수 있도록 설정하자

왼쪽의 Event Subscriptions 메뉴로 들어가서 Off로 되어있는 Eanable Events를 On으로 바꿔주자

 

 

 

설명에 나와있듯 사용자의 이벤트를 구독하여 Request URL로 Post 요청을 보내준다고 한다. 하지만 이 방법으로 하려면 URL을 하나 파야하기 때문에 개발하기에도 번거롭고, 나는 따로 Bot을 위한 서버를 만들기까지 하고 싶지는 않다.

그래서 우리는 Socket Mode를 이용할 것이다. 아래 버튼을 눌러 소켓모드를 활성화한다.

 

 

 

 

적당한 이름을 붙여 토큰을 하나 생성하자

 

 

여기서 만든 건 앱토큰이다. 앱토큰을 기억해두자.

 

 

 

다시 Event Subscriptions 메뉴에서 Enable Evnets를 On으로 활성화해주자.

소켓모드가 켜져서 Request URL이 더이상 필요 없다고 한다.

그럼 이제 어떤 이벤트를 구독할지 설정해야한다. 밑에 Subscribe to bot events탭을 열어보자

 

 

 

 

Add Bot Event를 눌러 아래와같은 이벤트들을 구독하기로 했다.

Event를 추가한 후 하단의 Save Changes를 눌러 저장해주자.

모든 종류와 자세한 정보는 document를 확인하자 (https://api.slack.com/legacy/oauth-scopes)

 

 

 

 

 

다음으로 앱의 권한 범위를 설정해주자

왼쪽 메뉴에서 OAuth & Permissions 로 들어간다.

그리고 아래와같이 scope를 추가해주자

자세한 내용은 document를 확인하자 (https://api.slack.com/scopes)

 

 

 

 

 

 

 

이제 거의 모든 준비가 끝났다. 워크스페이스에 앱을 설치해주자

같은 메뉴인 OAuth & Permissions에서 스크롤을 올리고 Install To Workspace를 눌러 설치해주자

설치가 끝나면 bot token이 발급된다

 

 

 

 

 

허용을 눌러 설치해준다.

 

 

 

 

 

이제 Slack의 워크스페이스로 이동하여 앱을 설치할 채널에 들어간다.

채널을 우클릭하여 채널 세부정보에서 통합 탭으로 들어가면 앱을 추가할 수 있다.

 

 

 

 

 

이렇게 앱을 추가하면 아래와같이 채널에 메세지가 온다

 

 

 

 

 

 

 

 

 

이제 코드를 작성해서 봇과 소통해보자

나는 파이썬 코드를 간단하게 작성했다.

 

slack_bolt를 이용하면 코드를 쉽게 짤 수 있다

자세한 document는 이 링크를 참조하자(https://slack.dev/bolt-python/concepts)

docs가 매우 쉽고 자세하게 되어 있고 코드 예시도 나와있어 보기 참 좋았다

 

아래 예시는 앱을 언급했을 때 응답하는 코드이다

 

from config import config
import re
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

app = App(token=config['bot_token'])


@app.event("app_mention")  # 앱을 언급했을 때
def who_am_i(event, client, message, say):
    print('event:', event)
    print('client:', client)
    print('message:', message)

    say(f'hello! <@{event["user"]}>')


if __name__ == '__main__':
    SocketModeHandler(app, config['app_token']).start()

 

 

 

 이 코드를 실행하면  이렇게 응답이 온다

 

 

 

 

이렇게 코드를 작성하면 앱이 설치된 채널에 응답하는 게 아니라 DM으로 응답을 줄 수도 있다

@app.event("app_mention")  # 앱을 언급했을 때 DM
def who_am_i(event, client, message, say):
    print('dm,event:', event)
    print('dm,client:', client)
    print('dm,message:', message)

    client.chat_postMessage(channel=event['user'], text='that is dm')

 

 

 

 

참고로 

아래와같은 방법으로 응답하면 when_september_ends 시간이 되었을 때 메세지를 보내준다.

/reminder 명령어와 비슷한 기능이지만 비개발 직군과 협업용 앱을 만들 때 이 기능을 이용하면 사용자 친화적으로 만들 수 있을 것 같다

아래는 시간을 하드코딩했지만 사용자 입력을 받아서 정해진 시간에 알림을 주면 될 것이다

시간 형식은 unixtime이다

 

 

 

@app.event("app_mention")  # 앱을 언급했을 때 DM
def who_am_i(event, client, message, say):
    print('dm,event:', event)
    print('dm,client:', client)
    print('dm,message:', message)

    when_september_ends = 1645163580
    client.chat_scheduleMessage(
        channel=event['user'],
        post_at=when_september_ends,
        text="Summer has come and passed"
    )

 

 

 

 

 

아래 코드는 앱이 설치된 채널에 메세지가 올라오는 모든 메세지 이벤트를 감지한다

 

@app.event("message")  # 앱이 설치된 채널에 메세지가 올라올 때
def handle_message_events(event, message, say):
    print('event :', event)
    print('message:', message)

    say('message!')

 

 

 

 

 

특정 단어만 포함한 메세지를 잡고 싶다면 regex도 사용할 수 있다

 

@app.message(re.compile("hello"))
def regex(event, client, message, say):
    say('world!')

 

 

 

 

 

위 모든 내용은 슬랙의 공식 document를 참고했다.

다시말하지만 공식 docs가 매우 잘 되어 있으니 한번 훑어보면 원하는 기능을 쉽게 만들어낼 수 있을 것이다.

python으로 코드를 작성한다면 아래 docs를 참고해보자. 물론 python이외에 다른 언어로 된 docs도 찾으면 다 나온다.

 

https://slack.dev/bolt-python/concepts

 

반응형