슬랙 봇을 이용해 slash command를 만들게 되어 그 방법을 찾다가 이를 파이썬으로 활용하기 위한 도구인 slack bolt를 알게 되었다.
슬랙 봇을 사용하고 싶은 채널에는 꼭 슬랙 봇이 초대되어 있어야 한다.
유저의 요청이 들어오면 응답으로 HTTP 200을 보내줘야 한다. 그렇지 않으면 에러 메시지를 보내게 된다.
confirmation은 슬랙을 통해 3초 이내에 전송되어야 하며 그렇지 않으면 timeout error가 나게 된다.
슬랙에서는 slack bolt
라는 최신 플랫폼 기능으로 Slack 앱을 빌드할 수 있는 Python 라이브러리를 제공한다. 따라서 해당 라이브러리를 이용해 slash command에 대한 event와 해당 view를 작성할 수 있다.
import os
from slack_bolt import App
# Initializes your app with your bot token and signing secret
app = App(
token=os.environ.get("SLACK_BOT_TOKEN"),
signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)
slash command를 등록하기 위해서는 command
메소드와 view
메소드가 필요하다.
다음과 같이 사용할 수 있다.
각각 decorator와 메소드 예시이다. 둘 중에 하나를 택해 사용하면 된다.
# Use this method as a decorator
@app.command("/echo")
def repeat_text(ack, say, command):
# Acknowledge command request
ack()
say(f"{command['text']}")
# Pass a function to this method
app.command("/echo")(repeat_text)
각각 decorator와 메소드 예시이다.
handle_submission 메소드 내의 ack()
는 view_submission 이벤트를 인지하고 모달 창을 닫으며 인자로 들어온 client
를 이용해 chat_postMessage
로 채널에 원하는 메세지를 전송할 수 있다.
# Use this method as a decorator
@app.view("view_1")
def handle_submission(ack, body, client, view):
# Assume there's an input block with <code>block\_c</code> as the block_id and <code>dreamy\_input</code>
hopes_and_dreams = view["state"]["values"]["block_c"]["dreamy_input"]
user = body["user"]["id"]
# Validate the inputs
errors = {}
if hopes_and_dreams is not None and len(hopes_and_dreams) <= 5:
errors["block_c"] = "The value must be longer than 5 characters"
if len(errors) > 0:
ack(response_action="errors", errors=errors)
return
# Acknowledge the view_submission event and close the modal
ack()
# Do whatever you want with the input data - here we're saving it to a DB
# Pass a function to this method
app.view("view_1")(handle_submission)
모달 창 열기
슬랙에서 사용자가 슬래시 커맨드를 입력하면 해당 커맨드에 연동된 모달 창이 뜬다. 모달은 유저 데이터를 모으고 여러 정보를 사용자에게 노출할 수 있는 창이다. 이를 slack_bolt를 이용해 생성할 수 있다.
모달 창을 열기 위해서는 유효한 trigger_id
와 view payload
를 views.open
메소드에 인자로 전달해야 한다. 그러면 생성해 놓은 앱이 Request URL을 통해 trigger_id
를 전달 받고 해당하는 view를 실행하게 된다.
# Listen for a shortcut invocation
@app.shortcut("open_modal")
def open_modal(ack, body, client):
# Acknowledge the command request
ack()
# Call views_open with the built-in client
client.views_open(
# Pass a valid trigger_id within 3 seconds of receiving it
trigger_id=body["trigger_id"],
# View payload
view={
"type": "modal",
# View identifier
"callback_id": "view_1",
"title": {"type": "plain_text", "text": "My App"},
"submit": {"type": "plain_text", "text": "Submit"},
"blocks": [
{
"type": "section",
"text": {"type": "mrkdwn", "text": "Welcome to a modal with _blocks_"},
"accessory": {
"type": "button",
"text": {"type": "plain_text", "text": "Click me!"},
"action_id": "button_abc"
}
},
{
"type": "input",
"block_id": "input_c",
"label": {"type": "plain_text", "text": "What are your hopes and dreams?"},
"element": {
"type": "plain_text_input",
"action_id": "dreamy_input",
"multiline": True
}
}
]
}
)
채널에 메시지 보내기
result = client.chat_postMessage(
channel=channel_id,
text="Hello world"
)
기본적으로는 위와 같은 형태이고, block message를 보내기 위해서는 block 인자를 추가해 보내면 된다.
client.chat_postMessage(channel=user, blocks=blocks, text=msg)
blocks에 들어갈 수 있는 내용은 아래 형식을 참고
[{"type": "section", "text": {"type": "plain_text", "text": "Hello world"}}]
→ 주의해야 할 점이 있는데, postMessage 메소드를 사용하기 위해서 필요한 required scopes
가 있다. 이를 본인이 생성한 슬랙 봇 설정에서 잘 확인하고 추가해야 한다.