😃
SlackBoltを使ったファイルアップロード
基本情報
ページの対象者
SlackBoltをまだ使い始めた人向け。
SlackBoltを使用してファイルをSlackにアップロードするサンプルを提供する。
どの様なことに繋げられるか?
SlackBotがそのファイルをダウンロードしてS3へ配置したり、ファイル自体に対して何かしらの処理をすることに繋げられる。
コード
使い方
以下の環境変数に対して適当な値を入力すること。
※あらかじめSlackのApp側の設定がされていること
- SLACK_BOT_TOKEN
- SLACK_APP_TOKEN
-
python3{file} - 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