Skip to content

自建解析服务器

LoveSy edited this page May 28, 2022 · 10 revisions

前言

由于biliplus停止解析,哔哩漫游插件需要自定义解析服务器才可正常工作。解析服务器仅用于反代播放地址,因而无需高流量高带宽服务器。

开源实现

以下是一些开源的服务端实现,比直接反代提供更多功能

技术细节

  • 对于港澳台、中国大陆番剧,会从/pgc/player/api/playurl获取播放地址,反代上有应为api.bilibili.com
  • 对于泰国、东南亚番剧,会从/intl/gateway/v2/ogv/playurl获取播放地址,反代域名应为api.global.bilibili.com;从/intl/gateway/v2/app/subtitle获取字幕,反代上游应为app.global.bilibili.com(注意跟播放地址的上游不一样);从/intl/gateway/v2/app/search/type获取搜索结果
  • 解析服务器必须有域名(可以自己获取免费二级域名),并且必须使用https(可以使用acme.sh+80端口免费申请),以防止中间人攻击
  • 不同区域可以用不同三级或以上域名区分,也可以检查URI中area参数,目前有的参数为:cn中国大陆;hk香港tw台湾th泰国、东南亚
  • 如果你的ip使用量大,b站会暂时封禁该ip,这时候应该加入解析结果缓存、限制单个用户(检查access_key)请求次数等
  • 漫游带有http_x_from_biliroaming的头,头内容会带上漫游版本,可以检查该头防止滥用,未来还能用于版本检查以解决可能会有的兼容问题
  • 由于漫游使用轮询方式从不同区域服务器尝试请求播放地址,所以建议使用缓存code=-10493的请求,且不需要再刷新结果
  • 如果请求量比较大,可以缓存播放地址,获取的地址最多有两个小时有效期,因此可以缓存一到两个小时,不过需要注意检查用户是否有权限获取播放地址(仅大会员或仅已付费)

港澳台、中国大陆番剧反代参考

用nginx反代实现,参考配置如下:

server
{
    server_name bili.example.com;  # 设置域名为bili.example

    listen 443 ssl http2;          # 务必使用https,如有需要也可以同时监听ipv6

    client_max_body_size 128M;

    location /pgc/player/api/playurl {  # 只反向代理该路径的请求
      proxy_pass https://api.bilibili.com;  # 转发到b站服务器
      if ($http_x_from_biliroaming ~ "^$") {  # 模块请求都会带上X-From-Biliroaming的请求头,为了防止被盗用,可以加上请求头判断
        return 403;
      }
    }

    # RSA certificate
    ssl_certificate     /etc/nginx/ssl/example.com/full.pem;  # 证书路径
    ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
}

泰国、东南亚番剧反代参考

用nginx反代实现,参考配置如下(注意反代字幕接口不然没有字幕):

server
{
    server_name bili.example.com;  # 设置域名为bili.example

    listen 443 ssl http2;          # 务必使用https,如有需要也可以同时监听ipv6

    client_max_body_size 128M;

    location /intl/gateway/v2/ogv/playurl {  # 只反向代理该路径的请求
      proxy_pass https://api.global.bilibili.com;  # 转发到b站服务器
      if ($http_x_from_biliroaming ~ "^$") {  # 模块请求都会带上X-From-Biliroaming的请求头,为了防止被盗用,可以加上请求头判断
        return 403;
      }
    }

    location /intl/gateway/v2/app/subtitle {  # 还有字幕请求
      proxy_pass https://app.global.bilibili.com;  # 转发到b站服务器,注意跟播放地址上游不一样
      if ($http_x_from_biliroaming ~ "^$") {  # 模块请求都会带上X-From-Biliroaming的请求头,为了防止被盗用,可以加上请求头判断
        return 403;
      }
    }
    location /intl/gateway/v2/app/search/type {  # 还有搜索请求
      proxy_pass https://app.global.bilibili.com;  # 转发到b站服务器,注意跟播放地址上游不一样
      if ($http_x_from_biliroaming ~ "^$") {  # 模块请求都会带上X-From-Biliroaming的请求头,为了防止被盗用,可以加上请求头判断
        return 403;
      }
    }
    # RSA certificate
    ssl_certificate     /etc/nginx/ssl/example.com/full.pem;  # 证书路径
    ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
}

目前有许多开源代理服务端,实现了缓存、黑白名单、区域检查等功能,可以自行寻找使用。

API 请求签名

B 站的 API 请求都有一个 sign 字段,就是把请求参数按 key 的字典序排序,加上 appKey 和 secretKey 之后算一个 MD5。这里提供 appKey 和 secretKey:

client appKey secretKey 说明
android 1d8b6e7d45233436 560c52ccd288fed045859ed18bffd973 粉版
android_i bb3101000e232e27 36efcfed79309338ced0380abd824ac1 play版
android_b 07da50c9a0bf829f 25bdede4e1581c836cab73a48790ca6e 概念版
android_tv 4409e2ce8ffd12b8 59b43e04ad6965f34319062b478f83dd 电视版
biliLink 37207f2beaebf8d7 e988e794d4d4b6dd43bc0e89d6e90c43
android_bilithings 8d23902c1688a798 710f0212e62bd499b8d3ac6e1db9302a
bstar_a 7d089525d3611b1c acd495b248ec528c2eed1e862d393126 东南亚版
android_mall_ticket 4c6e1021617d40d9 e559a59044eb2701b7a8628c86aa12ae
bili_scan 9a75abf7de2d8947 35ca1c82be6c2c242ecc04d88c735f31
ai4c_creator_android 9d5889cf67e615cd 8fd9bb32efea8cef801fd895bef2713d
android_ott_sdk c034e8b74130a886 e4e8966b1e71847dc4a3830f2d078523
android_hd dfca71928277209b b5475a8825547a4fc26c7d518eaaa02e HD版
angu_android 50e1328c6a1075a1 4d35e3dea073433cd24dd14b503d242e