BBLL
BBLL copied to clipboard
能关掉万恶的PCDN和MCDN吗?
B 站 CDN 分类
根据自己打开不同热度不同类型的视频结合网上搜集的信息,大致分为以下几种:
服务商 CDN
upos-sz-mirror****.bilivideo.com
看域名应该是服务商方案
腾讯:cos,cosb,coso1,coso2,bos
金山:ks3,ks3b,ks3c,ks32
七牛:kodo,kodob
华为:hw,hwb,uphw,js
阿卡迈(海外):akamai
自建 CDN (?)
cn-****-dx-v-**.bilivideo.com
可能是 B 站的自建服务器其中可以看到省份和城市首字母缩写
MCDN
xxxxx(ip地址).mcdn.bilivideo.com
xy99x999x99x99xy.mcdn.bilivideo.cn
查了一圈只在京东云发现了 [MCDN](https://docs.jdcloud.com/cn/mcdn/product-overview),可能是京东云无线宝相关?也可能是京东云+无线宝相互配合?
怀疑 MCDN 包含无线宝的原因是 IP 段为家宽段
PCDN
********.v1d.szbdyd.com
到这就完全看脸了,各个地区上行带宽不可控,你连接到的节点与你的距离不可控,极端环境下甚至无法顺利播放 1080+
目前发现app在播放视频时会连接MCDN,导致速度巨慢无比还可能会报错,问下大佬能关掉PCDN和MCDN,走服务商CDN吗?
好像不太行,看接口返回都固定的。我还得研究研究
就是因为CDN的原因 身在国外 BBLL无法打开任何视频 浏览器倒是没问题 看了下BBLL连接的是cn-hk-eq-01-07.bilivideo.com 浏览器脸的是upos-hz-mirrorakam.akamaized.net
好像不太行,看接口返回都固定的。我还得研究研究
接口会返回一个backup_url,一般都不是mcdn
好像不太行,看接口返回都固定的。我还得研究研究
// 去 P2P CDN Object.defineProperty(unsafeWindow, 'PCDNLoader', { value: class { }, enumerable: false, writable: false }); Object.defineProperty(unsafeWindow, 'BPP2PSDK', { value: class { on() { } }, enumerable: false, writable: false }); Object.defineProperty(unsafeWindow, 'SeederSDK', { value: class { }, enumerable: false, writable: false }); if (location.href.startsWith('https://www.bilibili.com/video/') || location.href.startsWith('https://www.bilibili.com/bangumi/play/')) { let cdnDomain;
function replaceP2PUrl(url) {
cdnDomain ||= document.head.innerHTML.match(/up[\w-]+\.bilivideo\.com/)?.[0];
try {
const urlObj = new URL(url);
const hostName = urlObj.hostname;
if (urlObj.hostname.endsWith(".mcdn.bilivideo.cn")) {
urlObj.host = cdnDomain || 'upos-sz-mirrorcoso1.bilivideo.com';
urlObj.port = 443;
console.warn(`更换视频源: ${hostName} -> ${urlObj.host}`);
return urlObj.toString();
} else if (urlObj.hostname.endsWith(".szbdyd.com")) {
urlObj.host = urlObj.searchParams.get('xy_usource');
urlObj.port = 443;
console.warn(`更换视频源: ${hostName} -> ${urlObj.host}`);
return urlObj.toString();
}
return url;
} catch (e) {
return url;
}
}
function replaceP2PUrlDeep(obj) {
for (const key in obj) {
if (typeof obj[key] === 'string') {
obj[key] = replaceP2PUrl(obj[key]);
} else if (typeof obj[key] === 'array' || typeof obj[key] === 'object') {
replaceP2PUrlDeep(obj[key]);
}
}
}
replaceP2PUrlDeep(unsafeWindow.__playinfo__);
(function (open) {
unsafeWindow.XMLHttpRequest.prototype.open = function () {
try {
arguments[1] = replaceP2PUrl(arguments[1]);
} finally {
return open.apply(this, arguments);
}
}
})(unsafeWindow.XMLHttpRequest.prototype.open);
}