😃

SlackBoltを使ったファイルアップロード

に公開

基本情報

ページの対象者

SlackBoltをまだ使い始めた人向け。
SlackBoltを使用してファイルをSlackにアップロードするサンプルを提供する。

どの様なことに繋げられるか?

SlackBotがそのファイルをダウンロードしてS3へ配置したり、ファイル自体に対して何かしらの処理をすることに繋げられる。

コード

使い方

以下の環境変数に対して適当な値を入力すること。
※あらかじめSlackのApp側の設定がされていること

  • SLACK_BOT_TOKEN
  • SLACK_APP_TOKEN
  1. python3 {file}
  2. Appに対してコマンド「maki-test」を実行。

コード全般

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


logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s")

# 環境変数 SLACK_BOT_TOKEN / SLACK_APP_TOKEN を設定しておく
SLACK_BOT_TOKEN = os.environ["SLACK_BOT_TOKEN"]  # xoxb-...
SLACK_APP_TOKEN = os.environ["SLACK_APP_TOKEN"]  # xapp-...

app = App(token=SLACK_BOT_TOKEN)

# ✅ コマンドでモーダルを開く例
@app.command("/maki-test")
def open_modal(ack, body, client):
    ack()
    client.views_open(
        trigger_id=body["trigger_id"],
        view={
            "type": "modal",
            "callback_id": "file_upload_view",
            "title": {"type": "plain_text", "text": "File Uploader"},
            "submit": {"type": "plain_text", "text": "Submit"},
            "blocks": [
                {
                    "type": "input",
                    "block_id": "file_upload_block",
                    "label": {"type": "plain_text", "text": "Upload your image"},
                    "element": {
                        "type": "file_input",
                        "action_id": "file_upload_action",
                        "filetypes": ["csv", "png", "jpg"],
                        "max_files": 2
                    }
                }
            ]
        }
    )

# ✅ モーダルが送信されたときの処理
@app.view("file_upload_view")
def handle_file_submission(ack, body, logger):
    ack()
    files = body["view"]["state"]["values"]["file_upload_block"]["file_upload_action"]["files"]
    for f in files:
        logger.info(f"Received file: {f['name']} (ID: {f['id']})")

    # ここで Slack Files API を使ってファイルをダウンロードしたり処理したりできる

if __name__ == "__main__":
    SocketModeHandler(app, SLACK_APP_TOKEN).start()

実行イメージ

以下の様なモーダルが表示されるのであとは従来通り。

参考

Discussion