56 lines
26 KiB
JavaScript
56 lines
26 KiB
JavaScript
import{_ as i,c as r,a as l,b as a,d as n,e,w as p,r as t,o as c}from"./app-Dgsdh8A6.js";const D={};function d(y,s){const o=t("RouteLink");return c(),r("div",null,[s[25]||(s[25]=l('<h1 id="grpc-接口定义-protobuf-结构体" tabindex="-1"><a class="header-anchor" href="#grpc-接口定义-protobuf-结构体"><span>gRPC 接口定义(protobuf 结构体)</span></a></h1><p>注:</p><ol><li><p>proto 结构体文件按照包名分类, 同级放在同一目录中</p></li><li><p>gRPC 接口定义全部来自对官方粉版(即大陆版本) APP 的逆向工程, 一般不会有错误, 但是可能有更新, 有实际应用需求的建议自行反编译 APP, 定位到 <code>com.bapis.*</code> 自行补足.</p></li></ol><h2 id="grpc-主机" tabindex="-1"><a class="header-anchor" href="#grpc-主机"><span>gRPC 主机</span></a></h2><p>B 站客户端的 gRPC 接口主机包括:</p><ul><li><code>grpc.biliapi.net</code> 原生 gRPC 接口</li><li><code>app.bilibili.com</code> Failover gRPC 接口</li></ul><p>实际应用中, 后者速度相对更快. 但是需要设置如 gRPC 超时时间等参数时只能使用前者.</p><h2 id="grpc-鉴权" tabindex="-1"><a class="header-anchor" href="#grpc-鉴权"><span>gRPC 鉴权</span></a></h2><p>需要在 Metadata 中添加 <code>authorization</code>: <code>identify_v1 {access_key}</code>.</p><h2 id="grpc-metadata" tabindex="-1"><a class="header-anchor" href="#grpc-metadata"><span>gRPC Metadata</span></a></h2><p>参考 <a href="https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md" target="_blank" rel="noopener noreferrer">gRPC Go 官方文档</a> 对 <code>Metadata</code> 的说明.</p><p>gRPC 的 <code>Metadata</code> 简单理解,就是 HTTP 的 Header 中的 key-value 对, 本质上是一个 Map. 在 gRPC <code>Metadata</code> 中,key 永远是 String,但是 value 可以是 String 也可以是二进制数据. <strong>需要存储二进制数据时, key 应当加上一个 <code>-bin</code> 后缀, 同时二进制 value 应当编码为 Base64</strong>.</p><p>一般而言, 设定 Binary 类型的 <code>Metadata</code> 时, 需要调用各个语言的 gRPC 库的相应方法, 库会帮我们编码二进制数据, 无需我们自行编码.</p><p>需要的 <code>Metadata</code> 包括(但不限于):</p>',14)),a("ul",null,[a("li",null,[s[23]||(s[23]=n("Ascii 类 ")),a("ul",null,[a("li",null,[s[7]||(s[7]=a("code",null,"user-agent",-1)),s[8]||(s[8]=n(" 客户端 UA, 如 ")),s[9]||(s[9]=a("code",null,"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",-1)),s[10]||(s[10]=n("(其中 ")),s[11]||(s[11]=a("code",null,"grpc-java-cronet/1.36.1",-1)),s[12]||(s[12]=n(" 为原生 gRPC 接口才需要的). ")),s[13]||(s[13]=a("strong",null,"必需",-1)),s[14]||(s[14]=n(". ")),a("ul",null,[s[4]||(s[4]=l("<li><code>device_model</code> 设备 Model, 如 <code>NOH-AN01</code>.</li><li><code>device_build</code> 设备 Build, 如 <code>HUAWEINOH-AN01</code>.</li><li><code>app_ver</code> APP 版本号, 如 <code>7.38.0</code>.</li>",3)),a("li",null,[s[1]||(s[1]=a("code",null,"mobi_app",-1)),s[2]||(s[2]=n(" APP 包类型, 参考 ")),e(o,{to:"/docs/misc/sign/APPKey.html"},{default:p(()=>s[0]||(s[0]=[n("APPKey.md")])),_:1,__:[0]}),s[3]||(s[3]=n("."))]),s[5]||(s[5]=a("li",null,[a("code",null,"app_build"),n(" APP 版本号, 如 "),a("code",null,"7380300"),n(".")],-1)),s[6]||(s[6]=a("li",null,[a("code",null,"app_build_inner"),n(" APP 版本号(内部), 如 "),a("code",null,"7380310"),n(". 实际应用中设置为 "),a("code",null,"app_build"),n(" 即可.")],-1))])]),s[21]||(s[21]=l("<li><code>x-bili-gaia-vtoken</code> 暂时留空.</li><li><code>x-bili-aurora-eid</code> 如 <code>UFUFQ1AA</code>. 算法见附录. 未登录留空. <strong>必需</strong>.</li><li><code>x-bili-mid</code> 用户 UID, 未登录默认为 0. <strong>必需</strong>.</li><li><code>x-bili-aurora-zone</code> 留空. <strong>必需</strong>.</li><li><code>x-bili-trace-id</code> 如 <code>06e903399574695df75be114ff63ac64:f75be114ff63ac64:0:0</code>. 算法见附录. <strong>必需</strong>.</li><li><code>authorization</code> 鉴权, 登录时设定为 <code>identify_v1 {access_key}</code>, 未登录时无需此项.</li>",6)),a("li",null,[s[16]||(s[16]=a("code",null,"buvid",-1)),s[17]||(s[17]=n(" 设备唯一标识, 算法见 ")),e(o,{to:"/docs/misc/device_identity.html"},{default:p(()=>s[15]||(s[15]=[n("device_identity.md")])),_:1,__:[15]}),s[18]||(s[18]=n(". ")),s[19]||(s[19]=a("strong",null,"必需(?)",-1)),s[20]||(s[20]=n("."))]),s[22]||(s[22]=l("<li><code>bili-http-engine</code> 恒定为 <code>cronet</code>, 使用 <code>grpc.biliapi.net</code> 作为 gRPC 主机时无需此项.</li><li><code>te</code> 恒定为 <code>trailers</code>, Java gRPC 库固定添加, 使用 <code>app.bilibili.com</code> 作为 gRPC 主机时无需此项.</li>",2))])]),s[24]||(s[24]=l('<li>Binary 类 <ul><li><code>x-bili-fawkes-req-bin</code> 设备 Fawkes 信息, 使用 <a href="bilibili/metadata/fawkes/fawkes.proto">FawkesReq</a> 生成. <strong>必需</strong>.</li><li><code>x-bili-metadata-bin</code> 使用 <a href="bilibili/metadata/metadata.proto">Metadata</a> 生成. <strong>必需</strong>.</li><li><code>x-bili-device-bin</code> 设备信息, 使用 <a href="bilibili/metadata/device/device.proto">Device</a> 生成. <strong>必需</strong>.</li><li><code>x-bili-network-bin</code> 设备网络信息, 使用 <a href="bilibili/metadata/network/network.proto">Network</a> 生成. <strong>必需</strong>.</li><li><code>x-bili-restriction-bin</code> 限制信息, 使用 <a href="bilibili/metadata/restriction/restriction.proto">Restriction</a> 生成. 本项一般直接传空值即可. <strong>必需</strong>.</li><li><code>x-bili-locale-bin</code> 设备区域信息, 使用 <a href="bilibili/metadata/locale/locale.proto">Locale</a> 生成. <strong>必需</strong>.</li><li><code>x-bili-exps-bin</code> 使用 <a href="bilibili/metadata/pararbox/pararbox.proto">Exps</a> 生成. 本项一般直接传空值即可. <strong>必需</strong>.</li></ul></li>',1))]),s[26]||(s[26]=l(`<h2 id="接口请求定义" tabindex="-1"><a class="header-anchor" href="#接口请求定义"><span>接口请求定义</span></a></h2><p>等待补充, 参见 proto 文件注释. 以下仅介绍常用接口:</p><ul><li><a href="bilibili/app/playeronline/v1/playeronline.proto">bilibili.app.playeronline.v1 -> PlayerOnline</a> 视频在线人数接口.</li><li><a href="bilibili/app/playerunite/v1/playerunite.proto">bilibili.app.playerunite.v1 -> PlayViewUnite</a> United 视频播放链接接口(同时适用于 PGC, UGC 视频).</li><li><a href="bilibili/app/playurl/v1/playurl.proto">bilibili.app.playurl.v1 -> PlayURL</a> UGC 视频播放链接接口(V1 版本).</li><li><a href="bilibili/pgc/gateway/player/v1/playurl.proto">bilibili.pgc.gateway.player.v1 -> PlayView</a> PGC 视频播放链接接口(V1 版本).</li><li><a href="bilibili/pgc/gateway/player/v2/playurl.proto">bilibili.pgc.gateway.player.v2 -> PlayView</a> PGC 视频播放链接接口(V2 版本).</li><li><a href="bilibili/polymer/app/search/v1/search.proto">bilibili.polymer.app.search.v1 -> SearchAll, etc</a> 搜索接口(V1 版本).</li><li><a href="bilibili/app/dynamic/v2/dynamic.proto">bilibili.app.dynamic.v2 -> DynAll, etc</a> 动态接口(V2 版本).</li><li>...</li></ul><h2 id="应用示例" tabindex="-1"><a class="header-anchor" href="#应用示例"><span>应用示例</span></a></h2><h3 id="golang" tabindex="-1"><a class="header-anchor" href="#golang"><span>Golang</span></a></h3><p>B 站 gRPC API Golang 封装:<a href="https://github.com/XiaoMiku01/bilibili-grpc-api-go" target="_blank" rel="noopener noreferrer">XiaoMiku01/bilibili-grpc-api-go</a></p><h2 id="附录" tabindex="-1"><a class="header-anchor" href="#附录"><span>附录</span></a></h2><details><summary>点此展开</summary><h3 id="x-bili-aurora-eid-生成算法" tabindex="-1"><a class="header-anchor" href="#x-bili-aurora-eid-生成算法"><span><code>x-bili-aurora-eid</code> 生成算法</span></a></h3><div class="language-rust line-numbers-mode" data-highlighter="shiki" data-ext="rust" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-rust"><span class="line"><span style="color:#569CD6;">pub</span><span style="color:#569CD6;"> fn</span><span style="color:#DCDCAA;"> gen_aurora_eid</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">uid</span><span style="color:#D4D4D4;">: </span><span style="color:#4EC9B0;">u64</span><span style="color:#D4D4D4;">) -> </span><span style="color:#4EC9B0;">Option</span><span style="color:#D4D4D4;"><</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">> {</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> if</span><span style="color:#9CDCFE;"> uid</span><span style="color:#D4D4D4;"> == </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#4EC9B0;"> None</span><span style="color:#D4D4D4;">;</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#569CD6;"> mut</span><span style="color:#9CDCFE;"> result_byte</span><span style="color:#D4D4D4;"> = </span><span style="color:#4EC9B0;">Vec</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">with_capacity</span><span style="color:#D4D4D4;">(</span><span style="color:#B5CEA8;">64</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 1. 将 UID 字符串转为字节数组.</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#9CDCFE;"> mid_byte</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">uid</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">to_string</span><span style="color:#D4D4D4;">().</span><span style="color:#DCDCAA;">into_bytes</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 2. 将字节数组逐位(记为第 i 位)与 b"ad1va46a7lza" 中第 (i % 12) 位进行异或操作, 作为结果数组第 i 位.</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> mid_byte</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">iter</span><span style="color:#D4D4D4;">().</span><span style="color:#DCDCAA;">enumerate</span><span style="color:#D4D4D4;">().</span><span style="color:#DCDCAA;">for_each</span><span style="color:#D4D4D4;">(|(</span><span style="color:#9CDCFE;">i</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">v</span><span style="color:#D4D4D4;">)| {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> result_byte</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">push</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">v</span><span style="color:#D4D4D4;"> ^ (</span><span style="color:#CE9178;">b"ad1va46a7lza"</span><span style="color:#D4D4D4;">[</span><span style="color:#9CDCFE;">i</span><span style="color:#D4D4D4;"> % </span><span style="color:#B5CEA8;">12</span><span style="color:#D4D4D4;">]))</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> });</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 3. 对字节数组执行 Base64 编码, 注意 no padding, 即得到 x-bili-aurora-eid.</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> Some</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">base64</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">Engine</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">encode</span><span style="color:#D4D4D4;">(</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> &</span><span style="color:#4EC9B0;">base64</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">engine</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">general_purpose</span><span style="color:#D4D4D4;">::STANDARD_NO_PAD,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> result_byte</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> ))</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="x-bili-trace-id-生成算法" tabindex="-1"><a class="header-anchor" href="#x-bili-trace-id-生成算法"><span><code>x-bili-trace-id</code> 生成算法</span></a></h3><div class="language-rust line-numbers-mode" data-highlighter="shiki" data-ext="rust" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-rust"><span class="line"><span style="color:#569CD6;">pub</span><span style="color:#569CD6;"> fn</span><span style="color:#DCDCAA;"> gen_trace_id</span><span style="color:#D4D4D4;">() -> </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 1. 生成 32 位随机字符串 random_id , Charset 为 0~9, a~z. </span></span>
|
||
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#9CDCFE;"> random_id</span><span style="color:#D4D4D4;"> = </span><span style="color:#DCDCAA;">gen_random_string!</span><span style="color:#D4D4D4;">(</span><span style="color:#B5CEA8;">32</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#569CD6;"> mut</span><span style="color:#9CDCFE;"> random_trace_id</span><span style="color:#D4D4D4;"> = </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">with_capacity</span><span style="color:#D4D4D4;">(</span><span style="color:#B5CEA8;">40</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 2. 取 random_id 前 24 位, 作为 random_trace_id.</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> random_trace_id</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">push_str</span><span style="color:#D4D4D4;">(&</span><span style="color:#9CDCFE;">random_id</span><span style="color:#D4D4D4;">[</span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">..</span><span style="color:#B5CEA8;">24</span><span style="color:#D4D4D4;">]);</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 3. 初始化一个长度为 3 的数组 b_arr, 初始值都为 0.</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#569CD6;"> mut</span><span style="color:#9CDCFE;"> b_arr</span><span style="color:#D4D4D4;">: [</span><span style="color:#4EC9B0;">i8</span><span style="color:#D4D4D4;">; </span><span style="color:#B5CEA8;">3</span><span style="color:#D4D4D4;">] = [</span><span style="color:#B5CEA8;">0</span><span style="color:#4EC9B0;">i8</span><span style="color:#D4D4D4;">; </span><span style="color:#B5CEA8;">3</span><span style="color:#D4D4D4;">];</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 并获取当前时间戳</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#569CD6;"> mut</span><span style="color:#9CDCFE;"> ts</span><span style="color:#D4D4D4;"> = </span><span style="color:#4EC9B0;">chrono</span><span style="color:#D4D4D4;">::</span><span style="color:#4EC9B0;">Local</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">now</span><span style="color:#D4D4D4;">().</span><span style="color:#DCDCAA;">timestamp</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 使用循环从高位到低位遍历 b_arr 数组, 循环体内执行以下逻辑:</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // - 首先将 ts 右移 8 位</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // - 然后根据条件向 b_arr 的第 i 位赋值: </span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // - 如果 (ts / 128) % 2的结果为0, 则 b_arr[i] = ts % 256</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // - 否则 b_arr[i] = ts % 256 - 256</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> for</span><span style="color:#9CDCFE;"> i</span><span style="color:#569CD6;"> in</span><span style="color:#D4D4D4;"> (</span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">..</span><span style="color:#B5CEA8;">3</span><span style="color:#D4D4D4;">).</span><span style="color:#DCDCAA;">rev</span><span style="color:#D4D4D4;">() {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> ts</span><span style="color:#D4D4D4;"> >>= </span><span style="color:#B5CEA8;">8</span><span style="color:#D4D4D4;">;</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> b_arr</span><span style="color:#D4D4D4;">[</span><span style="color:#9CDCFE;">i</span><span style="color:#D4D4D4;">] = {</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> if</span><span style="color:#D4D4D4;"> ((</span><span style="color:#9CDCFE;">ts</span><span style="color:#D4D4D4;"> / </span><span style="color:#B5CEA8;">128</span><span style="color:#D4D4D4;">) % </span><span style="color:#B5CEA8;">2</span><span style="color:#D4D4D4;">) == </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> (</span><span style="color:#9CDCFE;">ts</span><span style="color:#D4D4D4;"> % </span><span style="color:#B5CEA8;">256</span><span style="color:#D4D4D4;">) </span><span style="color:#569CD6;">as</span><span style="color:#4EC9B0;"> i8</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> } </span><span style="color:#C586C0;">else</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> (</span><span style="color:#9CDCFE;">ts</span><span style="color:#D4D4D4;"> % </span><span style="color:#B5CEA8;">256</span><span style="color:#D4D4D4;"> - </span><span style="color:#B5CEA8;">256</span><span style="color:#D4D4D4;">) </span><span style="color:#569CD6;">as</span><span style="color:#4EC9B0;"> i8</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 4. 将数组 b_arr 中的每个元素逐个转换为两位的十六进制字符串并追加到 random_trace_id 中.</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> for</span><span style="color:#9CDCFE;"> i</span><span style="color:#569CD6;"> in</span><span style="color:#B5CEA8;"> 0</span><span style="color:#D4D4D4;">..</span><span style="color:#B5CEA8;">3</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> random_trace_id</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">push_str</span><span style="color:#D4D4D4;">(&</span><span style="color:#DCDCAA;">format!</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"{:0>2x}"</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">b_arr</span><span style="color:#D4D4D4;">[</span><span style="color:#9CDCFE;">i</span><span style="color:#D4D4D4;">]))</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 5. 将 random_id 的第 31, 32 个字符追加到 random_trace_id 中, 此时 random_trace_id 生成完毕, 应当为 32 位长度.</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> random_trace_id</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">push_str</span><span style="color:#D4D4D4;">(&</span><span style="color:#9CDCFE;">random_id</span><span style="color:#D4D4D4;">[</span><span style="color:#B5CEA8;">30</span><span style="color:#D4D4D4;">..</span><span style="color:#B5CEA8;">32</span><span style="color:#D4D4D4;">]);</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // 6. 最后, 按 \`{random_trace_id}:{random_trace_id[16..32]}:0:0\` 的顺序拼接起来, 即为 x-bili-trace-id</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> let</span><span style="color:#569CD6;"> mut</span><span style="color:#9CDCFE;"> random_trace_id_final</span><span style="color:#D4D4D4;"> = </span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">::</span><span style="color:#DCDCAA;">with_capacity</span><span style="color:#D4D4D4;">(</span><span style="color:#B5CEA8;">64</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> random_trace_id_final</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">push_str</span><span style="color:#D4D4D4;">(&</span><span style="color:#9CDCFE;">random_trace_id</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> random_trace_id_final</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">push_str</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">":"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> random_trace_id_final</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">push_str</span><span style="color:#D4D4D4;">(&</span><span style="color:#9CDCFE;">random_trace_id</span><span style="color:#D4D4D4;">[</span><span style="color:#B5CEA8;">16</span><span style="color:#D4D4D4;">..</span><span style="color:#B5CEA8;">32</span><span style="color:#D4D4D4;">]);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> random_trace_id_final</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">push_str</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">":0:0"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> random_trace_id_final</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></details>`,8))])}const u=i(D,[["render",d]]),b=JSON.parse('{"path":"/grpc_api/","title":"gRPC 接口定义(protobuf 结构体)","lang":"zh-CN","frontmatter":{},"git":{"updatedTime":1689310001000,"contributors":[{"name":"SocialSisterYi","username":"SocialSisterYi","email":"45892418+SocialSisterYi@users.noreply.github.com","commits":4,"url":"https://github.com/SocialSisterYi"},{"name":"XiaoMiku01","username":"XiaoMiku01","email":"loveava0612@outlook.com","commits":1,"url":"https://github.com/XiaoMiku01"},{"name":"cxw620","username":"cxw620","email":"70561268+cxw620@users.noreply.github.com","commits":1,"url":"https://github.com/cxw620"}],"changelog":[{"hash":"f5263d04570c9dcd1d1554a0c67651c532fe1b6a","time":1689310001000,"email":"70561268+cxw620@users.noreply.github.com","author":"陈寒彤","message":"add grpc docs (#741)"},{"hash":"0e17dd421a42892efac3c23ce0f5be5771b8e24e","time":1684813962000,"email":"loveava0612@outlook.com","author":"XiaoMiku01","message":"[gRpc] 添加评论区 At 用户列表接口 (#681)"},{"hash":"ce8d00fcd037deddf23521ae5985899f9012908b","time":1625578116000,"email":"45892418+SocialSisterYi@users.noreply.github.com","author":"社会易姐QwQ","message":"更新大量【proto定义】并勘误"},{"hash":"3acd3e2167b763e5a1726259cd2ee02510bd9570","time":1623347248000,"email":"45892418+SocialSisterYi@users.noreply.github.com","author":"社会易姐QwQ","message":"更新【评论区】proto结构体"},{"hash":"c454b3a4092275d8e3c871564fe7a5beb6dcc1e9","time":1612521120000,"email":"45892418+SocialSisterYi@users.noreply.github.com","author":"SocialSisterYi","message":"更新【proto文件】"},{"hash":"fe77d8aae7fccb0a57ad21f3de9e543c1e1b09dd","time":1609659680000,"email":"45892418+SocialSisterYi@users.noreply.github.com","author":"SocialSisterYi","message":"添加若干grpc接口的proto定义"}]},"filePathRelative":"grpc_api/readme.md"}');export{u as comp,b as data};
|