Slack の Slash Commands 作成メモ

✏️ 編集

Slack の Slash Commands を作成した際に色々つまづいたのでメモに残す。

今回のゴール

  • /echoecho と返すスラッシュコマンドを作成する
  • /hogehoge と返すスラッシュコマンドを作成する

ngrok のセットアップ

ダウンロードページの URL : https://ngrok.com/download

アカウントを作成せずに利用していたが、次のエラーが出たのでアカウントを作成した:

1
2
3
4
ERR_NGROK_6022
Before you can serve HTML content, you must sign up for an ngrok account and install your authtoken.

https://ngrok.com/docs/errors/err_ngrok_6022/

次のコマンドで ngrok を起動させる(今回は 3000 番ポートを使うことにする):

1
$ ngrok http 3000

各種ファイルの作成

.env.sample :

1
2
3
4
WORKING_DIR=/usr/src/app
OPENAI_API_KEY=# Your OpenAI API key
SLACK_BOT_TOKEN=# OAuth & Permissions > OAuth Tokens for Your Workspace > Bot User OAuth Access Token
SLACK_SIGNING_SECRET=# Basic Information > App Credentials > Signing Secret

Dockerfile :

1
2
3
4
5
6
7
8
FROM python:3.10

COPY requirements.txt ${WORKING_DIR}/

RUN apt-get update && apt-get upgrade -y

RUN pip install --upgrade pip && \
    pip install -r requirements.txt

docker-compose.yml :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: "3.7"

services:
  app:
    build: .
    env_file:
      - .env
    volumes:
      - .:$WORKING_DIR
    working_dir: $WORKING_DIR
    tty: true
    ports:
      - 3000:3000

requirements.txt :

1
slack_bolt==1.18.1

main.py :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import os

from slack_bolt import App

app = App(
    signing_secret=os.environ["SLACK_SIGNING_SECRET"],
    token=os.environ["SLACK_BOT_TOKEN"]
)


@app.command("/echo")
def echo(ack, respond):
    ack()
    respond("echo")


@app.command("/hoge")
def hoge(ack, respond):
    ack()
    respond("hoge")


if __name__ == "__main__":
    app.start(port=3000)

実行コマンドは次のとおり:

1
2
3
4
$ docker-compose build
$ docker-compose up -d
$ docker exec -it <CONTAINER_ID> bash
[IN CONTAINER]# python main.py

Slack App 設定

App 作成

まずは普通に Slack App を作成。 App Display Name 、 Default username がデフォルトだと空欄になっており、これらを設定しないとワークスペースへインストールできないので、忘れず設定すること。

参考:

Slash Commands

1
2
3
4
5
6
7
8
9
slash_commands:
  - command: /echo
    url: https://xxxxxxxxxx.ngrok-free.app/slack/events
    description: echo
    should_escape: false
  - command: /hoge
    url: https://xxxxxxxxxx.ngrok-free.app/slack/events
    description: hoge
    should_escape: false

⚠️ url のエンドポイントは /echo/hoge ではなく一律 /slack/events (ここで無駄に時間を溶かしてしまった…)

参考: コマンドのリスニングと応答 - Slack | Bolt for Python

OAuth & Permissions

image

実際に動かしてみる

入力実行結果
imageimage
imageimage
Hugo で構築されています。
テーマ StackJimmy によって設計されています。