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外部依赖
| 类型 | 依赖 |
|---|---|
| cli | curl |
| cli | jq |
| cli | python3 |
| cli | yt-dlp |
| network | api.bilibili.com |
| network | b23.tv(短链展开,单跳 302) |
4风险提醒 风险提醒:橙色 · 评估后使用
- 字幕路径接触本机浏览器 cookie — yt-dlp --cookies-from-browser 读取用户 Bilibili 登录会话并外发给 bilibili;skill 强制先问用户,但宿主/用户需知晓该接触面(含浏览器 cookie 库被第三方 CLI 读取)。
- 第三方 API 无契约漂移 — 字段改名/加 WBI 签名/风控收紧随时可能发生——selftest 能暴露但不能阻止;'Verified' 日期会过期。
- 轻度反风控头与批量面 — UA/Referer 规避 412 属轻量手段;批量/高频抓取仍可能触发限流或被要求 WBI;skill 定位是『取真实单条数据』而非批量采集器。
- 数据时效与误引用 — 指标分钟级漂移;不带 fetched_at 的数字会静默过期,下游文档若忽略时间戳仍会写出已失真引用。
- CJK 文本后处理陷阱 — sort/comm 对中文排序错误可能导致下游『假缺失』结论——skill 已提示用 find/grep -F 复核,但错误工具链仍可能误判。
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…d5c4678cb5