影视源(Spider)开发技能包 + 实战实验室。输入站点 URL,产出可交付的 TVBox 源: T4/Python、客户端裸类、drpy JS、WebHome 扩展/首页。
融合 7 个社区来源,全部内联、不依赖外部文件,并主动修正了来源之间的冲突。
spider-craft/ 技能包(可放进 AI 的 skills 目录直接加载)
├── SKILL.md 主文件:执行流程、模式选择、模块激活、契约、铁律、来源硬伤
├── modules/ 13 个按需加载的专项模块
├── validators/ gates.md(验证矩阵)+ static_check.py(静态门禁 v2.0)
├── schemas/ site_profile.json + spider_ir.json
├── tools/ analyze_site.py / probe_media.py / pow_solve.py
└── README.md
spider-lab/ 实战实验室(3 个可跑源 + 回归脚本)
├── lziapi_spider.py 量子资源 15.5 万资源 / 44 分类 / 搜索可用
├── suoniapi_spider.py 索鸟 14.5 万资源 / 61 分类 / 含「4K电影」838 条
├── libvio_spider.py LIBVIO MacCMS v10 + PoW 挑战 + 网盘资源
├── run_*.py 六接口回归脚本
├── stub/ 沙箱用 base.spider 桩
└── dist/ 打包好的源 + TVBox 订阅配置
# 1. 探测站点 → 得到防御等级 + 必载模块清单
python3 spider-craft/tools/analyze_site.py https://target.example
python3 spider-craft/tools/analyze_site.py https://target.example --json > profile.json
# 2. 按清单读模块,生成代码
# 3. 静态门禁(交付前必须全 PASS)
python3 spider-craft/validators/static_check.py my_spider.py --final # T4 模式
python3 spider-craft/validators/static_check.py my_spider.py --client # 客户端裸类
# 4. 真直链门禁 + 真实画质
python3 spider-craft/tools/probe_media.py "https://cdn.x/a.m3u8" --referer https://x/ --deep
# 5. PoW 挑战求解(仅限算法公开的开放挑战)
python3 spider-craft/tools/pow_solve.py --html challenge.html
# 6. 六接口回归
cd spider-lab && PYTHONPATH=./stub python3 run_gates.py| 工具 | 能力 | 实测证据 |
|---|---|---|
analyze_site.py |
43 项特征扫描 → 防御等级 0-4 → 模块推荐 | 真网络打 qq.com(112KB),命中 5 项特征,正确判定「现代站点」分支 |
probe_media.py |
真直链门禁 + HLS 逐级 + 画质解析 | 本地 HLS 服务器:主清单→子清单→AES key→ts 全绿;HTML 播放页正确拒绝 |
pow_solve.py |
hashcash PoW 求解 | libvio 实测:nonce=71017,0.19 秒,服务端签发通行证 |
static_check.py |
双模式 10 类检查 | 埋 7 个雷的样本全部命中;合规样本 PASS |
抽 12 条标着「4K」的电影,解析主清单 RESOLUTION:
美国往事国语4K → 1920x1036
花束般的恋爱4K → 1994x1080
疯狂的麦克斯4:狂暴之路4K → 2592x1080
源代码4K → 1920x1080
12/12 全是 1080p,最宽 2592,没有一条到 3840。
vod_remarks 里的「4K/蓝光/原画」是营销标签;BANDWIDTH 也不可信(实测有站点全返回 128)。
t=1 电影片(主分类)→ 1 条
t=6 动作片(子分类)→ 4951 条
不合并子分类,用户点「电影片」只能看到 1 部片。
合并时 pagecount/total 必须跟着取子分类聚合值,否则返回「1 条数据配 697 页」。
分享页 var main = "...index.m3u8?sign=xxx",实测带 sign / 不带 sign / 伪造 sign 全部 206。
不需要实时解析。
except Exception:
data = {}
self._cache[key] = data # ← 失败也缓存!搜索撞上 CF 挑战页 → {} 入缓存 → 之后同一 key 永久返回空。
症状「第一次跑为空,重跑又好了」,极难排查。现在 static_check.py 能自动拦。
default 只在 key 缺失时生效。key 存在但值为 None 时照样返回 None。
type_pid 有 0 / "0" / null / 缺失 四种形态。
某站搜索返回纯文本「暂不支持搜索」。要诚实返回空并记录能力标记,
不伪造、不重试、不把 {} 当数据。
| 量子资源 | 索鸟 | LIBVIO | |
|---|---|---|---|
| 资源量 | 155,602 | 144,847 | — |
| 分类 | 44 | 61(含 4K电影 838 条) | 5 |
| 搜索 | ✅ 可用 | ❌ 站点不支持 | ❌ 404 |
type_pid |
"0" |
null |
— |
| 播放 | 直链 + HTML 分享页 | 直链 | 网盘(夸克/迅雷) |
| 防御 | 无 | 无 | PoW 挑战 + 通行证 |
libvio.pw 用 CDN 自研的 Proof-of-Work 挑战:
裸请求 → 403 + x-cdn-challenge: required
挑战页 → sha256(SIG + nonce) 以 DIFF 开头(DIFF="0000",16 bit)
解出后 → 写 cookie __cdn_pow=TS_MODE_nonce_SIG
服务端验证 → 签发 __cdn_verified(Max-Age=1800)
为什么这是可做的:页面自己声明「验证由浏览器完成一次工作量证明」, 算法在源码里完整可读,没有指纹采集、没有行为特征、没有人机判别, 对所有人一视同仁。
与验证码的区别(决定做不做):
| PoW 挑战 | 图形验证码 / Turnstile | |
|---|---|---|
| 算法 | 页面公开可见 | 隐藏 / 依赖人机识别 |
| 门槛 | 纯算力 | 指纹 / 行为 / 人工 |
| 能否程序化 | ✅ | ❌ 不做,直接报告阻塞 |
本仓库不含验证码识别、Cloudflare clearance 收割、指纹伪装、登录/付费墙绕过。
- 只解析公开可访问的页面和接口,不做鉴权绕过。
- 付费/锁定内容跳过并报告,不伪造播放地址。
- 不硬编码他人账号 Cookie / Token;仓库里的凭据一律走环境变量或配置注入。
- 影视版权归制作方与发行方,本项目仅供技术学习,请支持正版。
MIT(见 LICENSE)。使用前请自行确认目标站点的服务条款与当地法律。