
本文详解通过模拟登录与接口解析,从 terabox 分享链接中安全、稳定地获取真实下载地址(dlink)并完成文件下载的完整 python 实现方案,涵盖 cookie 管理、反爬应对、json 响应解析及错误处理。
本文详解通过模拟登录与接口解析,从 terabox 分享链接中安全、稳定地获取真实下载地址(dlink)并完成文件下载的完整 python 实现方案,涵盖 cookie 管理、反爬应对、json 响应解析及错误处理。
Terabox(原百度网盘海外版)未开放官方公开 API,其分享链接的下载需依赖前端会话状态(如登录态 Cookie)调用内部接口获取直链。直接复用网络流传的脚本往往失败,主因是:接口路径变更、Referer/UA 校验增强、Cookie 时效性失效、响应结构调整(如 list 为空或字段重命名)。以下提供经过实测验证的稳健实现方案。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
✅ 核心流程说明
- 手动获取有效 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 下载能力嵌入自动化工作流、私有网盘同步工具或批量资源采集系统中——核心在于维护好会话态,并适配接口的微小演进。

















