如何使用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
相关产品推荐
相关产品推荐

