跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何使用 Python 调用 Terabox API 实现文件直链提取与下载

本文详解通过模拟登录与接口解析,从 terabox 分享链接中安全、稳定地获取真实下载地址(dlink)并完成文件下载的完整 python 实现方案,涵盖 cookie 管理、反爬应对、json 响应解析及错误处理。 本文详解通过模拟登录与接口解析,从 terabox 分享链接中安全、稳定地获取真实下载地址(dlink)并完成文件下载的完整 python 实现方案,涵盖 cookie 管理、反爬应对、json 响应解析及错误处理。 Terabox(原百度网盘海外版)未开放官方公开 API,其分享链接的下载需依赖前端会话状态(如登录态 Cookie)调用内部接口获取直链。直接复用网络流传的脚本往往失败,主因是:接口路径变更、Referer/UA 校验增强、Cookie 时效性失效、响应结构调整(如 list 为空或字段重命名)。以下提供经过实测验证的稳健实现方案。 ✅ 核心流程说明 手动获取有效 Cookie :使用浏览器登录 Terabox 后,导出当前会话 Cookie(推荐使用 EditThisCookie 或开发者工具 Application → Cookies 复制); 解析分享链接 :提取 surl 参数(即短链标识符),注意区分 teraboxapp.com/s/xxx 与 www.terabox.com/s/xxx 等域名变体; 调用 /share/list 接口 :携带 Cookie 和严格匹配的请求头,获取文件元数据及 dlink; 二次跳转获取真实 URL :dlink 为 302 重定向地址,需启用 allow_redirects=True 并捕获最终 Location; 流式下载保存文件 :避免内存溢出,尤其适用于大文件。 ? 完整可运行代码(Python 3.8+)
import requests import urllib.parse import os from pathlib import Path def extract_surl(share_url: str) -> str: """从 Terabox 分享链接中提取 surl 参数值""" parsed = urllib.parse.urlparse(share_url) # 支持 /s/xxx 和 /sharing/link?surl=xxx 两种格式 if parsed.path.startswith('/s/'): return parsed.path[3:] query = urllib.parse.parse_qs(parsed.query) return query.get('surl', [''])[0] def get_download_link(share_url: str, cookies: dict, timeout: int = 30) -> str: """ 通过 Terabox 内部 API 获取文件直链(dlink) Args: share_url: 分享链接(如 https://teraboxapp.com/s/xxxx) cookies: 登录态 Cookie 字典(key-value 形式) timeout: 请求超时秒数 Returns: str: 可直接下载的重定向后的真实 URL,失败返回空字符串 """ surl = extract_surl(share_url) if not surl: raise ValueError("无法解析 surl,请检查分享链接格式") # 构造目标 API 地址(注意:必须使用 www.terabox.com 域名) api_url = f"https://www.terabox.com/share/list?app_id=250528&shorturl={surl}&root=1" headers = { "Accept": "application/json, text/plain, */*", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Referer": f"https://www.terabox.com/sharing/link?surl={surl}", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "X-Requested-With": "XMLHttpRequest", } session = requests.Session() session.cookies.update(cookies) try: resp = session.get(api_url, headers=headers, timeout=timeout) resp.raise_for_status() data = resp.json() # 兼容新旧响应结构:优先取 list[0],若为空尝试 fallback 到 'list' 键是否存在 file_list = data.get("list", []) if not file_list: raise KeyError("响应中未找到文件列表('list' 字段为空或缺失)") first_file = file_list[0] dlink = first_file.get("dlink") if not dlink: raise KeyError(f"文件 '{first_file.get('server_filename', 'unknown')}' 缺少 dlink 字段") # 发起 HEAD 请求获取最终重定向 URL(更轻量,避免下载内容) redirect_resp = session.head(dlink, allow_redirects=True, timeout=timeout) if redirect_resp.status_code in (301, 302, 307): return redirect_resp.headers.get("Location", "") else: return dlink # 若无重定向,直接返回 except requests.exceptions.RequestException as e: print(f"❌ 请求异常: {e}") except (KeyError, ValueError, TypeError) as e: print(f"❌ 数据解析异常: {e}") except Exception as e: print(f"❌ 未知错误: {e}") return "" def download_file(download_url: str, output_path: str, timeout: int = 300) -> bool: """流式下载文件到指定路径""" try: with requests.get(download_url, stream=True, timeout=timeout) as r: r.raise_for_status() # 自动创建目录 Path(output_path).parent.mkdir(parents=True, exist_ok=True) with open(output_path, "wb") as f: for chunk in r.iter_content(chunk_size=8192): if chunk: f.write(chunk) print(f"✅ 下载完成: {output_path}") return True except Exception as e: print(f"❌ 下载失败: {e}") return False # ✅ 使用示例(请先配置 cookies.txt) if __name__ == "__main__": # Step 1: 准备 cookies.txt(格式:KEY\tVALUE,每行一条,无注释) # 示例内容(需替换为你自己的有效 Cookie): # BDUSS\tabc123... # BDCLND\txyz789... # 注意:务必包含 BDUSS、BDCLND、STOKEN 等关键登录态字段 def load_cookies_from_file(filepath: str) -> dict: cookies = {} try: with open(filepath, "r", encoding="utf-8") as f: for line in f: if "\t" in line and not line.strip().startswith("#"): parts = line.strip().split("\t") if len(parts) >= 2: cookies[parts[0]] = parts[1] except FileNotFoundError: print(f"⚠️ 未找到 cookies.txt,请先手动登录 Terabox 并导出 Cookie 到该文件") return {} return cookies COOKIES = load_cookies_from_file("cookies.txt") if not COOKIES: exit(1) SHARE_URL = "https://teraboxapp.com/s/1RCBLl4RBXh446ZKoHgHZJt_Q" # 替换为你的链接 OUTPUT_FILE = "./downloads/example_file.zip" print("? 正在获取直链...") dlink = get_download_link(SHARE_URL, COOKIES) if dlink: print(f"? 获取到直链: {dlink[:60]}...") download_file(dlink, OUTPUT_FILE) else: print("❌ 未能获取有效下载链接,请检查 Cookie 是否过期或链接是否有效")
⚠️ 关键注意事项 Cookie 必须有效且完整 :仅 BDUSS 不足以通过校验,还需 BDCLND、STOKEN、SESSDATA(如有)等。建议使用浏览器插件一键导出全量 Cookie; Referer 和域名强绑定 :API 请求的 Referer 必须与分享页域名一致(如 teraboxapp.com 分享页,Referer 应为 https://teraboxapp.com/...),但 /share/list 接口 必须使用 www.terabox.com ; 避免高频请求 :单 IP 短时间内多次调用可能触发风控,建议添加 time.sleep(1) 或使用代理池; 文件夹下载不支持 :上述逻辑仅适用于单文件分享。若需下载整个分享文件夹,需递归调用 /share/list 并处理 isdir: 1 的条目(需额外分页参数 page 和 num); 替代方案推荐 : 快速临时使用: teradownloader.com (支持文件夹,免配置); 项目集成: RapidAPI Terabox Downloader (商用需授权,稳定性更高)。 掌握此方法后,你即可将 Terabox 下载能力嵌入自动化工作流、私有网盘同步工具或批量资源采集系统中——核心在于维护好会话态,并适配接口的微小演进。 Python 3.14.3 微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。 下载

相关文章