0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

概要

BoltとPythonを使ってSlack Appをローカル上で実行する方法について解説します

前提

  • Pythonを使用
  • Docker、docker-compose.ymlを使用
  • Poetryを使用
  • Slackのワークスペースを作成済み

ディレクトリ構成

tree
.
├── .env
├── .gitignore
├── Makefile
├── README.md
├── application
│   ├── app.py
│   ├── poetry.lock
│   └── pyproject.toml
├── containers
│   └── python
│       └── Dockerfile
└── docker-compose.yml

Slack Appの作成

SlackのAppを以下のリンクから作成します

スクリーンショット 2024-06-16 12.05.00.png

以下が管理画面です
スクリーンショット 2024-06-16 12.06.49.png

左のOAuth&PermissionsからBot Token Scopesへ移動し、Add an OAuth Scopeを押します
スクリーンショット 2024-06-16 12.17.00.png

メッセージを送信したいのでchat:writeを選択します
スクリーンショット 2024-06-16 12.17.57.png

Install to Workspaceを押します
スクリーンショット 2024-06-16 12.19.25.png

許可する、を選択します
スクリーンショット 2024-06-16 12.19.54.png

Bot User OAuth Tokenが表示されます
後ほど使用します
スクリーンショット 2024-06-16 12.20.24.png

Basic Informationのページまで戻り、アプリトークンのセクションまで下にスクロールしGenerate Token and Scopesをクリックしてアプリレベルトークンを作成します
スクリーンショット 2024-06-16 12.41.56.png

Generateを押します
スクリーンショット 2024-06-16 12.43.09.png

トークンが作成されたら成功です
スクリーンショット 2024-06-16 12.43.49.png

ソケットモードを有効にします
スライダーを右にスライドします

スクリーンショット 2024-06-16 12.45.07.png

Event Subscriptionsを有効にします
スクリーンショット 2024-06-16 12.47.49.png

Bot Eventを追加します
今回は

  • message.channels
  • message.groups
  • message.im
  • message.mpim

を選択します

スクリーンショット 2024-06-16 12.51.25.png

また、インタラクティブ機能を有効にすると、ボタン、選択メニュー、日付ピッカー、モーダル、ショートカットなどの機能が利用できるようになります
アプリ設定ページの「Interactivity & Shortcuts」にアクセスしてください

スクリーンショット 2024-06-16 13.06.18.png

Slack App側の設定は以上です

環境構築

Python用のDockerfileを作成します

FROM python:3.12.3

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /code
COPY application/pyproject.toml /code/
# Initialize python project with Poetry
RUN pip install --upgrade pip && pip install poetry
RUN poetry install

Dockerfileを簡単に起動できるようdocker-composeを作成します

docker-compose.yml
services:
  app:
    container_name: app
    build:
      context: .
      dockerfile: containers/python/Dockerfile
    volumes:
      - ./application:/code
    ports:
      - "8000:8000"
    command: poetry run python app.py
    env_file:
      - .env

PoetryでPythonのパッケージを管理したいのでpyproject.tomlを作成します
Slack Appを使用する際はslack-boltが必須なので追加します

application/pyproject.toml
[tool.poetry]
name = "slack-workflow-practice"
version = "0.1.0"
description = ""
authors = ["shun198"]
readme = "README.md"

[tool.poetry.dependencies]
python = "3.12.3"
slack-bolt = "^1.19.0"

[tool.poetry.group.dev.dependencies]
black = "^24.0.0"
isort = "^5.11.4"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

[tool.isort]
line_length = 79
profile = "black"

[tool.black]
line-length = 79
include = '\.py$'
exclude = '''
(
  /(
      \.eggs         # exclude a few common directories in the
    | \.git          # root of the project
    | \.hg
    | \.mypy_cache
    | \.tox
    | \.venv
    | _build
    | buck-out
    | build
    | dist
  )/
)
'''

今回はパブリックチャンネルにhelloというメッセージを送ったらHey there というメッセージがアプリから送られ、 Click Meというボタンが表示され、Click Meを押した後にメンションされた状態でclicked the buttonというメッセージをAppが送信するAppを作成します

app.py
import os

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

# ボットトークンと署名シークレットを使ってアプリを初期化します
app = App(token=os.environ.get("SLACK_BOT_TOKEN"))

# 'hello' を含むメッセージをリッスンします
@app.message("hello")
def message_hello(message, say):
    # イベントがトリガーされたチャンネルへ say() でメッセージを送信します
    say(
        blocks=[
            {
                "type": "section",
                "text": {"type": "mrkdwn", "text": f"Hey there <@{message['user']}>!"},
                "accessory": {
                    "type": "button",
                    "text": {"type": "plain_text", "text":"Click Me"},
                    "action_id": "button_click"
                }
            }
        ],
        text=f"Hey there <@{message['user']}>!"
    )

@app.action("button_click")
def action_button_click(body, ack, say):
    # アクションを確認したことを即時で応答します
    ack()
    # チャンネルにメッセージを投稿します
    say(f"<@{body['user']['id']}> clicked the button")

# アプリを起動します
if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()

Appの検証

作成したチャンネルにAppsを追加します
スクリーンショット 2024-06-16 12.58.26.png

スクリーンショット 2024-06-16 12.58.54.png

以下のようにhelloとメッセージを送り、Hey there というメッセージがアプリから送られ、Click Meというボタンが表示されます
Click Meを押した後にメンションされた状態でclicked the buttonというメッセージをAppが送信したら成功です

スクリーンショット 2024-06-16 13.20.29.png

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?