Greasy Fork is available in English.
通过拦截一些特定 Bilibili 接口请求或响应,让你的体验能够像登录用户一样丝滑
当前为
以视频页为例,服务端渲染时会根据用户 cookie 注入 window.__playinfo__,其中包含初始的视频 CDN 地址,未登录用户只能获取最高480p的视频(只有360p只是因为前端限制)。
core.[hash].js(基于 NanoPlayer)。core 会被挂载在window.nano身上,挂载完毕后被脚本调用 nano.createPlayer(primarySetting, theme) 创建播放器实例,挂载到window.player。primarySetting包含从window.__playinfo__读取的视频CDN。core都会从window.__playinfo__身上获取CDN地址然后首先加载several video segments保证用户体验。core会对/x/player/wbi/v2发起请求,除了包含一些视频信息,还包含user的一些信息,比如ip,level,mid(也就是uid,未登录返回null,这条响应信息会控制player widget的方法调用逻辑及以何种方式渲染,如图)。core在最后会加载npd.[nanoId].[hash].js,video.[hash].js。前者是一些控件用于组装player,不仅包括ui,它们身上都挂载了一些方法,比如切换画质(setQuality),跳转视频进度(seeking)等;后者用于在player组装完成后load header,以及评论区的lazy load。未登录时,core会读取 localStorage.bpx_player_profile 来获取默认分辨率,是否开启弹幕,是否试看高分辨率等状态,clear此item能刷新试看次数。未登录状态能试用高分辨率,说明未登录就能一直试用高分辨率。
点击试看会请求/x/player/wbi/playurl接口,这两个参数不可少qn=80,try_look=1,下表qn对应分辨率:
| QualityNumber | Resolution | | :------------ | :---------- | | 120 | 超清 4K | | 112 | 高清 1080P+ | | 80 | 高清 1080P | | 64 | 高清 720P | | 32 | 清晰 480P | | 16 | 流畅 360P |
video.[hash].js被core调用后,它会对/x/web-interface/nav发起请求。请求结果包含用户的一些详细信息。bili-header.umd.js被加载,用于生成页面顶部的header部分,nav接口返回的数据用于右上角个人中心的信息加载。bili-comment.[hash].js被加载,当向下滑动被调用用于懒加载评论区数据,评论区是否被遮罩取决于nav返回的信息中是否为登录用户。web.min.js被加载用于请求/x/v2/reply/wbi/main获取评论列表,实测当cookie中包含buvid3时只会加载三条评论,不包含buvid3时正常加载评论但缺少ip属地信息。展开评论会请求x/v2/reply/reply。自请求playurl,拿到响应替换window.__playinfo__之前,阻塞core创建player。但是注意到当设置__playinfo__为null,core会发出playurl请求,可以在此时拦截它,获取响应结果时切换成1080p分辨率。
拦截playurl请求,添加参数try_look=1,改qn=80,去掉w_rid,wts并根据参数重新生成。
拦截nav接口响应,伪造登录格式json达到伪登录目的,弹窗,评论区遮罩一次性解决。
拦截main和reply请求,去除cookie获取所有评论数据。
player拿到playurl时请求最高分辨率或者常用分辨率,以及鼠标悬浮视频页右侧视频列表时控制台会报错。