【转载】【Bilibili】关于屏蔽 PCDN 的指引

原文链接 作者:陈寒彤

导语

PCDN 不是个新鲜玩意了。流媒体成本大头就是带宽,而 PCDN 作为降本的有力手段,牺牲一定用户体验的代价也不是不能接受,反正用户可能也就是怀疑一下自己网络有没有问题。PCDN 极不可控的网络质量,要是再加上视频平台的垃圾调度算法,用户体验极差。这里简要探讨 Bilibili 所使用的音视频资源 CDN 类型,以及对这些 “劣质” CDN 的正确屏蔽方式。

Bilibili 目前使用的音视频分发 CDN

早在 2023 年,笔者就总结过一次,不过过了两年有些许变动。

总体上,Bilibili 目前使用的音视频分发 CDN 包含以下四大类

  • Mirror 型域名符合 Regex ^upos-(sz|hz|bstar)-mirror([0-9,a-z]+)\.(bilivideo\.com|akamaized\.net)$ 的,归入此类。一个可能更准确的判断方式是看 URL 参数 os=ali 等(和 mirror 后面一直到 . 夹着的这段字符串一致。包括但不限于:
    • 阿里云 CDN:r^upos-sz-mirrorali([0-9,a-z]*)\.bilivideo\.com$
    • 腾讯云 CDN:r^upos-sz-mirrorcos([0-9,a-z]*)\.bilivideo\.com$
    • 华为云 CDN:r^upos-sz-mirror(hw|08[0-9,a-z]+)\.bilivideo\.com$
    • 百度云 CDN:upos-sz-mirrorbd.bilivideo.com
    • Cloudflare:r^upos-sz-mirrorcf([0-9,a-z]*)\.bilivideo\.com$
    • Akamaized:upos-hz-mirrorakam.akamaized.net特别地,带 ov 字样的为海外使用节点,如 upos-sz-mirroraliov.bilivideo.com;带 bstar 字样的为哔哩哔哩东南亚区域服务使用,如 upos-bstar-mirrorakam.akamaized.net。此类 CDN 为商业 CDN,质量最好。
  • UPOS 型可能的 Regex 为 upos-sz-estg([0-9,a-z]*).bilivideo.com,目前已知的 $1 包括 osshw 等。一个可能更准确的判断方式是看 URL 参数 os=upos。此类为直接从对象存储取资源,常见于冷门视频,质量一般(要回源取流,速度还好)。
  • BCache 型域名符合 Regex ^cn-.*\.bilivideo\.(com|cn)$ 的,归入此类。更准确的判断方式是看 URL 参数 os=bcache。此类属于自建机房,质量因地区而异,常见于热门视频。一般而言,四川、浙江宁波、河南等小型 IDC 比较多、带宽资源充足的地方质量会好点。
  • MCDN 型(PCDN 子类)域名包含 mcdn 字样的,归入此类。一个可能更准确的判断方式是看 URL 参数 os=mcdn。质量非常差。
  • 其他 PCDN 子类
    • IP:Port 型:形如 http://1.14.5.14:19198/v1/resource/*,在 APP 端未开启获取 HTTPS 视频流时会出现。
    • 迅雷 .*\.szbdyd\.com 型:现已停用?很久没见过了。

最理想的情况是只返回 Mirror 型的 CDN,速度最好,其余的一律认为劣质,其中最劣质的自然是 PCDN 子类下那些。

开发者见解

理想很丰满,现实很骨感。大多数情况下,Bilibili 采取主流分配最劣质的 PCDN,备份流给一个不那么劣质的以及一个 Mirror 型的 CDN 的调度策略,在主流不可用的时候 fallback。所以,简单地屏蔽 mcdn.bilivideo.cn 是个 tricky 但大部分情况下有效的做法。只不过在部分区域和部分劣质运营商网络环境下(如两广地区、移动宽带),部分非核心 UP 主的视频很有可能主流和备份流都是给的 MCDN,导致无限卡加载。

于是便有了更进一步的替换视频 Host 或主动使用备份流中优质 CDN 的方案。

  • 网页端,使用油猴脚本 Make Bilibili Great Again
  • APP 端,使用漫游模块(我当时贡献了屏蔽 PCDN 逻辑的开发,但现在没有维护,应该已经坏了);漫游 X 版本也是支持的,如果没有其他模块需求的话。
  • 第三方 APP ,已知 PiliPala 及衍生版本、Bili.Copilot 支持屏蔽 PCDN。

原理浅析

已知所有 BCache 型、所有 UPOS 型以及部分 MCDN 型的 playurl 可以简单替换 Host 为 Mirror 型。

问题

大部分情况下,简单替换 Host 是没问题的,但是存在一些特例。

特例 1

对于符合 Regex ((([0-9]{1,3}\.){3}[0-9]{1,3})|(.*\.mcdn\.bilivideo\.(com|cn|net))):[0-9]{1,5}/v1/resource 的 MCDN 型 playurl,不能替换视频 HostIP:Port 型的类似。(可能的)共同特征是 Path 以 /v1/resource 开头。此类 playurl 估计是 PCDN 特化,缺失参数 trid,把重组为正常的 playurl 的路子也堵了。对于此类,只能使用免流域名 proxy-tf-all-ws.bilivideo.com 进行代理(官方客户端便是如此)。前述部分开源方案只是简单替换,没有考虑到上面的问题,如油猴脚本,个人不会油猴脚本,期待有大佬解决。

特例 2

非 akamai 的视频链接不能替换为 akamai 的 host (不过一般也没这个需求),URL 参数存在差异。

总结

总结起来,一个较为合理的处理状态机如下:

特别地,对于 APP 端,还需要把播放器 preload 的逻辑干掉。preload 拿到的播放链接百分百是劣质 CDN。

终端用户处理

除了使用前面提到的开源项目,还有个比较简单且非侵入式的解决方案:强制 Bilibili 所有域名走 IPv6(极少数域名,如 r^s\d\.hdslb\.com$ 除外,不过这个域名最近好像有 V6 解析了)。原理是大部分 MCDN 都不支持 IPv6(但最近慢慢开始支持了,糟)。

需要注意:APP 端使用了 HTTP DNS 技术,需要使用 v2rayNG 等配置路由规则,强制重新解析以及走 v6 出口;网页端配个 DNS 就行。对于 APP 端,再补充一下就是要打开 HTTPS 加载视频流。

对于校园网用户,此方案还能免流(似乎高校 v6 都不计费?)。

如果用流量,恭喜,免流环境下只会分配优质 CDN(开发模块的可以在这里入手)。


转载者总结

网页端:

使用油猴脚本 Make Bilibili Great Again

具体功能
  • 真·原画直播
  • 去除充电列表展示
  • 去除 URL 上的跟踪参数
  • 禁用 P2P CDN 强制使用最贵的商业CDN 狠狠的烧阿姨的流量费
  • 去广告
  • 强制启用文章复制功能
  • 动态首页宽屏优化
  • 支持视频裁切(窗口/全屏播放时不留黑边,对 4096x2160 的视频有奇效)

或者使用Make-Bilibili-Great-Than-Ever-Before
这是 Make Bilibili Great Again 的分支,但使用 TypeScript 重写,尝试了一些实验性功能和实验性 API

具体功能
  • Disable Bilibili’s infinite request retry storm for Log Reporting and User Tracking by completely disable all of them
    彻底禁用 Bilibili 的日志报告和用户跟踪的无限请求重试风暴
  • Prevent Bilibili using AV1 codec to save money (on CR’s coffins) and burn your CPU/GPU.
    防止 Bilibili 使用 AV1 编解码器来省钱(在 CR 的棺材上)并烧毁你的 CPU/GPU。
  • Enhance Live (Force original stream quality and some other fixes)
    增强直播(强制原始流质量和一些其他修复)
  • Defuse article clipboard prevention and enables free copy
    解除文章剪贴板阻止并允许自由复制
  • Force enable 4K Player even on low-end device (like Chromebook or Linux device)
    即使在低端设备(如 Chromebook 或 Linux 设备)上也强制启用 4K 播放器
  • Prevent Bilibili from saving money (on CR’s coffins) by using cheap yet slow PCDN
    防止 Bilibili 通过使用廉价但缓慢的 PCDN 来省钱(在 CR 的棺材上)
  • Prevent Bilibili from saving money (on CR’s coffins) by stealing your bandwidth through WebRTC P2P
    防止 Bilibili 通过 WebRTC P2P 窃取你的带宽来省钱(在 CR 的棺材上)
  • Remove Homepage Ads and style optimization
    移除首页广告及优化风格
  • Story List Optimization 故事列表优化
  • Fit player video width 适合播放器视频宽度
  • Remove the black filter effect (RIP CR)
    去除黑色滤镜效果 (RIP CR)
  • Remove useless tracking parameters from URLs
    从 URL 中删除无用的跟踪参数
  • Remove HarmonyOS Fonts and enforce system default font
    删除 HarmonyOS 字体并强制使用系统默认字体

移动端:

总结

使用漫游 X模块、PiliPala或Bili.Copilot等其他第三方APP

7 个赞

移动端app可以用github上的bilibili开源第三方piliplus

油猴脚本好评 :akf11: