Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

屏蔽B站的p2p视频分发CDN #70

Closed
fengguowudi opened this issue Sep 5, 2023 · 4 comments
Closed

屏蔽B站的p2p视频分发CDN #70

fengguowudi opened this issue Sep 5, 2023 · 4 comments
Labels
v1.0.9 v1.0.9 开发计划 v1.0.11 v1.0.11 开发计划 优化 something need to optimization 功能 New feature or request

Comments

@fengguowudi
Copy link

目标

避免分配到低质量视屏线路

解决方案

屏蔽pcdn以及mcdn域名和mcdn端口

其他

https://greasyfork.org/zh-CN/scripts/415714-make-bilibili-great-again

但是该功能可能会导致有的视频播放链接错乱或无法播放。但是概率很小。

@guozhigq
Copy link
Owner

guozhigq commented Sep 5, 2023

看了一下,应该可以实现,预计v1.0.8上线。

@guozhigq guozhigq added 功能 New feature or request v1.0.8 v1.0.8 开发计划 labels Sep 5, 2023
@cxw620
Copy link

cxw620 commented Sep 7, 2023

看了一下,应该可以实现,预计v1.0.8上线。

可替换到的 Host 可参考: the1812/Bilibili-Evolved#3234 (comment).

建议给个设置, title 阻止视频通过 PCDN 加载, summary 可一定程度上优化视频加载速度,以实际情况为准.

需要指出, https://greasyfork.org/zh-CN/scripts/415714-make-bilibili-great-again 里面对 MCDN 的操作是可能有问题的, 部分 MCDN 类型的视频链接不能直接替换 Host, 而且也不够全面, 没处理 BCache CDN 的情况. 替换操作可以参考参考我一番摸索出来的逻辑(虽然是用在 LSPosed 模块的, 不过只需要看替换 UPOS 的逻辑, 问题不大), 验证过是没问题的, 相当稳定: https://github.com/cxw620/BiliRoamingH/blob/me/app/src/main/java/me/iacn/biliroaming/hook/UposReplaceHook.kthttps://github.com/cxw620/BiliRoamingH/blob/me/app/src/main/java/me/iacn/biliroaming/utils/UposReplaceHelper.kt

特别地, 如果遇到 MCDN 类型的 CDN, 可以使用 proxy-tf-all-ws.bilivideo.com 进行代理, 速度也 OK. 用法: 假设原视频链接为 https://xxxxx.mcdn.bilivideo.cn/test/path, encode 后作为 url 参数, 即最终得到 https://proxy-tf-all-ws.bilivideo.com/?url=https%3A%2F%2Fxxxxx.mcdn.bilivideo.cn%2Ftest%2Fpath

更多地, 如果有计划迁移通过 gRPC 获取视频 Playurl, 还可以通过设定网络类型为 免流 规避分发 PCDN / MCDN / BCache CDN. 但是似乎包括本项目在内, 第三方 APP 都走的 web 的 playurl 接口, 就不展开了.
P.S. 也可以请求 B 站 API 时强制走 IPv6, 但是考虑到大部分时间都用 Wifi, 但是安卓不支持 DHCPv6, 无状态 v6 除非是路由器拨号而不是光猫拨号(或者把光猫过来的网线插 LAN 口把路由器当交换机用)才能拿到, 所以此法也不怎么可行.

@guozhigq
Copy link
Owner

guozhigq commented Sep 9, 2023

看了一下,应该可以实现,预计v1.0.8上线。

可替换到的 Host 可参考: the1812/Bilibili-Evolved#3234 (comment).

建议给个设置, title 阻止视频通过 PCDN 加载, summary 可一定程度上优化视频加载速度,以实际情况为准.

需要指出, https://greasyfork.org/zh-CN/scripts/415714-make-bilibili-great-again 里面对 MCDN 的操作是可能有问题的, 部分 MCDN 类型的视频链接不能直接替换 Host, 而且也不够全面, 没处理 BCache CDN 的情况. 替换操作可以参考参考我一番摸索出来的逻辑(虽然是用在 LSPosed 模块的, 不过只需要看替换 UPOS 的逻辑, 问题不大), 验证过是没问题的, 相当稳定: https://github.com/cxw620/BiliRoamingH/blob/me/app/src/main/java/me/iacn/biliroaming/hook/UposReplaceHook.kthttps://github.com/cxw620/BiliRoamingH/blob/me/app/src/main/java/me/iacn/biliroaming/utils/UposReplaceHelper.kt

特别地, 如果遇到 MCDN 类型的 CDN, 可以使用 proxy-tf-all-ws.bilivideo.com 进行代理, 速度也 OK. 用法: 假设原视频链接为 https://xxxxx.mcdn.bilivideo.cn/test/path, encode 后作为 url 参数, 即最终得到 https://proxy-tf-all-ws.bilivideo.com/?url=https%3A%2F%2Fxxxxx.mcdn.bilivideo.cn%2Ftest%2Fpath

更多地, 如果有计划迁移通过 gRPC 获取视频 Playurl, 还可以通过设定网络类型为 免流 规避分发 PCDN / MCDN / BCache CDN. 但是似乎包括本项目在内, 第三方 APP 都走的 web 的 playurl 接口, 就不展开了. P.S. 也可以请求 B 站 API 时强制走 IPv6, 但是考虑到大部分时间都用 Wifi, 但是安卓不支持 DHCPv6, 无状态 v6 除非是路由器拨号而不是光猫拨号(或者把光猫过来的网线插 LAN 口把路由器当交换机用)才能拿到, 所以此法也不怎么可行.

好的,感谢。
代码没太看得懂,【替换 UPOS 的逻辑】指的是把MCDN类型跟BCache CDN类型进行替换吗,那为什么【遇到 MCDN 类型的 CDN, 可以使用 proxy-tf-all-ws.bilivideo.com 进行代理】,这两种处理方式有什么区别吗

@cxw620
Copy link

cxw620 commented Sep 9, 2023

前言: 我的 comment 里面区分的 MCDN 和 PCDN 其实最近差别不大了, 只是个名头, 在此特别限定, authority 包含了 szbdyd.com, .mcdn.bilivideo 以及只是个 IP:Port 都是 PCDN. szbdyd.com, 江西节点之家, 迅雷家的 PCDN, 最近少见了, .mcdn.bilivideo 是 B 站采购各大 PCDN 提供商的带宽资源的域名, 目前绝对的主力, 视频和直播都会用, IP:Port 样式的实际上是 mcdn.bilivideo 把域名解析为 IP 而已.

首先判断是否为 PCDN: contains("szbdyd.com") || contains(".mcdn.bilivideo") || contains(ipPCdnRegex), ipPCdnRegex 为 ^https?://\d{1,3}\.\d{1,3}.

如果是 PCDN, 那么再细分. 对于 szbdyd.com 这种, query 里面一定有个 xy_usource 参数, 就是原来的 Mirror 类型的 CDN, 直接替换为 xy_usource 的值即可; 对于 .mcdn.bilivideo 这种, 我记得原来是可以直接替换的, 但现在不行了, 只能用前面提到过的方法处理, IP:Port 的同理.

如果不是, 再判断是否为 BCache 类型的 CDN, regex: cn-.*\.bilivideo\.(com|cn). 这玩意是 B 站自建的 CDN, 质量嘛一言难尽, 尤其是跨运营商时或者晚高峰时延迟带宽经常爆炸, 但有些地区质量不错, 例如四川那边小机房比较多带宽便宜大碗, 带宽给得足. 不过大部分情况下比不过大厂的 Mirror 型的. 要不要替换你自己考量考量, 或者弄个高级选项让用户自行决定.

经过上述判断后剩下的就是 Mirror 型的或者免流用的了, 速度佳, 不予处理.

此外, 观察发现一般 baseUrl 都是垃圾的 CDN, 但是 backupUrls 里面就有 Mirror 型的了, 能不替换就不替换. IPv6 环境下就相当干净舒服了, 所以如果可以的话加入个逻辑, IPv6 环境下强制走 v6. 最好应用程序内绕过系统 DNS 通过 DoH 解析, 免得地方 DNS 运营商抽风, 像官方 APP 就有 HTTPDNS, 优先采用 HTTPDNS 的结果, 失败再 fallback 到系统 DNS, flutter 我不熟悉清楚是否有相关的最佳实践.

以上仅能用于视频的 playurl, 直播的不能随意替换, 我也没搞清楚规则.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
v1.0.9 v1.0.9 开发计划 v1.0.11 v1.0.11 开发计划 优化 something need to optimization 功能 New feature or request
Projects
Status: Done
Development

No branches or pull requests

3 participants