Slack bot | slack bolt 사용법

Jihun Kim·2022년 1월 18일
0

slack

목록 보기
1/1
post-thumbnail

슬랙 봇을 이용해 slash command를 만들게 되어 그 방법을 찾다가 이를 파이썬으로 활용하기 위한 도구인 slack bolt를 알게 되었다.

슬랙 봇을 사용하고 싶은 채널에는 꼭 슬랙 봇이 초대되어 있어야 한다.



Slack

slash command

  • 슬래시 커맨드를 이용하면 데이터 payload를 슬랙과 연동된 앱으로 보낼 수 있다.
  • 내장 명령어를 제외하고 만들면 된다.

slash commands 생성 방법

  • POST method 이용
  • Request URL: 해당 채널

confirming receipt

  • 유저의 요청이 들어오면 응답으로 HTTP 200을 보내줘야 한다. 그렇지 않으면 에러 메시지를 보내게 된다.

  • confirmation은 슬랙을 통해 3초 이내에 전송되어야 하며 그렇지 않으면 timeout error가 나게 된다.



Bolt SDK 사용하기

슬랙에서는 slack bolt라는 최신 플랫폼 기능으로 Slack 앱을 빌드할 수 있는 Python 라이브러리를 제공한다. 따라서 해당 라이브러리를 이용해 slash command에 대한 event와 해당 view를 작성할 수 있다.


App Initializing

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 메소드가 필요하다.

다음과 같이 사용할 수 있다.


command

각각 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)

view

각각 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_idview payloadviews.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가 있다. 이를 본인이 생성한 슬랙 봇 설정에서 잘 확인하고 추가해야 한다.


  • 해당 내용은 여기에 설명 되어 있다.
  • 이밖에 더 자세한 내용은 여기에 설명되어 있다.
profile
쿄쿄

0개의 댓글