1实现原理 · 为什么它能做到
核心是把『一次 view/detail API 调用 + jq 规整』封装成单一 JSON:输入先归一化成 bvid/aid query 参数,再从 api.bilibili.com 取回并映射出 title/up/tags/stat/pages。
json=$(bili_curl "https://api.bilibili.com/x/web-interface/view/detail?$q")
网络韧性封装:请求时剥掉本机代理 env(B 站是国内服务,本地 forward proxy 会弄挂请求)、带浏览器 UA + Referer 规避偶发 HTTP 412、失败重试退避。
curl -fsSL --max-time 20 --retry 3 --retry-delay 1 --retry-all-errors -H "User-Agent: $UA" -H "Referer: https://www.bilibili.com"
弹幕脚本复用 fetch 解析出该 P 的 cid,再请求 dm/list.so 并做 raw-DEFLATE 解压、抽取每条 <d> 文本。
xml=$(bili_curl "https://api.bilibili.com/x/v1/dm/list.so?oid=$cid" | python3 -c "import sys,zlib; sys.stdout.buffer.write(zlib.decompress(sys.stdin.buffer.read(), -15))")
字幕轨道强制走登录态:脚本用 yt-dlp 读取用户浏览器 cookie 拉取 ai-zh 等字幕轨;skill 明示『无免登录路径,不要尝试绕过』并要求先问用户。
yt-dlp --skip-download --write-subs --sub-langs "ai-zh,zh-Hans,zh-CN,zh" --user-agent "$UA" --add-header "Referer:https://www.bilibili.com" --cookies-from-browser "$browser"
数据诚实纪律内建于工作流:指标必须带 fetched_at 时间戳,取不到就写『未获取/未核实』而非估计,防止知识库被手打数字污染。
**Live metrics → always cite `fetched_at`.** … A bare "12,000 views" with no timestamp is meaningless and silently goes stale.
面向第三方 API 漂移的健康检查:bili-selftest.sh 用固定公开 fixture 逐一断言每个能力与登录门不变式,漂移以 PASS/FAIL 行呈现。
It asserts SHAPE (fields exist, right types) and documented INVARIANTS — never exact values, since engagement numbers drift by design.
2核心能力
3外部依赖
| Kind | Dependency / Endpoint |
|---|---|
| cli | curl |
| cli | jq |
| cli | python3 |
| cli | yt-dlp |
| network | api.bilibili.com |
| network | b23.tv(短链展开,单跳 302) |
4管控建议与判定依据
- 本地凭据 / 浏览器配置: 读取用户登录 Cookie/会话/密钥环: bili-subs.sh 经 yt-dlp --cookies-from-browser "$browser"(chrome/firefox/safa
- scripts/: 执行本地脚本或命令: bilibili-source/scripts/bili-fetch.sh
- 网络端点: 声明外部网络访问: https://api.bilibili.com/x/web-interface/view/detail(fetch)
- 本地工作目录: 文件读写与工件输出: bili-subs.sh 把字幕文件写入当前目录:<id>.<lang>.<ext>(json3/srt)
5第二遍独立确认
- [ok] fetch/danmaku 免登录(无凭证接触) — grep 复核三脚本无 Cookie/Authorization/SESSDATA 使用;bili_curl 只带 UA+Referer。
- [ok] bili-subs.sh 读浏览器 cookie 且有 ask-first — --cookies-from-browser 实参存在;脚本头『Because it reads the user's logged-in session, ASK THE USER before running it.』存在。
- [ok] 网络外发仅限 Bilibili 系域名 — 逐脚本重读:view/detail、dm/list.so、player/wbi/v2、fav/folder/created/list-all 均在 api.bilibili.com;短链 b23.tv;yt-dlp 目标为 bilibili.com 视频 URL。
- [ok] raw-deflate 弹幕解压机制成立 — list.so 返回经 python3 zlib.decompress(..., -15)(window bits -15),与脚本注释『headerless raw DEFLATE』一致。
- [ok] WBI 签名只在 reference(space/wbi/*)不在这批脚本里 — 脚本中 wbi 仅出现在 x/player/wbi/v2 端点名(登录门检测),无签名实现;reference 目录 TOC 标注 WBI 仅 space/wbi/* 需要。
- [ok] 功能声明 vs 实际能力相符 — 『fetch real, verifiable data…never hand-type or estimate』由 fetched_at+NO FABRICATION+脚本落地;未发现夸大或无法定位的承诺。
- [ok] 注入面(输入归一化) — BV 正则锚定 10 字符长度防过捕;aid 分支取纯数字;两者进入 query 而非 shell 求值。
- [ok] 元数据(license/stars/commit) — 仓库级 MIT、stars=1385、pushed_at=2026-09-09T12:33:29Z;本地 HEAD==pin d5c4678cb5d4fd6acc9c922690df035dbd33d247。
6结论
0274158c3549e867…