슬랙에서 봇이 사용되는 것은 알고 있었으나 어떻게 만드는지에 대해 궁금해져서 오늘은 슬랙에서 봇을 직접 만들어보려고 합니다. 😆
우선 앱을 생성해줍니다.
( 그 이전에 슬랙 로그인과 채널 생성은 되어 있는 상태여야 합니다 )
https://api.slack.com/apps
이름은 변경 가능하여 아무거나 입력해줘도 괜찮습니다 다만, 워크 스페이스는 이후 메신저 봇이 메세지를 보내야 하는 워크스페이스로 설정해줘야 하는데 워크스페이스는 변경 불가하니 주의해서 선택해야 합니다!
앱과 워크스페이스 선택 후 Create App 버튼을 클릭합니다.
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 만들기 & 메시지 전송하기 로 포스팅했습니다. )
OAuth & Permissions 메뉴에 진입하여 Bot Token Scopes 추가해야 합니다.
Add an OAuth Scope 클릭 > calls:write 권한을 추가하여 메세지 작성 권한을 추가합니다.
권한을 추가하면 페이지 상단에 앱을 재설치하라는 팝업이 노출됩니다.
팝업이 노출되지 않는 경우 상단 OAuth Tokens for Your Workspace 영역의 Install to Workspace 클릭합니다.
봇 메시지를 보낼 채널 선택 후 [허용] 클릭합니다. ( 선택한 채널로 메세지 전송됩니다. )
권한 페이지로 돌아오면 봇의 인증 토큰을 확인할 수 있습니다.
OAuth & Permissions 페이지에서 Redirect url 추가해줘야 합니다. 지금 단계에서 추가해줘야 api 리다이렉트 시 오류 없이 처리됩니다.
아래 URL 입력 후 [ADD][Save URLs] 클릭하여 추가합니다.
https://oauth.pstmn.io/v1/browser-callback
pip install slack_sdk slack_bolt
Basic Information 메뉴 > App-Level Tokens 영역에서 앱 레벨 토큰을 생성해줍니다.
권한 추가 & 토큰명 입력 후 [Generate] 버튼 클릭하여 생성하면 토큰 값을 확인할 수 있습니다.
해당 값을 SLACK_APP_TOKEN로 설정합니다.
export SLACK_APP_TOKEN=xoxb-your-token
OAuth & Permissions > 봇 생성 시 추가되었던 Bot User OAuth Token 을 SLACK_SIGNING_SECRET로 설정합니다.
export SLACK_BOT_TOKEN=xoxb-your-token
Basic Information 메뉴 > App Credentials 영역에서 Signing Secret을 SLACK_SIGNING_SECRET로 설정합니다.
export SLACK_SIGNING_SECRET=your-signing-secret
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}")
봇은 일방적인 메세지 수신 외 특정 액션에 대한 응답을 할 줄 알아야 합니다. 대표적인 상호 응답 방식 3가지를 소개하겠습니다.
Slash Command란 슬랙 내에서 앱과 상용할 수 있는 명령어로 슬랙 입력 창에 / 입력 시 나오는 것들이 모두 Slack command 입니다.
Slash Commands 메뉴 > Create New Command > 원하는 명령어 이름 입력 후 저장
아래처럼 명령어가 등록되어 / 입력 시 등록한 명령어를 확인할 수 있습니다.
@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 페이지에서 이벤트를 허용해야 합니다.
@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()
Chat Web API method 로 API를 사용할 수 있습니다. 그 중 chat.postMessage method를 사용하여 채널에 메세지를 전송해보겠습니다.
Collection 생성 후 Authorization 진입하여 Configure New Token 영역에 아래 필드를 채워줍니다.
Client ID와 Client Secret은 Basic Information 메뉴 > App Credentials 영역에서 확인할 수 있습니다.
Item | Value |
---|---|
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 |
메세지를 전송하기 위해서는 봇의 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
안녕하세요! 글 잘 봤습니다!
slash command 관련하여 질문이 있는데 혹시 받아주실 수 있나요? ㅠㅠ