注:
proto 结构体文件按照包名分类, 同级放在同一目录中
gRPC 接口定义全部来自对官方粉版(即大陆版本) APP 的逆向工程, 一般不会有错误, 但是可能有更新, 有实际应用需求的建议自行反编译 APP, 定位到 com.bapis.* 自行补足.
B 站客户端的 gRPC 接口主机包括:
grpc.biliapi.net 原生 gRPC 接口app.bilibili.com Failover gRPC 接口实际应用中, 后者速度相对更快. 但是需要设置如 gRPC 超时时间等参数时只能使用前者.
需要在 Metadata 中添加 authorization: identify_v1 {access_key}.
参考 gRPC Go 官方文档 对 Metadata 的说明.
gRPC 的 Metadata 简单理解,就是 HTTP 的 Header 中的 key-value 对, 本质上是一个 Map. 在 gRPC Metadata 中,key 永远是 String,但是 value 可以是 String 也可以是二进制数据. 需要存储二进制数据时, key 应当加上一个 -bin 后缀, 同时二进制 value 应当编码为 Base64.
一般而言, 设定 Binary 类型的 Metadata 时, 需要调用各个语言的 gRPC 库的相应方法, 库会帮我们编码二进制数据, 无需我们自行编码.
需要的 Metadata 包括(但不限于):
user-agent 客户端 UA, 如 Dalvik/2.1.0 (Linux; U; Android 12; {device_model} Build/{device_build}) {app_ver} os/android model/{device_model} mobi_app/{mobi_app} build/{app_build} channel/master innerVer/{app_build_inner} osVer/12 network/2 grpc-java-cronet/1.36.1(其中 grpc-java-cronet/1.36.1 为原生 gRPC 接口才需要的). 必需.
device_model 设备 Model, 如 NOH-AN01.device_build 设备 Build, 如 HUAWEINOH-AN01.app_ver APP 版本号, 如 7.38.0.mobi_app APP 包类型, 参考 APPKey.md.app_build APP 版本号, 如 7380300.app_build_inner APP 版本号(内部), 如 7380310. 实际应用中设置为 app_build 即可.x-bili-gaia-vtoken 暂时留空.x-bili-aurora-eid 如 UFUFQ1AA. 算法见附录. 未登录留空. 必需.x-bili-mid 用户 UID, 未登录默认为 0. 必需.x-bili-aurora-zone 留空. 必需.x-bili-trace-id 如 06e903399574695df75be114ff63ac64:f75be114ff63ac64:0:0. 算法见附录. 必需.authorization 鉴权, 登录时设定为 identify_v1 {access_key}, 未登录时无需此项.buvid 设备唯一标识, 算法见 device_identity.md. 必需(?).bili-http-engine 恒定为 cronet, 使用 grpc.biliapi.net 作为 gRPC 主机时无需此项.te 恒定为 trailers, Java gRPC 库固定添加, 使用 app.bilibili.com 作为 gRPC 主机时无需此项.x-bili-fawkes-req-bin 设备 Fawkes 信息, 使用 FawkesReq 生成. 必需.x-bili-metadata-bin 使用 Metadata 生成. 必需.x-bili-device-bin 设备信息, 使用 Device 生成. 必需.x-bili-network-bin 设备网络信息, 使用 Network 生成. 必需.x-bili-restriction-bin 限制信息, 使用 Restriction 生成. 本项一般直接传空值即可. 必需.x-bili-locale-bin 设备区域信息, 使用 Locale 生成. 必需.x-bili-exps-bin 使用 Exps 生成. 本项一般直接传空值即可. 必需.等待补充, 参见 proto 文件注释. 以下仅介绍常用接口:
B 站 gRPC API Golang 封装:XiaoMiku01/bilibili-grpc-api-go