1仕組みと動作原理
中核となるのは、「1回の view/detail API 呼び出し + jq による整形」を単一の JSON にカプセル化している点です。入力をまず bvid/aid クエリパラメータに正規化し、api.bilibili.com から取得して title/up/tags/stat/pages にマッピングします。
json=$(bili_curl "https://api.bilibili.com/x/web-interface/view/detail?$q")
ネットワーク耐性のカプセル化:リクエスト時にローカルプロキシ環境変数を削除し(Bilibili は中国本土のサービスであり、ローカルのフォワードプロキシによってリクエストが失敗するため)、ブラウザ 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 を再利用して該当パートの 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 などの字幕トラックを取得します。スキルには「免ログインのパスは存在しないため、バイパスを試みないこと」と明記され、事前にユーザーへ確認することを義務付けています。
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 は固定の公開フィクスチャを用いて各機能とログインゲートの不変条件を順次アサートし、ドリフトを 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…