共享 B 站大会员的油猴脚本

 

上次买的一年半 B 站大会员到期了, 感觉一共没追几部番真是血亏, 而且新番一鸽再鸽质量还飘忽不定(三体说的就是你), 完全没有继续充值大会员的欲望.

之前网上冲浪的时候无意中看到过一个所谓的 “B 站大会员解析”, 实际上是通过服务器端共享的 Cookie 去访问获取视频链接的接口, 解析出完整的视频链接替换掉网页的试看视频.

于是直接找同学分享给我了一个大会员账号的 Cookie, 尝试复刻出这个 “解析脚本”.

这样不会污染别人的历史记录和推荐, 也可以用自己的账号发送弹幕和评论.


首先是直接 F12 抓包找到了番剧解析出视频直链的地址, 先用 Fiddler 来进行了一个 proof-of-concept 来确定这个方法现在还能用.

在 Fiddler Script 中编写非常简单的脚本就能替换对应请求的 Cookie.

1
2
3
4
if (oSession.uriContains("pgc/player/web/v2/playurl")) {
oSession.oRequest.headers.Remove("Cookie");
oSession.oRequest.headers.Add("Cookie", "xxx");
}

发现这样是可行的, 直接就可以用自己的账号看大会员专属视频了, 但要一直开着 Fiddler 看 B 站确实是不太方便, 所以打算把这个功能写成油猴脚本: https://gist.github.com/lyc8503/614f9d62c1b00175867fe0efc93c374f (有油猴的话点进去直接点击 Raw 就能安装了)

油猴本身没有提供拦截修改 Http 请求的功能, 所以只能自行替换劫持 XHR 的 Api 来进行, 代码类似于这样.

1
2
3
4
5
6
7
8
const oriSend = XMLHttpRequest.prototype.send
XMLHttpRequest.prototype.send = function() {
if (this._url.includes("pgc/player/web/v2/playurl") && this._url.startsWith("//api.bilibili.com")) {
// Do your own things here!
} else {
oriSend.apply(this, arguments);
}
};

我这里选择了使用 GM_xmlhttpRequest 来发起真正的请求, 可以通过传入 anonymous 参数删掉原有的 http-only Cookie 并写入自己的 Cookie.

B 站这里还对 Referer 进行了检查, 对于油猴来说也不是问题, 直接传入 Referer 到 headers 参数即可.

1
2
3
4
5
6
7
8
9
10
11
12
GM_xmlhttpRequest({
method: this._method,
url: "https:" + this._url,
anonymous: true, // 不携带原有 Cookie
headers: {
"Cookie": vip_cookie, // 使用大会员 Cookie
"Referer": location.href
},
onload: (args) => {
this.onload(args)
}
})

不过 GM_xmlhttpRequest 的 API 与原本 XMLHttpRequest 的 API 还是有所不同, 比如要将获得的响应体结果放入 xhr 对象中, 要在 xhr 的 getAllResponseHeaders 调用时返回正确的结果. (否则 B 站的 js 会报错)

通过不断打断点和单步步入可以找到所有出现问题的 API 并修好, xhr 中的 responseText 等一些属性没有 setter 所以不能修改, 可以用下面这种方法强行覆写.

1
2
3
Object.defineProperty(this, 'statusText', {
get: () => args.statusText
})

最后获取的响应中, 还有 need_vip 用于指示某个分辨率是否为大会员专属, 如果不修改就只能用 1080P 或以下的清晰度观看, 选择更高的分辨率还是会弹出购买大会员弹窗. (因为其他的接口返回的信息表明我并不是大会员)

不过既然都已经劫持了请求, 直接查找替换即可解锁所有分辨率.

本文采用 CC BY-NC-SA 4.0 许可协议发布.

作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/bilibili-share-vip/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬