ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Bilibili-Evolved 哔哩哔哩增强脚本教程:用油猴组件自由装配 B 站

Bilibili-Evolved 哔哩哔哩增强脚本教程:用油猴组件自由装配 B 站

Bilibili-Evolved 哔哩哔哩增强脚本教程:用油猴组件自由装配 B 站

【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved

Bilibili-Evolved 是一个运行在 Tampermonkey / Violentmonkey 里的哔哩哔哩增强脚本,解决"B 站页面长什么样、顶栏有什么、下载下来是什么格式,你说了不算"的问题:它本身不带功能,所有能力以组件、插件、样式三种单元按你的意愿装配。本文覆盖安装跑通、能力分布、核心机制拆解、一次可验证的改动、避坑表和后续路线,文中路径均可直接对照源码。

核心能力速览:按场景找入口

功能全部放在 registry/lib/components/ 下,按feeds / live / style / touch / utils / video六大类组织,每个功能一个目录,统一是index.ts(元数据与入口)+index.md(自动注入的描述文档)+ 可选的Widget.vue(设置面板里的选项组件)。

首页与动态整理:动态过滤器和首页重构

feeds/filter/的动态过滤器按类型或关键词过滤动态流,并可移除侧边卡片;feeds/copy-link/、feeds/del-feeds/处理链接复制与批量删除。更激进的是style/home-redesign/,内含fresh与minimal两套首页重构方案,把信息流重排成卡片布局(registry/lib/components/style/home-redesign/fresh/layouts/)。style/custom-navbar/可以整条替换顶栏,内部拆成home / search / user-info / settings等 15 个以上子模块,支持透明填充、背景模糊等选项。

视频播放与下载:DASH 直连和弹幕六件套

video/download/的下载视频组件直接对接 B 站 DASH 流,可单独下载音频、控制扩展名与回退编码;video/danmaku/把弹幕拆成airborne / converter / download / expand / merger / unescape六个子模块,覆盖过滤、展开、下载与格式转换;video/player/是仓库最大的子目录,集中播放器层面的增强。

直播与外观:弹幕收发和夜间模式

直播间的前后台音量、礼物盒子、弹幕面板适配、去水印都在live/下,配合src/components/live/live-socket.ts的 WebSocket 封装做弹幕收发。外观侧最重的组件是夜间模式(style/dark-mode/),目录里从 2018 年遗留 CSS(old/dark-slice-*.css)到现行分片 SCSS 并存,registry/lib/components/style/dark-mode/README.md给出一份完整的配色规范和选择器约束,改样式前先看它。

工具类:签到助手和评论增强

签到助手(utils/check-in-center/)的index.ts只有十几行,widget.condition里判断getUID(),未登录就不渲染。评论增强(src/components/utils/comment/)实现评论区域管理器与 VNode 折叠,数据层靠src/core/spin-query.ts的轮询器等待异步元素。

最短路径跑通:10 分钟装好并验证注入

前提:最新版 Chrome 或 Firefox(Safari 官方标注"理论上能运行,没测试过"),脚本管理器用 Tampermonkey 5.0+ 或 Violentmonkey 2.18+。README 明确标注 Greasemonkey 与 AdGuard不兼容,套壳类浏览器不保证稳定。

步骤:

  1. 装好脚本管理器后,从 README 的安装链接装正式版脚本;
  2. 刷新任意 B 站页面,页面左侧中央出现功能面板和设置面板入口——到这一步安装就算成功;
  3. 打开设置面板 → 左下"组件/插件/样式管理",四个入口:批量(逐行粘贴功能直链一次装完)、浏览(载入本地功能文件)、在线(打开在线仓库窗口)、底部输入框(粘贴单个链接安装);
  4. 选一个组件装上,刷新页面生效。

验证:打开页面控制台输入window.bilibiliEvolved,有对象输出即正常——脚本在src/client/init.ts里把对外 API 挂到了unsafeWindow.bilibiliEvolved。

关键认知:全新安装的脚本一个功能都没有。除设置面板、启动栏、自动更新等 7 个内置组件(src/components/built-in-components.ts)外,其余全部要手动装配。v1 老用户可装v1 设置迁移组件(registry/lib/components/utils/v1-migrate/),它会自动把旧设置对应的新组件批量拉下来。

一个机制讲透:组件之间靠数据注入,而不是 import

遇到什么问题:组件要能独立安装、独立开关,就不能互相import——A 组件引用了 B,B 一卸载 A 就崩。但现实里组件确实需要协作,比如"下载弹幕"往"下载视频"的下载列表里加一个选项。

方案:src/plugins/data.ts提供一套数据注入 API。接收方用registerData(key, ...data)交出可被修改的对象,提供方用addData(key, provider)提交修改,getData时一次性应用。addData是单向累加的——只能git commit,不能git reset,所以卸载提供方只是"少一次累加",不会破坏数据。

关键代码(registry/lib/components/video/danmaku/download/index.ts的plugin部分):

plugin: { displayName: '下载视频 - 下载弹幕支持', setup: ({ addData }) => { addData('downloadVideo.assets', async (assets: DownloadVideoAssets[]) => { assets.push({ name: 'downloadDanmaku', displayName: '下载弹幕', // getAssets 负责把弹幕转成可下载文件 // component 指向设置面板里的选项 Widget }) }) }, },

装上"下载弹幕"后,"下载视频"的资产列表里凭空多出一项;卸载后消失。两边代码互不认识。另一条通道是src/plugins/hook.ts的addHook/getHook(before/after 两段式),典型用途是自动更新组件挂在userComponents.add钩子上记录安装来源。

对你意味着什么:任何组件都可以放心装/放心卸,它影响不了别的组件的代码路径,只会增删自己的那一份数据。

跟着改一次:换个 DASH 回退编码,用开发者模式看耗时

改哪里

下载组件的选项定义在 registry/lib/components/video/download/index.ts:

const options = defineOptionsMetadata({ dashVideoExtension: { defaultValue: DefaultDashExtensions.video, displayName: 'DASH 视频扩展名' }, dashAudioExtension: { defaultValue: DefaultDashExtensions.audio, displayName: 'DASH 普通音频扩展名' }, dashFlacAudioExtension: { defaultValue: DefaultDashExtensions.flacAudio, displayName: 'DASH FLAC 音频扩展名' }, dashCodecFallback: { defaultValue: DashCodec.Avc, dropdownEnum: DashCodec, displayName: 'DASH 回退编码' }, })

dashCodecFallback默认AVC:部分播放环境解不了 HEVC/AV1,回退到 AVC 能保证下载的 DASH 流被播放器识别。

怎么改

设置面板 → 组件管理 → 下载视频 → "DASH 回退编码"下拉框,换成 HEVC 或 AV1。设置持久化在脚本存储里,每个组件一段{ enabled, options },在关于面板可以整体导出/导入备份。

怎么验证

两件事:其一,下一个视频,看产物编码与扩展名是否符合预期;其二,把settingsPanel的devMode(开发者模式)打开再刷新,控制台会输出components block time: xx ms for N items这类按组件分组的耗时日志(src/core/performance/stats.ts的logStats),每行是"组件名 + 毫秒数 + 百分比"。找到占比最高的组件,考虑停用或调整加载时机——这是官方内置的逐组件剖析,比浏览器性能面板省事。

避坑速查

现象原因处置
装完脚本什么都没发生设计如此,默认不预装任何组件进设置面板装功能,装完刷新
功能面板不显示、效果时好时坏用了 Greasemonkey / AdGuard(README 标注不兼容),浏览器是套壳版,或脚本默认不对未登录状态做适配换最新版 Chrome/Firefox + Tampermonkey/Violentmonkey;先确认已登录
弹"脚本试图访问跨域资源"用链接安装组件或把下载任务发到外部服务器时的已知提示(README 注意事项)确认来源后选"始终允许"
页面明显变卡综合性脚本,README 直说"对性能有较大影响",最低要求 8GB 内存 / 1920×1080开devMode定位耗时大户,改加载模式或停用;装得克制是长期流畅的前提
升级后旧版出问题或设置错乱官方策略:"新版本一旦正式发布,就不再对旧版本做任何技术支持"升级前在关于面板导出设置;必须留旧版参考 doc/rollback.md 回退指南
弹幕下载出来的 ASS 里缺弹幕文档明确"ASS 弹幕下载不会包含高级弹幕、字幕弹幕等"(registry/lib/components/video/danmaku/download/index.md)预期行为,不是 bug

安全提醒:README 隐私声明写得很直白——本仓库组件完全匿名、数据只落本地,但任何组件对用户数据都有完全访问能力。装外部来源的组件前先看它的index.md和代码里的网络请求(统一走src/core/ajax.ts封装,便于审查)。

你的下一步

日常用户(只做三件事):

  • 装上下载视频、夜间模式这类高频组件并保持克制;
  • 把"关于面板导出设置"当成升级前的固定动作(src/components/settings-panel/sub-pages/AboutPage.vue);
  • 关注 CHANGELOG.md,新版本发布后及时跟进,旧版不再受支持。

重度定制用户:

  • 读一遍src/core/life-cycle.ts(headLoaded/contentLoaded/fullLoaded三个时机)和src/core/loading-mode.ts("延后"/"同时"两个模式,各 60 行以内),理解组件何时被激活;
  • 按devMode的性能日志调整每个组件的加载时机或停用;
  • 动样式之前先读registry/lib/components/style/dark-mode/README.md的分片规范,再碰dark-slice-*,避免重蹈 2018 年"选择器太宽泛"的老路。

想写功能的:

  • 克隆仓库(git clone https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved)后pnpm install,registry/下再装一次依赖;
  • pnpm tsx dev-tools/dev-server/index.ts启动开发服务(默认 23333 端口);
  • 在registry/lib/components/<类别>/下建目录,index.ts用defineComponentMetadata导出,index.md写描述;把http://localhost:23333/registry/dist/components/<id>.js粘进组件管理面板即装即调,改码热更新;
  • 写跨功能协作时优先addData/addHook;提交前跑pnpm run lint-check和pnpm run type(package.json的 scripts 里都有)。

Bilibili-Evolved 把油猴脚本从"一个成品"还原成了"一套装配规则":核心层保证稳定,组件层承载功能,插件层负责互通,连 doc/features/features.md 的功能清单和dev-tools/pr-check/的 PR 检查都是同一套生成式工具链的产物。它最有迁移价值的不是某个具体功能,而是"元数据 + 懒加载 + 数据注入"的组合——换一个站、换一个场景,这套工程化写法几乎可以原样搬走。

【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进