Slack API 사용하여 메시지 전송
슬랙에서 봇이 사용되는 것은 알고 있었으나 어떻게 만드는지에 대해 궁금해져서 오늘은 슬랙에서 봇을 직접 만들어보려고 한다.
우선 앱을 생성해줌
앱 생성
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으로 메세지가 전송된다.