Greasy Fork is available in English.

BiliKit Core

B 站体验增强核心,一装到位:CDN 优选(救海外卡顿)· 免登录看评论/动态/1080p · 主题跟随系统深浅 · 评论显 IP 属地 · 播放不息屏——统一设置面板集中开关。Safari 友好、无需扩展、零外部依赖。

These are versions of this script where the code was updated. Show all versions.

  • v0.5.11 04.07.2026.

    fix(core): 抽屉 iframe 深色下向上回弹露白——html/body 跟随 --bg1;Core 0.5.10→0.5.11

    抽屉里向上橡皮筋回弹(overscroll)会露出根元素背景,而 B 站深色只给部分容器上色、 html/body 根仍是白 → 露白(theme-sync 那句垫底只作用于 html,且用户可能用 B 站原生深色、 没开 theme-sync)。在抽屉 iframe 无条件注入的样式里,让 html/body 背景跟随 B 站自己的 主题 token var(--bg1)(深即深、浅即浅),不依赖 theme-sync 开关;未定义时声明失效不强上色。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.10 04.07.2026.

    ci: 加 ESLint + tsc 类型检查 + GitHub Actions CI(typecheck/lint/test/build/dist 同步校验)

    补上「集成靠审查、纯逻辑靠单测」之外的机械关卡:

    • typecheck:tsc --noEmit。顺手修出 2 个一直被 esbuild 漏掉的真实类型错—— net-hook.ts 的 | void 上取 .url(改为 | undefined)。
    • lint:ESLint 10 + typescript-eslint(flat config,务实取向)。关掉风格洁癖 (no-undef 交给 TS、any 在网络 hook 是有意、arguments 透明转发合法),只留真 bug 规则。 顺带清掉 panel.ts 的死变量 dirty、cdn-pick 未用形参改 _init。
    • CI(.github/workflows/ci.yml):push/PR 跑 typecheck + lint + test + build, 并校验 dist/ 与源码同步(build 确定性已验,防提交陈旧 dist)。
    • 脚本:npm run typecheck / lint / check(三合一)。CI 与本地都用 npm run(pnpm run 会被 deps 预检卡)。

    无行为改动,不升版本(类型修正 / 死代码 / 形参重命名)。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.10 04.07.2026.

    test: 引入 Vitest 测纯逻辑层,并把硬逻辑从 init() 闭包抽成纯函数;Core 0.5.9→0.5.10

    针对「脚本变大如何保正确性」:给纯逻辑层补单测(32 例)。这类逻辑是最易犯错、也最该测的 (历史那个 click/web/h5 前缀误杀、回程切片、wbi 签名都属此类);集成/环境正确性仍靠审查 + 真机。

    抽取(行为保持,原调用点不变,靠 build 编译验证):

    • src/core/pages.ts isPlayPage(已纯)
    • no-login/wbi-core.ts:signParams(纯签名,与 readKeys/时间解耦)+ mixinKey/keyFromUrl 导出
    • no-login/playurl.ts:playurlParams(免登录 1080p 参数改写,与签名解耦)
    • way-back/core.ts:videoIdOf / cleanTitle / dedupeArrival(与 sessionStorage/location 解耦)
    • cdn-pick/core.ts:isUpos / swapHost / fixEntry / rewritePlayurl(与闭包 host 解耦)
    • core/settings.ts:导出 toCookieStore / SENSITIVE(守住「accessKey 绝不进跨子域 cookie」)

    工具链:Vitest(devDep),npm run test;co-located src/*/.test.ts,node 环境不碰 DOM。 .npmrc 关 verify-deps-before-run(pnpm 11 因 esbuild 构建脚本被忽略会在 run 前中断)。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.9 04.07.2026.

    feat: 「关于」页显示 Feed 版本;Feed 版本同样单一源并上报(Core 0.5.8→0.5.9 / Feed 0.3.2→0.3.3)

    • Feed 启动时把自身版本写进 localStorage(bilikit:feed.version),Core 的「关于」页据心跳 判在装/未装后显示「Feed vX.Y.Z」或「未安装」(避免读到卸载后残留的旧版本号)。
    • src/feed/version.ts:Feed 版本单一事实来源,与 Core 的 src/core/version.ts 对称—— vite.feed.config 的 @version 与运行时上报都读它,发版只改一行。
    • 「关于」页版本行精简为「Core vX.Y.Z / Feed vX.Y.Z」两行。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.8 04.07.2026.

    feat(core): 设置面板加「关于」页(版本号 + GitHub / 反馈 / GreasyFork 链接);Core 0.5.7→0.5.8

    • 面板左栏末尾新增「关于」组:显示 BiliKit Core 版本号、作者、MIT,附 GitHub 仓库 / 反馈报 Bug(Issues)/ GreasyFork 主页链接(新标签打开),及开发期提示。
    • 版本号单一事实来源 src/core/version.ts:vite.config 的 @version 与「关于」页都读它, 发版只改一行、不再两处各写。(Core @grant none 无 GM_info,运行时拿不到版本,用编译期常量。)
    • 复用现有 .status / .callout a 样式,无新增 CSS。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.7 04.07.2026.

    feat(core): 设置齿轮并入 Feed 右下按钮组、去掉左下吸边;README 加开发期说明并去过时(#2 追加);Core 0.5.6→0.5.7

    1) 打开设置的入口统一到右下:

    • 齿轮从左下吸边改为右下角常驻(与 Feed 悬浮按钮同位、同尺寸),去掉半藏吸附。
    • Feed 若在跑(首页注入 .bk-feed-fab),Core 直接往其 FAB 里塞一颗「设置」按钮、挂 click 开面板, 并隐藏自己这颗独立齿轮 → 右下一列「返回顶部 / 设置 / 刷新」,心智统一。
    • 跨世界不共享 window 但共享 light DOM:Core(页面世界)反向并入 Feed 的按钮,零跨世界信令、 零心跳依赖;MutationObserver 跟 FAB 增删(SPA 重挂也跟得上)。无 Feed 时露出右下独立齿轮兜底。

    2) README:

    • 顶部加「开发期 · 快速迭代中,可能不稳定」警示。
    • 修过时:齿轮位置(左下→右下/并入 FAB)、抽屉「下拉即关」手势(已移除); 独立脚本表移除已废弃并入 Core 的「回程」,迁移提示补上 回程 / 全站抽屉。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.6 04.07.2026.

    feat(core): 打开方式接管收窄到浏览页——播放页内点视频走原生 SPA、喂给回程;Core 0.5.5→0.5.6

    全站抽屉/打开方式此前在「所有页」接管视频点击,含播放页本身,导致:① 新标签模式下 播放页点相关视频也新开标签、永不 SPA → 回程恒 0 层;② 抽屉模式在播放页叠抽屉。

    改为把接管收窄到「浏览/列表」语境(首页/搜索/空间/收藏/历史/动态…), 视频播放页内一律放行走原生 SPA:既喂给回程建来时路,又不叠抽屉。三种模式各自自洽 (抽屉/新标签模式下每个播放页/标签都是独立的一份来时路)。

    • 新增 src/core/pages.ts isPlayPage():单一事实来源,回程「站上」与抽屉「站下」共用, 正反面同源、杜绝日后一改一漏。按点击/运行时 pathname 现读,跟随 B 站 SPA 跳转。
    • site-drawer:click 与 mouseover 两处首行 isPlayPage() 放行。
    • way-back:内联正则改用 isPlayPage()。
    • 面板文案同步。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.5 04.07.2026.

    refactor(core): 移除「埋点拦截」模块——误伤面大、非核心,得不偿失(#2 追加);Core 0.5.3→0.5.5

    埋点拦截要靠猜 B 站的私有埋点路径做前缀匹配,天然最易误伤相邻接口: 先有「免登录 + 埋点拦截」同开反复重刷(收窄过一次),又有前缀 click-interface/click 连坐 click/web/h5 播放上报、真登录下所有视频不进观看历史。而它只是省流/降开销的边角功能 (头牌是 CDN 优选 / 免登录 / 主题跟随),换来的持续误伤风险不划算,整模块移除。

    • 删 src/modules/no-track;entry-core 去注册;drawer/net-hook 注释校正。
    • 一并去掉随模块附带的广告拦截(cm.bilibili.com)。
    • README / 描述去「埋点/广告拦截」,补上此前漏记的「回程」模块条目。

    本提交替换上一条「摘 click-interface」的修法(79a0f4c,已撤回):模块既除,历史自然恢复。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.4 04.07.2026.

    fix(core): 埋点拦截误杀播放上报致观看历史全丢——从黑名单摘掉 click-interface(#2 追加);Core 0.5.3→0.5.4

    真登录账号下所有视频都不进观看历史(不分打开方式,原生直开也不记)。根因:埋点拦截 黑名单里的 'api.bilibili.com/x/click-interface/click' 用前缀命中把 click/web/h5 一起拦了, 而 click/web/h5 是每次播放一次的「播放上报」,B 站据它写入观看历史——被拦=历史不写入。 实测关掉埋点拦截历史即恢复,确证。

    修:从 TELEMETRY 摘掉 click-interface 整条。该接口低频(每播一次),非省流大头 (大头是 data.bilibili.com/log 与 sendBeacon),放行零感知代价,换回观看历史。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.3 04.07.2026.

    fix(core): 免登录修 iPad/移动 Safari 只能 480p(掰回桌面 DASH 路径)(#2 追加);Core 0.5.2→0.5.3

    iPad/移动 Safari 触发 B 站触屏判定 → 播放器发 platform=html5(MP4),服务端对 html5 的免登录 try_look 只给 480p,qn=80 也被打回,手动切也被服务端拉回——桌面无此问题, beefreely 同病(两者都只改 qn/try_look、不碰 platform)。非 Safari 编解码限制。

    修:playurl 重签时强改 platform=pc + fnval=4048(全 DASH) + fourk=1,掰回桌面策略 放行 1080p 试看。桌面本就这套零风险,iPad 靠 MSE 放 DASH。实机 iPad 验证 1080p 通。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.2 04.07.2026.

    fix(core): 免登录修 UP 空间页死循环 + 对照 beefreely 全面补洞(#2 追加);Core 0.5.1→0.5.2

    对照 references/beefreely 全源码逐端点审计,修 5 处:

    • space/v2/myinfo mock:空间页见「cookie 已登录 + myinfo -101」判会话失效自刷 → 死循环(收藏/历史同病换接口)。伪造成功响应压掉自刷路径,mid 与 nav mock 同一。
    • relation + archive/relation mock:视频页两处 -101(关注/点赞投币收藏状态)→ 红「账号未登录」toast 的真正源头,mock 成无关系/未互动。
    • playurlSSRData 抢注:新版播放器读它不读 playinfo,抢先 const {} 吞掉 SSR 低清流。
    • 搜索热搜接口补斜杠:api.bilibili.comx(B 站自身拼接 bug,仅未登录出现)→ 404。
    • 番剧 ogv/player/playview 掰 is_login=true:不再弹「登录后观看」、清晰度不锁最低。

    审计结论存档:wbi 签名我们比 beefreely 更对(其 sub key 误读 img url);个人页排除 更安全非 gap;双方均无 -352/w_webid 风控处理;假历史/直播 WS/下载器接口有意不做。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.1 04.07.2026.

    feat(core): 回程胶囊迁入 Core(顶层+抽屉内)+ 齿轮仅首页吸边;Core 0.5.0→0.5.1

    • 回程(way-back):视频页左下「回退栈」胶囊迁入 Core 模块化体系,顶层窗口与 BiliKit 抽屉 iframe 内都跑。只保留回退栈(历史压扁随全站抽屉登场已无意义,去掉)。 深浅色跟随系统;「正在播放」行带声波条动画;胶囊↔面板悬停桥(内层滚动+::after, 照原脚本做法避免 overflow 裁桥);0 层也显示头部空态文案。
    • 抽屉标记焊死:drawerMark 与 inDrawer 同真同假(hash 被 SPA 抹掉时兜底 #bk-drawer), 杜绝跳回丢标记→重载被门槛挡掉且清栈。
    • 齿轮:仅首页显示 + 默认靠边吸附,观感优先。
    • 独立脚本 scripts/way-back.user.js 标废弃(并入 Core),0.9.4→0.9.5。
    • .gitignore:参考仓库合并为 references/。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.5.0 03.07.2026.

    feat(core): 全站抽屉——「打开方式」移入 Core、全站视频点击生效;Core 0.4.7→0.5.0 / Feed 0.3.1→0.3.2

    「打开方式」从 Feed 解耦、上移到 Core:全站(首页 / 搜索 / 收藏 / 历史 / 别人空间…)点视频 都按它在 底部抽屉 / 网页全屏抽屉 / 新标签 / 当前页 打开,不跳走、不丢当前列表。

    • 抽屉从 Feed 迁到 Core(src/core/drawer.ts,自带 CSS、不依赖 Feed);Feed 卡片加 data-bvid、不再自管视频打开(保留头像→空间 + 兜底)。新增「全站抽屉」拦截器(document 捕获阶段委托点击,命中视频链接才接管,非视频/修饰键放行)。
    • 面板「打开方式」并入「播放」分组,删掉多余的独立「全站抽屉」模块项,文案改全站语义。
    • 修「跨子域打开揭幕很晚」:iframe 发揭幕信号 targetOrigin 改 '*'(原 location.origin 在 search/space 子域父页不匹配、被浏览器丢弃 → 只能等 6s 兜底)。
    • 删掉抽屉滑动关闭手势(跨源 iframe 抓不到滚动、行为不一致);关闭改 点缝 / 按钮 / Esc。
    • 三 agent 并行审查后硬化:重开同视频不再卡 6s(换视频才重载、同视频秒揭幕)、resolve 命中 判定更稳、isVideoUrl 收紧、清理死导出与 Feed 失效抽屉 CSS。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.4.7 03.07.2026.

    fix(core): 免登录去掉打开视频时闪现的「账号未登录」红色 toast(回应 #2);Core 0.4.6→0.4.7

    免登录伪造登录后,个别带假 cookie 的请求被服务端判 -101,页面会在打开视频瞬间闪一个红色 「账号未登录」toast(Vant 的 .van-message-error,一闪即逝)——这是 B 站原生提示、非本套件 所加。免登录开启时注入 CSS 藏掉它;不影响真登录 / 未启用免登录用户的正常错误提示。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.4.6 03.07.2026.

    fix(core): 免登录在个人页不伪造登录,修收藏/历史反复重刷(#2 追加);Core 0.4.5→0.4.6

    收藏/历史/稍后看/清单/消息/账号等「需真登录」的个人数据页:免登录伪造登录会让页面拿假身份 取不到数据、前后端状态打架 → 反复重刷。现这些页免登录一律不碰,并清掉之前在视频/首页种下的 假 DedeUserID cookie,让它们按未登录干净处理(跳登录 / 空列表),不再重刷。视频/首页/搜索/ 他人空间等公开页照常生效。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.4.5 03.07.2026.

    fix(core): 跨子域设置共享 + 埋点拦截收窄,修免登录多页问题(#2 追加);Core 0.4.4→0.4.5

    • 设置跨子域共享:非敏感设置镜像到 .bilibili.com cookie,www 配一次 search/space/视频页读 同一份(feed.accessKey 等敏感键不进 cookie)。修「换子域要重新配置」;免登录/CDN 全站生效, 顺带应修「从搜索/空间进视频只有 480p」(那些页此前免登录未生效、B 站预取未升清)。
    • 埋点拦截 data.bilibili.com → data.bilibili.com/log:只拦行为日志、放行该域上的校验路径, 修「免登录 + 埋点拦截 同开时页面反复重刷」。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.4.4 03.07.2026.

    feat(core): 免登录看评论/动态/1080p 模块(回应 #2);Core 0.4.3→0.4.4

    Issue #2:装 beefreely 等免登录脚本会与 BiliKit 抢改 fetch/XHR,时好时坏。 本次 BiliKit 自带「免登录」模块,装它即可卸载 beefreely,从根上消掉竞态。

    • 新模块 no-login(默认关,仅未登录时生效,检测到已登录整体让路):伪造 DedeUserID cookie + nav 认登录 + reply 走匿名放行评论 + playurl 塞 qn=80&try_look=1 重签 wbi 出 1080p + player/wbi/v2 让 UI 认账 + 置空预埋 playinfo 逼重取流。也在 Feed 抽屉 iframe 内生效。
    • net-hook:袖珍 fetch/XHR 拦截器(按 URL 改请求/响应,其余透传);wbi-core:Core 版 wbi 签名(读 B 站 localStorage 的 key、无 GM、按天失效)。
    • 模块系统加 note 字段:面板显示各模块取舍。免登录列明取舍——纯只读、看不到评论 IP 属地(与「评论属地」不可兼得)、1080p 上限官方试看、仅未登录生效。

    三 agent 并行审查后硬化:responseText 补 responseType 守卫、rewriteRequest 只签 一次、wbi key 按天失效、Request 请求用克隆保 headers/signal、installNetHook 幂等。 设计与逆向记录见 docs/RESEARCH-no-login.md。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.4.3 03.07.2026.

    feat(feed): 抽屉「网页全屏」打开方式 + 首帧揭幕(回应 #2)

    Issue #2 提到「抽屉能否默认网页全屏、更沉浸」,本次实现:

    • 打开方式新增「抽屉 · 网页全屏」:抽屉打开后由 iframe 内 Core 点一次 B 站原生「网页全屏」按钮,播放器铺满抽屉、隐去评论与推荐。
    • 「隐藏切换过程」开关(默认开,仅网页全屏时显示):加载遮罩留到播放器 铺满后再撤,全程看不到「普通页 → 切满」过渡;关则尽早显示、会瞥见切换。
    • 抽屉揭幕时机从 iframe load 改到「首帧就绪」(readyState≥2 / loadeddata / canplay),赶在真正开播/出声之前撤遮罩——揭幕即见首帧、声音不先于画面。
    • Core 侧把网页全屏点击 + 首帧检测两处轮询合并为单循环,网页全屏按钮 只点一次(防再点把全屏切回去、来回横跳)。
    • 打开方式 / 封面预览 面板文案精简:标签砍短、底部说明逐项对比。

    Feed 0.3.0→0.3.1 / Core 0.4.2→0.4.3

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.4.2 03.07.2026.

    feat: 封面「真视频」秒开预览 (MSE);Feed 0.2.2→0.3.0 / Core 0.4.1→0.4.2

    hover 封面用 MSE 只取 init + 头几秒 dash 分段边播边补,起播接近手机 App 原生, 热门冷门都覆盖。关键:分段字节走浏览器 fetch(原生同法,bilivideo 对本源放行 CORS、冷门也回 206),绕开 CDN 对 GM 请求的反爬 403;GM 仅作兜底。

    Feed(0.3.0):

    • src/lib/wbi.ts:web wbi 签名(nav 密钥按天缓存,失败不长缓存以免整会话失效)。
    • src/feed/play-url.ts:wbi playurl 取 dash 最低清 AVC 轨(含 PCDN→upos 去化 + 镜像) 与 durl 回退;仅缓存成功结果,瞬时失败自愈。
    • src/feed/mse-preview.ts:MediaSource/ManagedMediaSource 通用;sidx 精确分段;连续 按需补拉、总字节封顶 8MB(内存有界,loop 复播);dispose 拆除、看门狗回退 durl。
    • src/feed/video-preview.ts:真视频/雪碧图/关闭 三态;hover 500ms 防误触、平滑淡出、 时长转「当前/总时长」;窗口化移除卡片经 teardown 彻底拆除(杜绝 zombie 补拉/泄漏)。
    • src/feed/feed.ts:teardownCard 接窗口化移除;grid 宽变 ResizeObserver 作废布局缓存。
    • 三 agent 并行代码审查后的修复:MSE 泄漏/内存封顶/补拉游标/负缓存/竞态等。

    Core(0.4.2):

    • src/core/panel.ts:新增「封面预览」面板项(真视频/雪碧图/关闭)。
    • src/modules/no-track:埋点拦截默认不再拦 x/web-goblin(那是反爬校验,拦掉会让首页 陷入重载循环——测试中实测发现)。

    探针实测原生 hover(diag/home-hover-probe)→ 调研文档 docs/RESEARCH-mse-preview.md。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.4.1 03.07.2026.

    fix(core): 埋点面板开关+小字排版不再挤成一排;build:core 不清空 dist

    • panel:toggle 字段改列布局——标签+开关同一行(toggle-head),hint 落到 下一行。原先 hint 被塞进 .field row 与标签/开关抢横向空间,挤成一团。 对所有带 hint 的开关生效。Core 0.4.0→0.4.1。
    • vite.config:加 emptyOutDir:false,单跑 build:core 不再删掉 dist 里的 bilikit-feed.user.js(两产物同放 dist/,现已入库并被 GreasyFork 同步)。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.4.0 03.07.2026.

    feat(core): 新增「埋点拦截」模块,Core 0.3.1→0.4.0

    页面世界 hook fetch/XHR/sendBeacon,拦掉行为遥测(data.bilibili.com/log/web 等)与广告投放(cm.bilibili.com),命中即短路不发起。首页性能探针实测: 空闲 72s 内约 65% 请求为埋点/广告(data.bilibili.com 一家占 62%、~4.7 次/s), 拦掉零功能损失、页面无感。

    • src/modules/no-track:三通道拦截,与 cdn-pick 的 fetch/XHR 包裹链式共存; 广告拦截可单独关(blockAds toggle)、支持自定义黑名单(textarea), 改设置即时生效(监听 SETTINGS_EVENT)。
    • diag/home-profiler.user.js:只观测不改写的首页诊断探针(定时器/网络/长任务/ DOM 增长),纯文本报告规避 Safari console.table 复制成空行的问题。
    • README / greasyfork-core 文案补「埋点/广告拦截」一条。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.3.1 02.07.2026.