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

冬静酱_8555

冬静酱_8555

2026-03-25

284人浏览

原创

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

本文详解通过模拟登录与接口解析,从 terabox 分享链接中安全、稳定地获取真实下载地址(dlink)并完成文件下载的完整 python 实现方案,涵盖 cookie 管理、反爬应对、json 响应解析及错误处理。

本文详解通过模拟登录与接口解析,从 terabox 分享链接中安全、稳定地获取真实下载地址(dlink)并完成文件下载的完整 python 实现方案,涵盖 cookie 管理、反爬应对、json 响应解析及错误处理。

Terabox(原百度网盘海外版)未开放官方公开 API,其分享链接的下载需依赖前端会话状态(如登录态 Cookie)调用内部接口获取直链。直接复用网络流传的脚本往往失败,主因是:接口路径变更、Referer/UA 校验增强、Cookie 时效性失效、响应结构调整(如 list 为空或字段重命名)。以下提供经过实测验证的稳健实现方案。

✅ 核心流程说明

  1. 手动获取有效 Cookie:使用浏览器登录 Terabox 后,导出当前会话 Cookie(推荐使用 EditThisCookie 或开发者工具 Application → Cookies 复制);
  2. 解析分享链接:提取 surl 参数(即短链标识符),注意区分 teraboxapp.com/s/xxx 与 www.terabox.com/s/xxx 等域名变体;
  3. 调用 /share/list 接口:携带 Cookie 和严格匹配的请求头,获取文件元数据及 dlink;
  4. 二次跳转获取真实 URL:dlink 为 302 重定向地址,需启用 allow_redirects=True 并捕获最终 Location;
  5. 流式下载保存文件:避免内存溢出,尤其适用于大文件。

? 完整可运行代码(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);
  • 替代方案推荐:

掌握此方法后,你即可将 Terabox 下载能力嵌入自动化工作流、私有网盘同步工具或批量资源采集系统中——核心在于维护好会话态,并适配接口的微小演进。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1831

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4904

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29317

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3507

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3507

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2723

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习