카테고리 없음

Slack API 사용하여 메시지 전송

엄정식 2025. 1. 24. 11:36

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

우선 앱을 생성해줌

앱 생성

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 to Request Headers
    Token Name 토큰 이름
    Grant Type Authorization Code
    Callback URL https://oauth.pstmn.io/v1/callback
    Auth URL https://slack.com/oauth/v2/authorize
    Access Token URL https://slack.com/api/oauth.v2.access
    Client ID 클라이언트 ID
    Client Secret 클라이언트 Secret
    Scope 원하는 권한 ex : chat:write (Bots 생성 시 추가한 권한)
    Client Authentication Send 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으로 메세지가 전송된다.