侧边栏壁纸
博主头像
いちごみるく

行动起来,活在当下

  • 累计撰写 70 篇文章
  • 累计创建 48 个标签
  • 累计收到 55 条评论

目 录CONTENT

文章目录

历史实验:iOS 客户端改写 Bilibili 播放 API 请求

历史实验。 本文讨论 2023 年 iOS 客户端的 Bilibili 请求改写。Surge、Shadowrocket、Stash 与 Loon 的脚本格式和功能需要分别适配,不能把示例当作跨客户端可直接使用的播放模块。

一、当时遇到的问题

2023 年“解除 B 站区域限制”脚本出现账号授权故障,相关issue #1249记录了当时现象。它不能证明今天的脚本仍有同一问题,也不应把复制第三方 access key 的历史临时办法作为当前登录步骤。

相关项目可查看 Biliverse/Roaming。本文讨论的是我在 2023 年进行的请求改写实验,独立于该项目,不代表其当前功能或正式发布的兼容模块。

二、转发链的真实条件

当时目标是把 api.bilibili.com、app.bilibili.com 和 grpc.biliapi.net 的部分播放请求,送到分别对应的自建 HTTPS 反代域名。

客户端可处理的请求 → 本地 HTTPS MITM/改写 → 自建域名 → 原 API

它需要客户端能处理该请求的 HTTP/TLS 形式,自建服务保留方法、请求体、签名参数和必要响应元数据,账号授权与内容许可也必须成立。原生 gRPC 不只是“一个 POST”;HTTP/2、二进制 protobuf 和 trailers 等都需要支持。CloudFront 当前还需显式启用其 gRPC 行为,见官方设置。Workers 普通 HTTP 例子也不能自动等价为 gRPC 服务。

入口 IP、CDN 机房标签和实际回源出口不同。请求代理的 API 地区结果不能证明媒体链路相同,也不能保证会员内容或所有客户端可用。各产品费用和额度需按CloudFront 定价等实际方案核对。

三、Surge 请求改写示例

将查询字符串简单拆成键值对象,可能丢失重复参数、截断含 = 的值或改变签名输入。下面只替换 HTTPS authority,完整保留路径与原始查询字符串。域名全部是占位值,需换为自己管理并已配置证书的反代域名。

const targets = {
  "api.bilibili.com": "api.example.com",
  "app.bilibili.com": "app.example.com",
  "grpc.biliapi.net": "grpc.example.com"
};

function rewrite(input) {
  const match = /^https:\/\/([^/?#]+)(?=[/?#]|$)/i.exec(input);
  if (!match) return null;
  const target = targets[match[1].toLowerCase()];
  if (!target) return null;
  return {
    host: target,
    url: "https://" + target + input.slice(match[0].length)
  };
}

const changed = rewrite($request.url);
if (!changed) {
  $done({});
} else {
  const headers = { ...$request.headers };
  for (const key of Object.keys(headers)) {
    if (key.toLowerCase() === "host") delete headers[key];
  }
  headers.Host = changed.host;
  $done({ url: changed.url, headers });
}

Surge 的请求脚本返回 url 不会自动修改 Host,需像上面同步处理;不读取请求体时也不应修改二进制 body。其官方请求脚本文档是字段含义的依据。这个示例只处理 URL 与 Host,不包含当前 Bilibili 签名、gRPC 或完整播放流程的适配。

仅针对历史 HTTP API 的模块片段可以是:

[Script]
BiliAPI-test = type=http-request,pattern=^https://api\.bilibili\.com/pgc/(?:player/web/playurl|view/web/season)(?:\?|$),script-path=https://scripts.example.com/BiliAPI.request.js,requires-body=false

[MITM]
hostname = %APPEND% api.bilibili.com

先核实实际请求路径和 Surge 版本,只对需要的域名启用 MITM。客户端 MITM 证书及其私钥必须由自己管理;公共解析服务可能收到账号凭据。不要把这个 Surge 片段原样当作 Shadowrocket、Stash 或 Loon 的配置,也不要给全部域名开启 MITM。

适配其他客户端时,应按其官方格式处理字段、正则转义与 MITM 域名,并逐项测试实际请求。重复字段、未转义的域名正则或不一致的 MITM 范围,都可能让规则失效或匹配到错误请求。

四、历史结果与重新验证方法

2023 年实验效果

2023 年播放记录

重新验证时记录 iOS/客户端/Bilibili 版本、实际请求路径、HTTP 与业务错误码、账号权限,以及播放/搜索/登录各路径的结果。只测试一个番剧或拿到 HTTP 200,不足以证明所有客户端与功能均可用。使用公共服务器前,还应独立确认维护者、证书和凭据处理方式。

相关 CDN 实验均按历史范围阅读:Workers、CloudFront、Gcore。

0

评论区