AI根据视频的字幕总结B站视频。
需要自行配置API,仅能总结视频右下角带有字幕/CC的视频(如图所示)。

注:个人自用脚本,仅作存档。功能简单,未必通用。若恰好解决你的问题,那是缘分;若不适用,建议参考社区其他优秀项目,感谢理解。
- 基础功能
支持页面:
https://www.bilibili.com/video/*
https://www.bilibili.com/list/*
https://www.bilibili.com/bangumi/play/*
页面右侧有一个 AI 悬浮球。
悬浮球支持拖拽,位置自动保存。
点击悬浮球打开右侧总结面板。
面板根据悬浮球位置向上或向下展开:
悬浮球在上半屏:面板在下方展开。
悬浮球在下半屏:面板在上方展开。
面板宽度可左右拖拽调节并保存。
面板高度固定为可用高度,内容区域内部滚动,避免面板乱飞。
- 字幕读取逻辑
当前最大坑是:B站是 SPA,多 P / 合集 / 播放列表 / /list/... 页面切换时,URL 或 window.INITIAL_STATE 不一定代表当前正在播放的视频。
当前脚本的字幕识别逻辑是:
优先从 performance.getEntriesByType('resource') 里找最近播放器请求:
/x/player/v2
/x/player/wbi/v2
/x/player/playurl
/x/player/wbi/playurl
从这些请求里提取:
bvid
aid
cid
优先用 cid 作为当前视频标识。
再调用:
/x/player/v2?bvid=xxx&cid=xxx
或 /x/player/v2?aid=xxx&cid=xxx
获取当前播放器字幕列表。
优先选择中文字幕。
再 fetch 字幕 JSON。
如果失败,才兜底使用 window.INITIAL_STATE 里找到的字幕 URL。
关键经验:
不能优先依赖 window.INITIAL_STATE,它经常是旧视频数据。
不能只依赖 URL,合集/播放列表/SPA 切换时 URL 不一定等于当前播放器内容。
cid 比 bvid + p 更能代表实际播放内容。
- 字幕分段模块
默认打开面板时显示 字幕分段,不自动请求 AI。
字幕分段功能:
自动读取当前视频字幕。
按时间和行数分段。
每段标题包含时间。
每条字幕保留时间。
时间格式如 [03:20]。
时间可点击跳转到视频对应位置。
字幕分段不会覆盖 AI 总结缓存。
当前分段规则:
每段最多 12 行字幕。
或时间跨度超过 90 秒就换段。
- AI 总结模块
底部有 AI总结 按钮。
逻辑是:
第一次点击 AI总结:
如果没有 AI 总结缓存,则请求 AI 生成。
再次点击 AI总结:
只显示缓存,不重新请求 AI。
只有点击 重新生成:
才会弹确认。
确认后重新请求 AI。
避免误消耗 API 额度。
关键缓存变量:
js
let latestSubtitleText = '';
let latestSummaryText = '';
let latestDisplayText = '';
语义:
latestSubtitleText:当前视频字幕缓存。
latestSummaryText:AI 总结缓存。
latestDisplayText:当前面板显示内容。
注意:
字幕分段不能写入 latestSummaryText,否则会覆盖 AI 总结缓存。
- 模块高亮
底部按钮有:
text
AI总结 / 字幕分段 / 复制 / 重新生成 / 关闭
其中只有:
AI总结
字幕分段
是模块按钮。
当前在哪个模块,哪个模块按钮显示蓝色:
当前是字幕分段:字幕分段 蓝色。
当前是 AI 总结:AI总结 蓝色。
复制 / 重新生成 / 关闭 不参与高亮。
当前模块变量:
js
let currentModule = 'subtitle'; // subtitle / summary
- 字幕刷新功能
在面板右上角加了 刷新字幕 按钮。
逻辑:
只在当前模块是 字幕分段 时显示。
当前模块是 AI总结 时隐藏。
点击刷新字幕:
清空旧字幕。
清空旧 AI 总结。
重新识别当前播放器视频。
重新读取字幕。
重新生成字幕分段。
清空旧 AI 总结是为了避免字幕刷新后总结仍然对应旧字幕。
- API 配置
配置页在面板里,不只依赖菜单。
支持多个 API 配置档:
每个配置包含:
配置名称
Base URL
API Key
模型名称
支持:
新增 API
删除当前 API
切换 API
保存当前 API
测试连接
兼容 OpenAI 格式接口。
- 自定义 Prompt
配置页支持自定义总结 Prompt。
默认 Prompt 大意:
根据 B站字幕生成中文 Markdown 总结。
按时间顺序分段。
每个小节标题必须以 [mm:ss] 或 [hh:mm:ss] 开头。
每段写 2-4 条要点。
不编造字幕中没有的信息。
保留重要观点、细节、结论。
修改 Prompt 后不会自动重新总结,必须点击 重新生成 才会使用新 Prompt。
- 关闭思考模式
配置页有:
text
关闭思考模式 / 禁用 Reasoning
默认开启。
请求 AI 时会尝试附加:
js
reasoning_effort: 'minimal',
enable_thinking: false,
thinking: false
如果接口不支持这些字段,脚本会自动去掉这些参数重试一次。
经验:
OpenAI-compatible 接口不完全兼容,有些接口不允许未知字段,所以必须自动降级。
- 请求超时时间
配置页支持设置请求超时时间。
单位:秒。
最小 10 秒。
最大 600 秒。
默认 120 秒。
长视频建议设置 180 / 300 / 600 秒。
超时同时用于:
字幕接口请求
AI 请求
- UI 经验
之前出现过面板乱飞,原因是定位依赖内容高度。
后来改成:
js
panel.style.height =
${panelHeight}px;
panel.style.maxHeight = ${panelHeight}px;
内容区域内部滚动。
经验:
浮窗定位不能依赖动态内容高度,否则内容变化会导致面板跳动。
面板展开规则:
悬浮球只决定上下展开。
不影响面板左右宽度。
面板宽度由用户拖拽设置。
面板和悬浮球上下紧挨展开。
- 调试菜单
脚本菜单里有:
text
调试:打印当前视频识别信息
会输出:
js
{
location,
bvid,
aid,
pageIndex,
videoKey,
perfInfo,
currentModule,
requestTimeoutSeconds,
disableThinking
}
其中 perfInfo 来自最近播放器请求:
js
{
bvid,
aid,
cid,
source
}
如果字幕仍然拿错,应优先看这里。
- 重要经验教训
不要优先信 window.INITIAL_STATE
它在 B站 SPA 页面里经常是旧数据。
不要只信 URL
/list/...、合集、多 P、播放列表中 URL 可能不代表当前播放内容。
优先信当前播放器实际请求
performance.getEntriesByType('resource') 里的播放器 API 请求更接近真实状态。
缓存必须分清语义
字幕缓存、AI 总结缓存、当前显示内容必须分开。
重新生成必须由用户明确触发
AI 请求会消耗额度,不能自动重复请求。
默认显示字幕分段更合理
打开就能看到内容,不消耗 API。
用户确认字幕正确后再点 AI 总结。
模块按钮和操作按钮要区分
只有 AI总结 / 字幕分段参与高亮。
复制 / 重新生成 / 关闭只是操作按钮。
刷新字幕会让旧 AI 总结失效
所以刷新字幕后必须清空 AI 总结缓存。
浮窗定位要固定高度 + 内部滚动
不要让内容高度反向影响面板位置。
多服务商 API 要有降级机制
关闭思考参数可能不兼容,需要自动去掉参数重试。