You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Slack Bolt Python API下载文件?Socket模式下问题求助

解决Slack Bolt Python(Socket模式)处理文件上传事件并获取下载URL的问题

问题根源

Slack用户上传文件时触发的是type: message且subtype: file_share的复合事件,并非独立的file_share事件,因此直接用@app.event("file_share")无法捕获到目标事件。

修正后的可运行代码

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import requests
from pathlib import Path

# 替换为你的实际Token
app = App(token="YOUR_SLACK_BOT_TOKEN")

@app.event("message")
def handle_file_share_events(body, client, logger):
    event = body.get("event")
    # 精准过滤文件分享类型的消息事件
    if event.get("subtype") == "file_share":
        # 从files数组中提取文件ID(单文件上传取第一个元素)
        file_id = event.get("files")[0].get("id")
        try:
            # 单次调用获取文件完整信息
            file_info = client.files_info(file=file_id).get("file")
            private_url = file_info.get("url_private")
            file_name = file_info.get("title")
            
            # 使用Bot Token授权下载文件
            download_resp = requests.get(
                private_url,
                headers={"Authorization": f"Bearer {app.token}"}
            )
            download_resp.raise_for_status()  # 捕获HTTP请求错误
            
            # 写入本地文件
            save_path = Path(file_name)
            save_path.write_bytes(download_resp.content)
            logger.info(f"文件 {file_name} 已成功保存")
        except Exception as e:
            logger.error(f"处理文件时出错: {str(e)}")

if __name__ == "__main__":
    # 替换为你的App Level Token
    SocketModeHandler(app, "YOUR_SLACK_APP_LEVEL_TOKEN").start()

关键修正说明

  • 事件监听逻辑:监听message事件后,通过subtype == "file_share"筛选目标事件,符合Slack事件结构规范。
  • 数据结构修正:file_share事件的文件数据存储在files数组中,而非单个file字段,需从数组取值。
  • 优化API调用:仅调用一次files_info接口获取文件详情,避免重复请求。
  • 移除冗余操作:message事件不属于需要确认的交互事件,无需调用ack()。
  • 权限要求:确保Bot Token已开启files:read权限,否则无法获取文件详情和下载链接。

内容的提问来源于stack exchange,提问作者Bruce Banner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:09:54