使用Slack Webclient API下载音频文件时获取HTML而非音频的问题
问题分析与解决
你遇到的问题核心是:Slack的私有文件链接需要身份验证,直接用requests.get()请求时未携带认证信息,服务器返回的是登录页面的HTML;而浏览器因保存了登录Cookie,能正常访问音频文件。
解决方法
方法1:使用Slack官方WebClient的files_download方法(推荐)
这是Slack API提供的标准下载方式,自动处理认证逻辑,代码更简洁可靠:
from slack_sdk import WebClient from slack_sdk.errors import SlackApiError # 初始化WebClient,替换为你的Bot Token client = WebClient(token="xoxb-YOUR-BOT-TOKEN") @app.event("app_mention") def handle_starting_events(body, say, logger): if ('files' in body["event"]) and (body["event"]['files'][0]['mimetype'] == 'audio/webm'): file_id = body["event"]['files'][0]['id'] try: # 调用官方接口下载文件 response = client.files_download(file=file_id) # 保存文件,注意使用对应格式的后缀名 with open('audio_message.webm', 'wb') as f: f.write(response.body) say("音频文件已成功下载!") except SlackApiError as e: logger.error(f"下载失败: {e.response['error']}")
方法2:给requests请求添加认证头
如果坚持使用requests,需在请求头中携带Slack Token(Bot Token或User Token均可),格式为Authorization: Bearer <你的Token>:
import requests @app.event("app_mention") def handle_starting_events(body, say, logger): if ('files' in body["event"]) and (body["event"]['files'][0]['mimetype'] == 'audio/webm'): audiourl = body["event"]['files'][0]['url_private_download'] # 添加认证头,替换为你的Token headers = {"Authorization": "Bearer xoxb-YOUR-BOT-TOKEN"} response = requests.get(audiourl, headers=headers) if response.status_code == 200: # 保存为webm格式,避免后缀名混淆 with open('audio_message.webm', 'wb') as f: f.write(response.content) else: logger.error(f"请求失败,状态码: {response.status_code}")
额外提示:你代码中把音频文件保存为video.mp4,但实际是webm格式,建议修改为对应后缀名,避免播放时出现格式不兼容问题。
内容的提问来源于stack exchange,提问作者Digger
相关产品推荐
相关产品推荐

