Bili Watch
Overview
让 WorkBuddy 读懂 B站视频,两条路径:
- 文本路径:抓字幕(ai-zh)/弹幕,由 AI 阅读总结(
bili_watch.py)——能"听"台词,但看不到画面。 - 画面路径:下载视频 + ffmpeg 抽关键帧 + AI 逐张读图(
bili_frames.py)——真实看到画面(运镜/UI/动作/贴图),是陪看、画面型整活(PVZ 鬼畜、MC 实拍、游戏集锦)的唯一靠谱方式。
边界:本 skill 只做"视频→文本"的单向转写,不涉及自动刷推荐/投币/评论/私信等账号托管行为(那类高风险工具见开源项目 bilibili_learning_bot,与本 skill 无关且默认不推荐)。
Key Constraints (from real probing)
- 字幕锁登录:B站字幕(含 AI 字幕)现已要求登录,无 cookie 时报
Subtitles are only available when logged in。AI 字幕的语言代码通常是ai-zh(不是zh-CN),--list-subs里显示为ai-zh srt/zh-CN.json3才是真字幕轨道。 - 浏览器选择(关键):
- 优先用 Firefox:
--cookies-from-browser firefox能稳定拿到登录态 AI 字幕(Firefox cookie 无系统级加密,yt-dlp 直接读)。实测--list-subs成功列出ai-zh,字幕抓得到。 - Edge/Chrome 有 App-Bound Encryption(DPAPI)加密:
--cookies-from-browser edge会报Failed to decrypt with DPAPI,yt-dlp 读不出 cookie,字幕分支退化成弹幕。 - 导出的 cookie 文件不可靠:用 Cookie-Editor 导出 Netscape 格式
.txt再--cookies 文件喂api.bilibili.com,实测nav接口返回isLogin=false(SESSDATA 在服务端已失效/被轮换,导出的是过期凭证),导致player/wbi/v2不返回字幕,只能退弹幕。不要依赖导出的 cookie 文件,改用 Firefox 实时登录态。
- 优先用 Firefox:
- 弹幕无需登录:
yt-dlp --write-subs --sub-langs danmaku --skip-download可直接抓弹幕 XML,作为无字幕时的退路(内容碎片化,且弹幕可能和当前视频主题混流,仅作大意参考,不可当真实字幕)。 - 反爬:默认 UA 直连 bilibili.com 会被 412 拦截;抓首页 BV 号/调接口需带浏览器 UA + Referer/Origin(如
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0 Safari/537.36,Refererhttps://www.bilibili.com)。 - 环境依赖:沙箱/新机常缺
yt-dlp,先python -m pip install -q yt-dlp。抽帧需要 ffmpeg:pip install imageio-ffmpeg(自带静态二进制,无需系统装 ffmpeg)。whisper 通常缺失(ASR 音频转写分支默认不启用,用户已确认不需要)。
Workflow
- 确认目标是 B站视频(链接或 BV 号)。
- 优先走字幕:运行
scripts/bili_watch.py <BVID> --cookies-from-browser firefox(脚本内部用 yt-dlp 抓并解析字幕)。需在用户本机 Windows(Firefox 已登录 B站)运行才拿得到字幕。 - 先用
--list-subs确认轨道:python -m yt_dlp --cookies-from-browser firefox --list-subs <URL>,看到ai-zh再抓;若只有danmaku说明登录态没过或视频无字幕。 - 若无字幕/未登录,脚本自动退弹幕分支,输出弹幕转写(碎片化大意,且可能与视频主题不符)。沙箱内无登录态时只能走这条。
- 拿到文本后,由 AI 阅读并总结/问答。
- 画面型视频(无字幕、或信息在画面里:整活/鬼畜/实拍/游戏集锦):
python scripts/bili_frames.py <BVID>下载并抽帧,AI 用 Read 逐张读图(每批 ≤4 张,一次并发太多会报"模型不支持图片")。严禁拿标题/标签/套路脑补画面冒充"看见";看不清就--width 1920放大重抽。 - 不要落盘:默认只在终端打印预览,不写文件。需长期存档才加
--save生成<BVID>.transcript.txt(用户曾明确要求不要默认保存弹幕文件)。
Bundled Script
scripts/bili_watch.py — 把 B站视频转成文本(字幕+弹幕)。
- 用法:
python bili_watch.py <BVID 或链接/关键词> [--browser firefox] [--cookies 文件] [--save] [--search] --browser:读哪个浏览器的 B站登录态(默认 firefox;edge/chrome 因 DPAPI 加密会失败,已设为非默认)。--cookies:Netscape 格式 cookie 文件(已加 API 直连分支:调player/wbi/v2拿 AI 字幕直链)。注意:导出的 cookie 文件常因 SESSDATA 失效被判未登录,优先用--cookies-from-browser firefox。--save:落盘保存为<BVID>.transcript.txt(默认不保存,仅终端预览)。文件含元数据+字幕+弹幕+评论。--comments:额外拉取公开评论(走x/v2/reply/wbi/main,无需登录,复用脚本内wbi_sign签名);--comment-pages翻页上限(默认10,每页约20条)、--comment-mode2=按热度/3=按时间。子回复以↳前缀缩进。--save时评论会一并追加到文件。--search:把 target 当关键词搜索视频,列出候选 BV。--search-limit数量(默认20)、--search-ordertotalrank/click/pubdate/dm/stow。2026-08-25 已修:先走 wbi 签名接口x/web-interface/wbi/search/all/v2(自动带浏览器登录态或--cookies),API 常被风控返回空壳(numResults>0但 result 空)时自动回退抓https://search.bilibili.com/all网页端 SSR 卡片数据(解析bili-video-card__wrap块拿标题/BV/UP/时长)。搜索关键词请给完整上下文(如"NX树 指令 我的世界"),分词过细容易命中无关内容。--min-danmaku:弹幕折叠阈值(默认2)。出现 >= 该值的重复弹幕折叠成带(xN)的一行;全部弹幕都保留,不做破坏性删除(弹幕是百分百输出项,不再是退路)。--no-danmaku:只取字幕、不抓弹幕。- 输出结构(升级后):①元数据置顶(标题/UP主/时长/播放/分区/标签/发布/简介,给 AI 先看背景);②字幕优先、带时间戳
[mm:ss];③弹幕百分百保留、带时间戳 + 去重折叠;④评论(可选)。字幕与弹幕解耦:有字幕也给弹幕,无字幕则弹幕独立输出。 - 解析逻辑:json3/vtt/srt 字幕按
from/时间码提取并附[时间戳];弹幕 XML 按<d p="时间,...">取时间点附[时间戳];评论取data.replies[].content.message(含replies子回复)。 - 无字幕视频:B 站侧只挂了弹幕、没挂字幕的视频(如本会话 BV1eVgA64EpH、BV1cj8c6jE7f),
--list-subs只见danmaku;这类视频弹幕独立百分百输出,不再被当"退路"误报。 - 状态区分(已修复误报):脚本现用
--list-subs先探查真实轨道,不把"无字幕"误判成"未登录"。三种分支:①已读取登录态且视频确实无字幕轨道 → 提示"该视频未挂字幕轨道(无字幕)";②有字幕轨道但 cookie 未读取成功(未登录/DPAPI加密/浏览器未装)→ 提示去换 firefox 或喂--cookies;③既无 cookie 也未能确认轨道 → 提示跳过字幕(弹幕仍抓)。旧版统一打"可能未登录或该视频无字幕"已废弃。
scripts/bili_frames.py — 下载 B站视频 + ffmpeg 抽帧,供 AI 读图看画面(v1.2.0 新增)。
- 用法:
python bili_frames.py <BVID> [--interval 3] [--width 1280] [--outdir 目录];或--video <本地.mp4>跳过下载直接抽帧。 - 依赖:
pip install yt-dlp imageio-ffmpeg(imageio-ffmpeg 自带静态 ffmpeg,无需系统装)。 - 自动选格式(关键坑):
-f "bv*[height<=1080]+ba/b[height<=1080]" --format-sort "vbr:asc"—— 强制挑 1080p 内码率最低的普通档,避开大会员「1080P 高码率/60帧」档(free 账号下会报格式不可用)。格式 ID 因视频而异(30080/100050/80…),禁止硬编码格式 ID。失败自动降级 720p 重试。 - 读图规范:AI 用 Read 逐张读帧,每批 ≤4 张;严禁脑补画面冒充看见(历史翻车:拿标题猜"治愈向混剪"结果实为聊天体整活);看不清放大
--width 1920重抽。
Notes
- 协作方式:用户在自己的 Windows 上跑脚本拿文本后,把结果贴给 WorkBuddy;或若 WorkBuddy 能访问本机则直接调用脚本。沙箱环境无浏览器登录态,字幕分支演示不了,但弹幕分支可在此直接验证。
- 与 bilibili_learning_bot 区分:那是全账号托管(刷推荐/投币/评论/私信),封号 + API 费风险高;本 skill 仅做内容转写,低风险。