海量接口搬运备份站
一个基于 GitHub Actions 自动化 + Cloudflare Pages 静态托管的 TVBox 接口搬运备份项目。三套脚本每日定时抓取、解析、聚合各类 TVBox 接口与直播源,产物自动提交回仓库,前端页面实时读取展示,支持一键复制、搜索、多域名备份。
目录
· 项目简介 · 在线访问 · 仓库结构 · 自动化工作流 · 三个脚本详解 · 脚本 A:ry下载器.py · 脚本 B:api下载器.py · 脚本 C:live下载器.py · 前端页面 · 配置文件说明 · 本地手动运行 · 部署到 Cloudflare Pages · 常见问题与避坑 · 配置修改速查 · 一键校验清单 · 声明
项目简介
本项目把互联网上公开的 TVBox 接口资源进行批量搬运、备份与聚合,通过 GitHub Actions 定时抓取并提交到仓库,再由 Cloudflare Pages 静态托管前端页面,实现:
· 接口备份:90+ 条点播接口,每条接口提供 1~5 个镜像线路,自动选通。 · 直播聚合:从所有点播接口的 lives 字段提取直播源,穿透套壳后生成播放列表。 · 下载资源:批量抓取本地包/下载资源,落到 ry/ 目录。 · 多域名备份:前端提供三个互为备份的访问域名,任一可用。 · 静态托管:纯前端页面,无需后端,部署简单,访问快。
在线访问
域名 用途 https://0.12yue.de5.net 主域名(备份一线) https://0.cdz.qzz.io 备份二线 https://0.wdzb.eu.cc 备份三线
三个域名指向同一份静态站点,互为备份。
仓库结构
tvbox-api-backup/
├── .github/
│ └── workflows/
│ ├── ry下载器.yml ⭐ 工作流A:每日解析 ry
│ ├── api下载器.yml ⭐ 工作流B:每两日抓取 tvbox 接口
│ └── live下载器.yml ⭐ 工作流C:每日聚合直播源
│
├── python/ ⭐ 脚本统一目录
│ ├── ry下载器.py ⭐ 脚本A
│ ├── api下载器.py ⭐ 脚本B
│ └── live下载器.py ⭐ 脚本C
│
├── rylinks.txt ⭐ 脚本A 配置(名称,URL,文本格式)
├── apilinks.txt ⭐ 脚本B 配置(新格式:名称,URL1,URL2,...)
├── api_list.json ⭐ 脚本B 老格式兜底(可选)
│
├── ry/ ← 脚本A 产物
├── tvbox/ ← 脚本B 产物
│ ├── *.json ← 各线路接口文件
│ ├── 海量直播线路.json ← 脚本C 聚合锚点
│ └── live/ ← 脚本C 播放列表输出
│ ├── xxx.m3u
│ └── xxx.txt
├── livelist.txt ← 脚本C 索引清单
├── list.txt ← 脚本B 接口清单
├── SUMMARY.txt ← 脚本B 运行摘要
│
├── config.json → 前端下载资源源配置
├── index.html → 前端主页面
├── style.css / js/ → 前端资源
└── README.md → 本文件
自动化工作流
三个工作流位于 .github/workflows/,推送到 main 分支后 GitHub 自动识别。三者共用 concurrency: tvbox-repo-write,串行执行,避免并发 push 冲突。
工作流 Cron(UTC) 北京时间 功能 产物 ry下载器.yml 0 17 * 每日 01:00 每日解析 ry ry/ api下载器.yml 5 16 每两日 00:05 每两日抓取接口(奇偶日 gate) tvbox/.json、list.txt、SUMMARY.txt live下载器.yml 0 18 * 每日 02:00 每日聚合直播源 tvbox/live/、livelist.txt、tvbox/海量直播线路.json
工作流特性
· 奇偶日 gate:api下载器.yml 只在 UTC 奇日运行,偶日自动跳过,实现"两日一更"。 · 手动触发:所有工作流支持 workflow_dispatch,可勾选 force 强制跳过日期判断,勾选 debug 输出详细日志。 · 依赖安装:pip install requests urllib3。 · 提交产物:git pull --rebase --autostash → git add → git commit → git push,只用 git add 明确指定目录,绝不 git add -A。
三个脚本详解
脚本 A:ry下载器.py
作用
批量下载「本地包/下载资源」类接口,解析 JSON,把结果落到 ry/ 目录。每次运行强制覆盖旧产物。
配置:rylinks.txt(仓库根,文本格式)
潇洒下载, https://9877.kstore.space/single.json
奇奇下载, http://bd.qiqiv.cn/666.json
菠菜园下载, https://0.12yue.de5.net/tvbox/x/lib/菠菜园下载.json
柒豪下载, https://raw.gitcode.com/qihao/qihaoyyds/raw/main/版本.json
语法规则:
· 每行一条,格式 名称, URL(英文逗号分隔,两边可有空格) · # 开头 = 注释 · 名称可省略,脚本自动取域名作文件名 · 支持 file://(本地)和 raw:base64(内联)用于调试
运行方式
python3 python/ry下载器.py
python3 python/ry下载器.py -c /path/to/other.txt # 指定配置
python3 python/ry下载器.py -l "URL" --name 测试 # 单链接调试
脚本 B:api下载器.py
作用
抓取 TVBox 的「接口线路」(饭太硬、嗷呜、肥猫 等 90+ 线路),每个接口可带多镜像(同一行多个 URL),自动选通,生成 tvbox/*.json + list.txt + SUMMARY.txt。
配置加载优先级
脚本按以下顺序查找配置,找到即用:
优先级 入口 格式 说明 1 --config <路径> 按扩展名判断 .json 走老格式,其余走新 txt 2 apilinks.txt 新 txt 列表 优先,存在即用 3 api_list.json 老 JSON 兜底,新文件不存在时才用 4 api_list.py Python 模块 最老式兜底
新格式:apilinks.txt(仓库根,推荐)
每行一条接口,名称,URL1,URL2,...,多 URL 用逗号分隔,# 开头为注释。
# 单 URL
更新专用接口, https://0.12yue.de5.net/tvbox/更新专用接口.json
菠菜pro, https://0.12yue.de5.net/5/x4pro.json
多 URL(同一名称多个镜像,脚本会自动分组去重)
饭太硬, http://www.饭太硬.net/tv, http://www.饭太硬.art/tv, http://fty.xxooo.cf/tv, http://fty.888484.xyz/tv, http://fty.333232.xyz/tv
嗷呜, http://www.英格里希嗷呜.top/tv, https://9763.kstore.vip/aowu.json, http://itv666.cc/aowu/config.webp
潇洒, https://9877.kstore.space/single.json, https://9877.kstore.space/AnotherD/api.json, https://9877.kstore.space/one.json, https://9877.kstore.space/ONE/one.json
规则:
· 第一个字段是名称,后面全部是 URL · URL 数量不限,1 个或多个都行 · 空行、# 开头的行会被忽略
老格式:api_list.json(兜底)
新文件不存在时才会读它,格式与原来完全一致:
{
"API_LIST": [
["更新专用接口", "https://0.12yue.de5.net/tvbox/更新专用接口.json"],
["菠菜pro", "https://0.12yue.de5.net/5/x4pro.json"]
],
"API_MIRRORS": {
"饭太硬": [
"http://www.饭太硬.net/tv",
"http://www.饭太硬.art/tv"
]
}
}
运行方式
python3 python/api下载器.py
python3 python/api下载器.py --debug
python3 python/api下载器.py --check-config
python3 python/api下载器.py --config my_links.txt
python3 python/api下载器.py --config my_api_list.json
脚本 C:live下载器.py
作用
从 TVBox 接口 JSON(tvbox/*.json)的 lives 数组中批量提取直播源,模拟 TVBox 客户端环境下载播放列表(自动穿透套壳),生成 tvbox/live/ 下的播放列表文件,维护 livelist.txt 索引。
核心原则:对外文件名锚定原始条目(不受套壳跳转影响),保证外部访问路径长期稳定。
运行流程
- 扫描提取:遍历 tvbox/*.json → 读取 lives → 提取有 name 且有 url 的条目(URL 去重)
- 聚合命名:名称冲突自动编号 xxx → xxx2线 → xxx3线,写入 tvbox/海量直播线路.json 锚点
- 批量下载:模拟 TVBox 请求,套壳检测(最多递归 5 层),写出播放列表
- 生成索引:更新 livelist.txt(旧记录保留,成功记录覆盖)
python3 python/live下载器.py
python3 python/live下载器.py --debug
python3 python/live下载器.py --force
前端页面
前端为纯静态页面,位于仓库根目录(index.html、style.css、js/、config.json),部署在 Cloudflare Pages。
页面结构
页面顶部提供模式切换按钮,右上角是搜索框,下方是导航标签(点播 / 直播 / 下载 / 关于),主体区根据标签展示对应面板。
- 点播面板
· 原始线路:接口的原生 URL · 备份一线 / 备份二线 / 备份三线:基于三个备份域名拼出的 URL
每条 URL 右侧提供「复制」按钮,一键复制到剪贴板。
- 直播面板
下方读取 livelist.txt,每条直播源展示:
· 来源、UA 信息 · 原始线路 · 备份一线 / 二线 / 三线
- 下载面板
- 关于面板
模式切换
模式 说明 简洁模式(默认) 只显示点播面板,隐藏导航标签与直播/下载/关于面板,搜索框置于顶部 全能模式 显示完整导航标签与所有面板,搜索框置于标签下方
模式选择保存在 localStorage,刷新后保持。
搜索功能
搜索框对所有面板生效,按接口/直播/下载卡片的 data-name 做模糊匹配,实时过滤。
复制功能
全局事件委托,所有 .copy-btn 点击后复制 data-url,优先使用 navigator.clipboard,降级到 execCommand('copy'),复制成功后按钮变绿显示「✅ 已复制」。
配置文件说明
文件 位置 格式 归属 说明 rylinks.txt 仓库根 文本 名称, URL 脚本A ry 下载源 apilinks.txt 仓库根 文本 名称,URL1,URL2,... 脚本B 接口列表(新格式,优先) api_list.json 仓库根 JSON 脚本B 接口列表(老格式,兜底) config.json 仓库根 JSON 前端 下载资源源配置
config.json 示例
{
"downloadSources": [
{
"name": "应用市场",
"description": "TVBox 应用合集",
"url": "https://cdn.jsdelivr.net/gh/SimonWang911/simonwangsub@main/appupdate/appupdate.json"
}
]
}
本地手动运行
# Step 1: 克隆并进入仓库根
git clone https://github.com/lubin776/tvbox-api-backup.git
cd tvbox-api-backup
Step 2: 安装依赖
pip3 install -r requirements.txt
Step 3-5: 依次运行三个脚本
python3 python/ry下载器.py --debug
python3 python/api下载器.py --debug
python3 python/live下载器.py --debug
Step 6: 验证并提交
ls ry/ tvbox/ tvbox/live/ list.txt SUMMARY.txt livelist.txt
git add . && git commit -m "test: 本地验证" && git push
注意:脚本靠 CWD = 仓库根 定位配置和产物,务必在仓库根执行。
部署到 Cloudflare Pages
- 登录 Cloudflare Dashboard,进入 Pages。
- 创建项目,关联 GitHub 仓库 lubin776/tvbox-api-backup。
- 构建设置:
- 保存并部署,Cloudflare 会分配一个 *.pages.dev 域名。
- 在 Custom domains 中绑定 0.12yue.de5.net、0.cdz.qzz.io、0.wdzb.eu.cc 三个域名。
- 每次 GitHub Actions 提交产物后,Cloudflare Pages 会自动重新部署(或配置 Webhook 触发)。
常见问题与避坑
现象 原因 解决 所有条目失败 网络不通 / UA 被封 加 --debug,检查 UA 池 套壳未展开 返回内容 URL > 1 条 正常行为,多条视为播放列表本身 文件名含特殊字符 净化规则未覆盖 检查 sanitize_stem() 正则 livelist 旧记录丢失 名称匹配失败 旧记录按 stem 匹配,大改名会丢失 Actions 页面看不到工作流 .yml 不在 .github/workflows/ 检查路径 requests ImportError 依赖未装 检查 pip install requests 步骤日志 读不到新配置 apilinks.txt 不在仓库根 确认路径与文件名拼写 YAML 缩进错误 缩进不一致 uses/run 与 name 同级对齐 并发 push 冲突 三工作流同时 push 共享锁 + git pull --rebase 产物互相覆盖 git add -A 误用 严格按协作矩阵 git add
配置修改速查
想做什么 改哪里 需重新部署 增删 ry 下载链接 编辑 rylinks.txt ❌ 自动生效 改 ry 超时/UA python/ry下载器.py 常量区 ✅ push 后 增删 tvbox 接口 编辑 apilinks.txt ❌ 自动生效 调整镜像 在 apilinks.txt 对应行追加 URL ❌ 自动生效 改调度时间 对应 .yml 的 cron ✅ push 后 改产物目录 脚本 OUTPUT_DIR + 工作流 git add ✅ push 后 改下载资源源 编辑 config.json ❌ 自动生效 改前端展示 编辑 index.html / style.css ✅ push 后
一键校验清单
# 在仓库根执行
echo "=== 1. 结构检查 ==="
ls .github/workflows/ry下载器.yml .github/workflows/api下载器.yml .github/workflows/live下载器.yml
ls python/ry下载器.py python/api下载器.py python/live下载器.py
ls rylinks.txt apilinks.txt config.json index.html
echo "=== 2. YAML 语法校验 ==="
python3 -c "import yaml; yaml.safe_load(open('.github/workflows/ry下载器.yml')); print('ry OK')"
python3 -c "import yaml; yaml.safe_load(open('.github/workflows/api下载器.yml')); print('api OK')"
python3 -c "import yaml; yaml.safe_load(open('.github/workflows/live下载器.yml')); print('live OK')"
echo "=== 3. 配置校验 ==="
python3 python/api下载器.py --check-config
echo "=== 4. 本地试跑 ==="
python3 python/ry下载器.py
python3 python/api下载器.py
python3 python/live下载器.py
ls ry/ tvbox/ tvbox/live/ list.txt SUMMARY.txt livelist.txt
全部通过 → 部署成功。
声明
本站接口资源由【误道者】整理。所有资源均来自互联网,版权归原作者所有。仅供测试学习使用,请勿用于违法及商业用途,请勿付费购买。如涉及侵权,请联系删除。
· QQ 交流群:1067685939 · Telegram 群组:https://t.me/tg6603
项目:海量接口搬运备份站 仓库:https://github.com/lubin776/tvbox-api-backup