Slack Api - Bots 만들기 & 메시지 전송하기

Soyean·2023년 6월 20일
1

Slack

목록 보기
1/3
post-thumbnail
post-custom-banner

슬랙에서 봇이 사용되는 것은 알고 있었으나 어떻게 만드는지에 대해 궁금해져서 오늘은 슬랙에서 봇을 직접 만들어보려고 합니다. 😆

우선 앱을 생성해줍니다.

앱 생성

1. Slack api > Create an App 버튼 클릭

( 그 이전에 슬랙 로그인과 채널 생성은 되어 있는 상태여야 합니다 )
https://api.slack.com/apps

2. From scratch 버튼 클릭

3. 앱의 이름 & 워크스페이스 선택

이름은 변경 가능하여 아무거나 입력해줘도 괜찮습니다 다만, 워크 스페이스는 이후 메신저 봇이 메세지를 보내야 하는 워크스페이스로 설정해줘야 하는데 워크스페이스는 변경 불가하니 주의해서 선택해야 합니다!
앱과 워크스페이스 선택 후 Create App 버튼을 클릭합니다.

슬랙에서 봇을 생성할 때 위의 과정은 동일하고 목적에 따라 Bots / Incoming Webhooks Bots 으로 생성하면 됩니다.

Bots : Allow users to interact with your app through channels and conversations. ✨ > 사용자가 채널 및 대화를 통해 앱과 상호 작용할 수 있도록 합니다.
Incoming Webhooks : Post messages from external sources into Slack. > 외부 소스로 슬랙에 메세지를 보낼 수 있습니다.

우선 이번 포스팅에서는 Bots를 생성하여 메세지 전송 테스트를 진행하겠습니다.
(Incoming Webhooks 생성 & 테스트 방법은 Slack Api - Incoming Webhooks Bots 만들기 & 메시지 전송하기 로 포스팅했습니다. )

Bots 생성

1 ) Bot Token Scopes 추가

OAuth & Permissions 메뉴에 진입하여 Bot Token Scopes 추가해야 합니다.

Add an OAuth Scope 클릭 > calls:write 권한을 추가하여 메세지 작성 권한을 추가합니다.

권한을 추가하면 페이지 상단에 앱을 재설치하라는 팝업이 노출됩니다.

팝업이 노출되지 않는 경우 상단 OAuth Tokens for Your Workspace 영역의 Install to Workspace 클릭합니다.

봇 메시지를 보낼 채널 선택 후 [허용] 클릭합니다. ( 선택한 채널로 메세지 전송됩니다. )

권한 페이지로 돌아오면 봇의 인증 토큰을 확인할 수 있습니다.

2 ) Redirect URLs 추가

OAuth & Permissions 페이지에서 Redirect url 추가해줘야 합니다. 지금 단계에서 추가해줘야 api 리다이렉트 시 오류 없이 처리됩니다.
아래 URL 입력 후 [ADD][Save URLs] 클릭하여 추가합니다.

https://oauth.pstmn.io/v1/browser-callback

Python 코드로 메세지 전송하기

1. slack_bolt / slack_sdk 설치

pip install slack_sdk slack_bolt

2. 토큰 설정

1 ) SLACK_APP_TOKEN

Basic Information 메뉴 > App-Level Tokens 영역에서 앱 레벨 토큰을 생성해줍니다.

권한 추가 & 토큰명 입력 후 [Generate] 버튼 클릭하여 생성하면 토큰 값을 확인할 수 있습니다.

해당 값을 SLACK_APP_TOKEN로 설정합니다.

export SLACK_APP_TOKEN=xoxb-your-token

2 ) SLACK_BOT_TOKEN

OAuth & Permissions > 봇 생성 시 추가되었던 Bot User OAuth Token 을 SLACK_SIGNING_SECRET로 설정합니다.

export SLACK_BOT_TOKEN=xoxb-your-token

3 ) SLACK_SIGNING_SECRET

Basic Information 메뉴 > App Credentials 영역에서 Signing Secret을 SLACK_SIGNING_SECRET로 설정합니다.

export SLACK_SIGNING_SECRET=your-signing-secret

3. 예시 코드

1 ) 메세지 보내기

from venv import logger
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

SLACK_BOT_TOKEN="xoxb-...."

client = WebClient(token=SLACK_BOT_TOKEN)

# ID of the channel you want to send the message to
channel_id = "......"

try:
    # Call the chat.postMessage method using the WebClient
    result = client.chat_postMessage(
        channel=channel_id,
        text="Hello"
    )
    logger.info(result)

except SlackApiError as e:
    logger.error(f"Error posting message: {e}")

2 ) 봇 멘션 시 응답하기

봇은 일방적인 메세지 수신 외 특정 액션에 대한 응답을 할 줄 알아야 합니다. 대표적인 상호 응답 방식 3가지를 소개하겠습니다.

Slash Command

Slash Command란 슬랙 내에서 앱과 상용할 수 있는 명령어로 슬랙 입력 창에 / 입력 시 나오는 것들이 모두 Slack command 입니다.

Slash Commands 메뉴 > Create New Command > 원하는 명령어 이름 입력 후 저장

아래처럼 명령어가 등록되어 / 입력 시 등록한 명령어를 확인할 수 있습니다.

  • 예시 코드
    아래의 예시 코드로 명령어 실행하게 되면 Hi 사용자 이름이 출력됩니다.
    @app.command("/hello-socket-mode")
    def hello_command(ack, body):
        user_id = body["user_id"]
        ack(f"Hi, <@{user_id}>!")

메세지 수신 시 응답하기

  • 예시 코드
    아무 메세지나 수신하게 되면 Hi 전송합니다.

    @app.event("message")
    def event_test(say):
        say("Hi")

봇 멘션 시 응답하기

Event Subscriptions 페이지에서 이벤트를 허용해야 합니다.

  • 예시 코드
    @봇이름 으로 멘션 시 Are you mention me? 전송합니다 .
    @app.event("app_mention")
    def event_test(say):
        say("Are you mention me?")

전체 예시 코드

import os

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


SLACK_BOT_TOKEN="xoxb-"////
SLACK_APP_TOKEN = "xapp-////"
SLACK_SIGNING_SECRET="////"

# Install the Slack app and get xoxb- token in advance
app = App(
    token=SLACK_BOT_TOKEN,
    signing_secret=SLACK_SIGNING_SECRET
)

@app.command("/hello-socket-mode")
def hello_command(ack, body):
    user_id = body["user_id"]
    ack(f"Hi, <@{user_id}>!")

@app.event("message")
def event_test(say):
    say("Hi")

@app.event("app_mention")
def event_test(say):
    say("Are you mention me?")


if __name__ == "__main__":
    SocketModeHandler(app, SLACK_APP_TOKEN).start()

Postman 으로 메세지 전송하기

Chat Web API method 로 API를 사용할 수 있습니다. 그 중 chat.postMessage method를 사용하여 채널에 메세지를 전송해보겠습니다.

1. 슬랙 토큰 추가

Collection 생성 후 Authorization 진입하여 Configure New Token 영역에 아래 필드를 채워줍니다.

  • Client ID와 Client Secret은 Basic Information 메뉴 > App Credentials 영역에서 확인할 수 있습니다.

    ItemValue
    Add auth data toRequest Headers
    Token Name토큰 이름
    Grant TypeAuthorization Code
    Callback URLhttps://oauth.pstmn.io/v1/callback
    Auth URLhttps://slack.com/oauth/v2/authorize
    Access Token URLhttps://slack.com/api/oauth.v2.access
    Client ID클라이언트 ID
    Client Secret클라이언트 Secret
    Scope원하는 권한 ex : chat:write (Bots 생성 시 추가한 권한)
    Client AuthenticationSend client credentials in the body

2. Request 작성 & Send Test

메세지를 전송하기 위해서는 봇의 channel id가 필요합니다. 슬랙 앱 > 슬랙 봇의 오른쪽 버튼 클릭하여 앱 세부정보 보기 시 아래처럼 해당 봇의 channel id를 확인할 수 있습니다.

Post 형식 https://slack.com/api/chat.postMessage 로 전송하게 되는데 Body는 아래처럼 입력합니다.

{
    "channel" : "channel id",
    "text": "전송할 메세지"
}

TEXT Formatting > https://api.slack.com/reference/surfaces/formatting?track=actionable-notifications

전송 성공 시, 아래처럼 해당 봇 DM으로 메세지 전송됩니다.

참고 >
https://api.slack.com/apps/A05MA4L7DMK/incoming-webhooks?success=1
https://api.slack.com/tutorials/slack-apps-and-postman
https://api.slack.com/start/building/bolt-python
https://api.slack.com/tutorials/tracks/responding-to-app-mentions
https://api.slack.com/tutorials/tracks/actionable-notifications
https://github.com/slack-samples/bolt-python-starter-template

profile
주니어 QA 🐥
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 12월 12일

안녕하세요! 글 잘 봤습니다!
slash command 관련하여 질문이 있는데 혹시 받아주실 수 있나요? ㅠㅠ

1개의 답글