219 lines
86 KiB
JavaScript
219 lines
86 KiB
JavaScript
import{_ as p,c as d,a as o,b as s,d as a,e,w as t,r,o as i}from"./app-Dgsdh8A6.js";const c={};function D(u,n){const l=r("RouteLink");return i(),d("div",null,[n[43]||(n[43]=o(`<h1 id="密码登录" tabindex="-1"><a class="header-anchor" href="#密码登录"><span>密码登录</span></a></h1><h2 id="密码登录流程-伪代码" tabindex="-1"><a class="header-anchor" href="#密码登录流程-伪代码"><span>密码登录流程(伪代码)</span></a></h2><div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-python"><span class="line"><span style="color:#D4D4D4;">账号 = </span><span style="color:#CE9178;">'2333333'</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">密码字符串 = </span><span style="color:#CE9178;">'password'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"># 1.人机验证步骤</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">token, gt, challenge = 获取验证码()</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">validate = 填写验证码(gt, challenge) </span><span style="color:#6A9955;"># 这一步填写验证码 (访问极验API,得到validate)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"># 2.密码加密步骤</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">pubkey, salt = 获取公钥和盐()</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">加密后的密码 = RSA公钥加密(pubkey, salt+密码字符串) </span><span style="color:#6A9955;"># 盐需要加在密码字符串前</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">base64编码后的密文 = base64编码(加密后的密码)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"># 3.开始登录</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">cookie = 密码登录(账号, base64编码后的密文, token, challenge, validate)</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">存储cookie(cookie)</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">SSO登录页面跳转()</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></div><h2 id="web端密码登录" tabindex="-1"><a class="header-anchor" href="#web端密码登录"><span>web端密码登录</span></a></h2><h3 id="获取公钥-盐-web端" tabindex="-1"><a class="header-anchor" href="#获取公钥-盐-web端"><span>获取公钥&盐(web端)</span></a></h3><blockquote><p>https://passport.bilibili.com/x/passport-login/web/key</p></blockquote><p><em>请求方式:GET</em></p><p><strong>json回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>num</td><td>返回值</td><td>0:成功</td></tr><tr><td>message</td><td>str</td><td>错误信息</td><td></td></tr><tr><td>ttl</td><td>num</td><td>1</td><td></td></tr><tr><td>data</td><td>obj</td><td>信息本体</td><td></td></tr></tbody></table><p><code>data</code>对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>hash</td><td>str</td><td>密码盐值</td><td>有效时间为 20s<br>恒为 16 字符<br>需要拼接在明文密码之前</td></tr><tr><td>key</td><td>str</td><td>rsa 公钥</td><td>PEM 格式编码<br>加密密码时需要使用</td></tr></tbody></table><p><strong>示例:</strong></p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/x/passport-login/web/key'</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"0"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "hash"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"9333681c87fd8d6e"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "key"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"-----BEGIN PUBLIC KEY-----</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">Xl69GV6klzgxW6d2xQIDAQAB</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">-----END PUBLIC KEY-----</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">"</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></div></details><h3 id="登录操作-web端" tabindex="-1"><a class="header-anchor" href="#登录操作-web端"><span>登录操作(web端)</span></a></h3><blockquote><p>https://passport.bilibili.com/x/passport-login/web/login</p></blockquote><p><em>请求方式:POST</em></p><p>验证登录成功后会进行设置以下 cookie 项:</p><p><code>sid</code> <code>DedeUserID</code> <code>DedeUserID__ckMd5</code> <code>SESSDATA</code> <code>bili_jct</code></p><p><strong>正文参数 (application/x-www-form-urlencoded):</strong></p>`,21)),s("table",null,[n[21]||(n[21]=s("thead",null,[s("tr",null,[s("th",null,"参数名"),s("th",null,"类型"),s("th",null,"内容"),s("th",null,"必要性"),s("th",null,"备注")])],-1)),s("tbody",null,[n[14]||(n[14]=s("tr",null,[s("td",null,"username"),s("td",null,"str"),s("td",null,"用户登录账号"),s("td",null,"必要"),s("td",null,"手机号或邮箱地址")],-1)),n[15]||(n[15]=s("tr",null,[s("td",null,"password"),s("td",null,"str"),s("td",null,"加密后的带盐密码"),s("td",null,"必要"),s("td",null,"base64 格式")],-1)),n[16]||(n[16]=s("tr",null,[s("td",null,"keep"),s("td",null,"num"),s("td",null,"0"),s("td",null,"必要"),s("td")],-1)),s("tr",null,[n[3]||(n[3]=s("td",null,"token",-1)),n[4]||(n[4]=s("td",null,"str",-1)),n[5]||(n[5]=s("td",null,"登录 token",-1)),n[6]||(n[6]=s("td",null,"必要",-1)),s("td",null,[n[1]||(n[1]=a("在")),e(l,{to:"/docs/login/login_action/#%E7%94%B3%E8%AF%B7captcha%E9%AA%8C%E8%AF%81%E7%A0%81"},{default:t(()=>n[0]||(n[0]=[a("申请 captcha 验证码")])),_:1,__:[0]}),n[2]||(n[2]=a("接口处获取"))])]),s("tr",null,[n[10]||(n[10]=s("td",null,"challenge",-1)),n[11]||(n[11]=s("td",null,"str",-1)),n[12]||(n[12]=s("td",null,"极验 challenge",-1)),n[13]||(n[13]=s("td",null,"必要",-1)),s("td",null,[n[8]||(n[8]=a("在")),e(l,{to:"/docs/login/login_action/#%E7%94%B3%E8%AF%B7captcha%E9%AA%8C%E8%AF%81%E7%A0%81"},{default:t(()=>n[7]||(n[7]=[a("申请 captcha 验证码")])),_:1,__:[7]}),n[9]||(n[9]=a("接口处获取"))])]),n[17]||(n[17]=s("tr",null,[s("td",null,"validate"),s("td",null,"str"),s("td",null,"极验 result"),s("td",null,"必要"),s("td",null,"极验验证后得到")],-1)),n[18]||(n[18]=s("tr",null,[s("td",null,"seccode"),s("td",null,"str"),s("td",null,[a("极验 result +"),s("code",null,"|jordan")]),s("td",null,"必要"),s("td",null,"极验验证后得到")],-1)),n[19]||(n[19]=s("tr",null,[s("td",null,"go_url"),s("td",null,"str"),s("td",null,"跳转 url"),s("td",null,"非必要"),s("td",null,"默认为 https://www.bilibili.com")],-1)),n[20]||(n[20]=s("tr",null,[s("td",null,"source"),s("td",null,"str"),s("td",null,"登录来源"),s("td",null,"非必要"),s("td",null,[s("code",null,"main_web"),a(":独立登录页"),s("br"),s("code",null,"main_mini"),a(":小窗登录")])],-1))])]),n[44]||(n[44]=o(`<p><strong>json回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>num</td><td>返回值</td><td>0:成功<br>-105:验证码错误<br>-400:请求错误<br>-629:账号或密码错误<br>-653:用户名或密码不能为空<br>-662:提交超时,请重新提交<br>-2001:缺少必要的的参数<br>-2100:需验证手机号或邮箱<br>2400:登录秘钥错误<br>2406:验证极验服务出错<br>86000:RSA解密失败</td></tr><tr><td>message</td><td>str</td><td>错误信息</td><td></td></tr><tr><td>data</td><td>成功时:obj<br>失败时:null</td><td>数据本体</td><td></td></tr></tbody></table><p>data 对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>message</td><td>str</td><td>扫码状态信息</td><td>若提示 <code>本次登录环境存在风险, 需使用手机号进行验证或绑定</code>, 参见 <a href="#%E6%89%8B%E6%9C%BA%E5%8F%B7%E9%AA%8C%E8%AF%81">手机号验证</a></td></tr><tr><td>refresh_token</td><td>str</td><td>刷新<code>refresh_token</code></td><td></td></tr><tr><td>status</td><td>num</td><td>0</td><td></td></tr><tr><td>timestamp</td><td>num</td><td>登录时间</td><td>未登录为<code>0</code><br>时间戳 单位为毫秒</td></tr><tr><td>url</td><td>str</td><td>游戏分站跨域登录 url</td><td></td></tr></tbody></table><p><strong>示例:</strong></p><p>例如用户账号为<code>12345678900</code>,加密后的密码为<code>xxx</code>,登录秘钥为<code>aabbccdd</code>,极验challenge为<code>2333</code>,极验结果为<code>666666</code>,进行验证登录操作</p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/x/passport-login/web/login'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'username=12345678900'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'password=xxx'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'keep=0'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'source=main_web'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'token=aabbccdd'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'challenge=2333'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'validate=666666'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'seccode=666666|jordan'</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></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"0"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "status"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">""</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "url"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"https://passport.biligame.com/crossDomain?DedeUserID=***&DedeUserID__ckMd5=***&Expires=***&SESSDATA=***&bili_jct=***&gourl=https%3A%2F%2Fwww.bilibili.com%2F"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "refresh_token"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"***"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "timestamp"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1662452570273</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></div></details><p><strong>响应头部抓包信息:</strong></p><p>可明显看见设置了几个 cookie</p><details><summary>查看响应示例:</summary><div class="language-http line-numbers-mode" data-highlighter="shiki" data-ext="http" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-http"><span class="line"><span style="color:#569CD6;">HTTP</span><span style="color:#D4D4D4;">/</span><span style="color:#B5CEA8;">1.1</span><span style="color:#B5CEA8;"> 200</span><span style="color:#CE9178;"> OK</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Date:</span><span style="color:#CE9178;"> Mon, 13 Jul 2020 06:56:00 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Content-Type:</span><span style="color:#CE9178;"> application/json;charset=UTF-8</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Content-Length:</span><span style="color:#CE9178;"> 273</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Connection:</span><span style="color:#CE9178;"> keep-alive</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Server:</span><span style="color:#CE9178;"> Apache-Coyote/1.1</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Set-Cookie:</span><span style="color:#CE9178;"> DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Set-Cookie:</span><span style="color:#CE9178;"> DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Set-Cookie:</span><span style="color:#CE9178;"> SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/; HttpOnly</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Set-Cookie:</span><span style="color:#CE9178;"> bili_jct=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Content-Security-Policy-Report-Only:</span><span style="color:#CE9178;"> default-src 'self' data: *.bilibili.com *.hdslb.com; style-src 'self' 'unsafe-inline' *.hdslb.com static.geetest.com; img-src 'self' data: blob: *.bilibili.com *.hdslb.com http://*.hdslb.com static.geetest.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.bilibili.com *.hdslb.com api.geetest.com static.geetest.com; object-src 'self' *.hdslb.com; media-src 'self' *.acgvideo.com http://*.acgvideo.com *.ksyungslb.com; connect-src 'self' data: wss://*.bilibili.com:* *.bilibili.com *.hdslb.com *.biliapi.net *.biliapi.com; frame-ancestors 'self' *.bilibili.com *.biligame.com; report-uri https://security.bilibili.com/csp_report</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Expires:</span><span style="color:#CE9178;"> Mon, 13 Jul 2020 06:55:59 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Cache-Control:</span><span style="color:#CE9178;"> no-cache</span></span>
|
||
<span class="line"><span style="color:#569CD6;">X-Cache-Webcdn:</span><span style="color:#CE9178;"> BYPASS from jd-sxhz-dx-w-01</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></div></details><h2 id="web端密码登录-旧版" tabindex="-1"><a class="header-anchor" href="#web端密码登录-旧版"><span>web端密码登录-旧版</span></a></h2><p>以下为密码扫码登录 API,尚可正常访问</p><h3 id="获取公钥-盐-web端-旧版" tabindex="-1"><a class="header-anchor" href="#获取公钥-盐-web端-旧版"><span>获取公钥&盐(web端-旧版)</span></a></h3><blockquote><p>https://passport.bilibili.com/login?act=getkey</p></blockquote><p><em>请求方式:GET</em></p><p><strong>json回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>hash</td><td>str</td><td>密码盐值</td><td>有效时间为 20s<br>恒为 16 字符<br>需要拼接在明文密码之前</td></tr><tr><td>key</td><td>str</td><td>rsa 公钥</td><td>PEM 格式编码<br>加密密码时需要使用</td></tr></tbody></table><p><strong>示例:</strong></p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/login?act=getkey'</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "hash"</span><span style="color:#D4D4D4;">:</span><span style="color:#CE9178;">"07c6501690c1af85"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "key"</span><span style="color:#D4D4D4;">:</span><span style="color:#CE9178;">"-----BEGIN PUBLIC KEY-----</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">Xl69GV6klzgxW6d2xQIDAQAB</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">-----END PUBLIC KEY-----</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">"</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></div></details><h3 id="登录操作-web端-旧版" tabindex="-1"><a class="header-anchor" href="#登录操作-web端-旧版"><span>登录操作(web端-旧版)</span></a></h3><blockquote><p>https://passport.bilibili.com/web/login/v2</p></blockquote><p><em>请求方式:POST</em></p><p>验证登录成功后会进行设置以下cookie项:</p><p><code>sid</code> <code>DedeUserID</code> <code>DedeUserID__ckMd5</code> <code>SESSDATA</code> <code>bili_jct</code></p><p><strong>正文参数 (application/x-www-form-urlencoded):</strong></p>`,29)),s("table",null,[n[42]||(n[42]=s("thead",null,[s("tr",null,[s("th",null,"参数名"),s("th",null,"类型"),s("th",null,"内容"),s("th",null,"必要性"),s("th",null,"备注")])],-1)),s("tbody",null,[n[36]||(n[36]=s("tr",null,[s("td",null,"captchaType"),s("td",null,"num"),s("td",null,"6"),s("td",null,"必要"),s("td",null,[a("必须为"),s("code",null,"6")])],-1)),n[37]||(n[37]=s("tr",null,[s("td",null,"username"),s("td",null,"str"),s("td",null,"用户登录账号"),s("td",null,"必要"),s("td",null,"手机号或邮箱地址")],-1)),n[38]||(n[38]=s("tr",null,[s("td",null,"password"),s("td",null,"str"),s("td",null,"加密后的带盐密码"),s("td",null,"必要"),s("td",null,"base64 格式")],-1)),n[39]||(n[39]=s("tr",null,[s("td",null,"keep"),s("td",null,"bool"),s("td",null,"是否记住登录"),s("td",null,"必要"),s("td",null,[s("code",null,"true"),a(":记住登录"),s("br"),s("code",null,"false"),a(":不记住登录")])],-1)),s("tr",null,[n[25]||(n[25]=s("td",null,"key",-1)),n[26]||(n[26]=s("td",null,"str",-1)),n[27]||(n[27]=s("td",null,"登录 token",-1)),n[28]||(n[28]=s("td",null,"必要",-1)),s("td",null,[n[23]||(n[23]=a("在")),e(l,{to:"/docs/login/login_action/#%E7%94%B3%E8%AF%B7captcha%E9%AA%8C%E8%AF%81%E7%A0%81"},{default:t(()=>n[22]||(n[22]=[a("申请 captcha 验证码")])),_:1,__:[22]}),n[24]||(n[24]=a("接口处获取"))])]),s("tr",null,[n[32]||(n[32]=s("td",null,"challenge",-1)),n[33]||(n[33]=s("td",null,"str",-1)),n[34]||(n[34]=s("td",null,"极验 challenge",-1)),n[35]||(n[35]=s("td",null,"必要",-1)),s("td",null,[n[30]||(n[30]=a("在")),e(l,{to:"/docs/login/login_action/#%E7%94%B3%E8%AF%B7captcha%E9%AA%8C%E8%AF%81%E7%A0%81"},{default:t(()=>n[29]||(n[29]=[a("申请 captcha 验证码")])),_:1,__:[29]}),n[31]||(n[31]=a("接口处获取"))])]),n[40]||(n[40]=s("tr",null,[s("td",null,"validate"),s("td",null,"str"),s("td",null,"极验 result"),s("td",null,"必要"),s("td",null,"极验验证后得到")],-1)),n[41]||(n[41]=s("tr",null,[s("td",null,"seccode"),s("td",null,"str"),s("td",null,[a("极验 result +"),s("code",null,"|jordan")]),s("td",null,"必要"),s("td",null,"极验验证后得到")],-1))])]),n[45]||(n[45]=o(`<p><strong>json回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>num</td><td>返回值</td><td>0:成功<br>-400:请求错误<br>-629:账号或密码错误<br>-653:用户名或密码不能为空<br>-662:提交超时,请重新提交<br>-2001:缺少必要的的参数<br>-2100:需验证手机号或邮箱<br>2400:登录秘钥错误<br>2406:验证极验服务出错<br>86000:RSA解密失败</td></tr><tr><td>ts</td><td>num</td><td>当前时间戳</td><td>成功时无此项</td></tr><tr><td>message</td><td>str</td><td>错误信息</td><td>默认为0</td></tr><tr><td>data</td><td>obj</td><td>数据本体</td><td>成功时有此项</td></tr></tbody></table><p><code>data</code>对象:</p><p><strong>未登录时:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>redirectUrl</td><td>str</td><td>游戏分站跨域登录 url</td><td></td></tr></tbody></table><p><strong>已登录时:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>isLogin</td><td>bool</td><td>true</td><td></td></tr><tr><td>goUrl</td><td>str</td><td>https://www.bilibili.com</td><td></td></tr></tbody></table><p><strong>需验证手机号或邮箱时</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>mid</td><td>num</td><td>用户 mid</td><td></td></tr><tr><td>tel</td><td>str</td><td>绑定的手机号</td><td>星号隐藏部分信息</td></tr><tr><td>email</td><td>str</td><td>绑定的邮箱</td><td>星号隐藏部分信息</td></tr><tr><td>sorce</td><td>num</td><td>0</td><td><strong>作用尚不明确</strong></td></tr><tr><td>keeptime</td><td>num</td><td>1</td><td><strong>作用尚不明确</strong></td></tr><tr><td>goUrl</td><td>str</td><td>https://www.bilibili.com</td><td></td></tr></tbody></table><p><strong>示例:</strong></p><p>例如用户账号为<code>12345678900</code>,加密后的密码为<code>xxx</code>,登录秘钥为<code>aabbccdd</code>,极验challenge为<code>2333</code>,极验结果为<code>666666</code>,进行验证登录操作</p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/web/login/v2'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'captchaType=6'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'username=12345678900'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'password=xxx'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'keep=true'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'token=aabbccdd'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'challenge=2333'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'validate=666666'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'seccode=666666|jordan'</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></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "redirectUrl"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"https://passport.biligame.com/crossDomain?DedeUserID=***&DedeUserID__ckMd5=***&Expires=15551000&SESSDATA=***&bili_jct=***&gourl=https%3A%2F%2Fwww.bilibili.com"</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></div></details><p><strong>响应头部抓包信息:</strong></p><p>可明显看见设置了几个 cookie</p><details><summary>查看响应示例:</summary><div class="language-http line-numbers-mode" data-highlighter="shiki" data-ext="http" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-http"><span class="line"><span style="color:#569CD6;">HTTP</span><span style="color:#D4D4D4;">/</span><span style="color:#B5CEA8;">1.1</span><span style="color:#B5CEA8;"> 200</span><span style="color:#CE9178;"> OK</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Date:</span><span style="color:#CE9178;"> Mon, 13 Jul 2020 06:56:00 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Content-Type:</span><span style="color:#CE9178;"> application/json;charset=UTF-8</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Content-Length:</span><span style="color:#CE9178;"> 273</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Connection:</span><span style="color:#CE9178;"> keep-alive</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Server:</span><span style="color:#CE9178;"> Apache-Coyote/1.1</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Set-Cookie:</span><span style="color:#CE9178;"> DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Set-Cookie:</span><span style="color:#CE9178;"> DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Set-Cookie:</span><span style="color:#CE9178;"> SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/; HttpOnly</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Set-Cookie:</span><span style="color:#CE9178;"> bili_jct=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Content-Security-Policy-Report-Only:</span><span style="color:#CE9178;"> default-src 'self' data: *.bilibili.com *.hdslb.com; style-src 'self' 'unsafe-inline' *.hdslb.com static.geetest.com; img-src 'self' data: blob: *.bilibili.com *.hdslb.com http://*.hdslb.com static.geetest.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.bilibili.com *.hdslb.com api.geetest.com static.geetest.com; object-src 'self' *.hdslb.com; media-src 'self' *.acgvideo.com http://*.acgvideo.com *.ksyungslb.com; connect-src 'self' data: wss://*.bilibili.com:* *.bilibili.com *.hdslb.com *.biliapi.net *.biliapi.com; frame-ancestors 'self' *.bilibili.com *.biligame.com; report-uri https://security.bilibili.com/csp_report</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Expires:</span><span style="color:#CE9178;"> Mon, 13 Jul 2020 06:55:59 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">Cache-Control:</span><span style="color:#CE9178;"> no-cache</span></span>
|
||
<span class="line"><span style="color:#569CD6;">X-Cache-Webcdn:</span><span style="color:#CE9178;"> BYPASS from jd-sxhz-dx-w-01</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></div></details><h2 id="app端密码登录" tabindex="-1"><a class="header-anchor" href="#app端密码登录"><span>APP端密码登录</span></a></h2><h3 id="获取公钥-盐-app端" tabindex="-1"><a class="header-anchor" href="#获取公钥-盐-app端"><span>获取公钥&盐(APP端)</span></a></h3><blockquote><p>http://passport.bilibili.com/api/oauth2/getKey</p></blockquote><p><em>请求方式:POST</em></p><p>鉴权方式:appkey</p><p><strong>正文参数( application/x-www-form-urlencoded ):</strong></p><table><thead><tr><th>参数名</th><th>类型</th><th>内容</th><th>必要性</th><th>备注</th></tr></thead><tbody><tr><td>appkey</td><td>str</td><td>APP密钥</td><td>APP方式必要</td><td></td></tr><tr><td>sign</td><td>str</td><td>APP签名</td><td>APP方式必要</td><td></td></tr></tbody></table><p><strong>json回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>hash</td><td>str</td><td>密码盐值</td><td>有效时间为 20s<br>恒为 16 字符<br>需要拼接在明文密码之前</td></tr><tr><td>key</td><td>str</td><td>rsa 公钥</td><td>PEM 格式编码<br>加密密码时需要使用</td></tr></tbody></table><p><strong>示例:</strong></p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/api/oauth2/getKey'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'appkey=1d8b6e7d45233436'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'sign=17004c193f688f0b5665c1068e733aff'</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></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "hash"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"07c6501690c1af85"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "key"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"-----BEGIN PUBLIC KEY-----</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">Xl69GV6klzgxW6d2xQIDAQAB</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">-----END PUBLIC KEY-----</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">"</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></div></details><h3 id="登录操作-app端" tabindex="-1"><a class="header-anchor" href="#登录操作-app端"><span>登录操作(APP端)</span></a></h3><p>TODO</p><h2 id="登录密码的加密实例" tabindex="-1"><a class="header-anchor" href="#登录密码的加密实例"><span>登录密码的加密实例</span></a></h2><p>以下实例使用 Python 语言,在任何平台(web、APP)使用密码登录都需要如下加密步骤</p><p>首先在需拉取 RSA PubKey 和 salt 备用</p><div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-python"><span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> requests</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#D4D4D4;">resp = requests.get(</span><span style="color:#CE9178;">'https://passport.bilibili.com/x/passport-login/web/key'</span><span style="color:#D4D4D4;">).json()[</span><span style="color:#CE9178;">'data'</span><span style="color:#D4D4D4;">]</span></span>
|
||
<span class="line"><span style="color:#DCDCAA;">print</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'salt ='</span><span style="color:#D4D4D4;">, resp[</span><span style="color:#CE9178;">'hash'</span><span style="color:#D4D4D4;">])</span></span>
|
||
<span class="line"><span style="color:#DCDCAA;">print</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'PubKey ='</span><span style="color:#D4D4D4;">, resp[</span><span style="color:#CE9178;">'key'</span><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></div><p><code>hash</code>字段为 salt,长度固定为 16 字符,timeout 时间只有 20s</p><p><code>key</code>字段为 RSA PubKey,为 PEM 格式,加密需要使用</p><div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-"><span class="line"><span>salt = 9773d106a67e27d6</span></span>
|
||
<span class="line"><span>PubKey = -----BEGIN PUBLIC KEY-----</span></span>
|
||
<span class="line"><span>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n</span></span>
|
||
<span class="line"><span>6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx</span></span>
|
||
<span class="line"><span>/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+</span></span>
|
||
<span class="line"><span>Xl69GV6klzgxW6d2xQIDAQAB</span></span>
|
||
<span class="line"><span>-----END PUBLIC KEY-----</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></div><p>例如登录密码为<code>BiShi22332323</code>,现在对它进行加盐并使用获取的 PubKey 加密</p><div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-python"><span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> rsa</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">password = </span><span style="color:#CE9178;">'BiShi22332323'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#D4D4D4;">pubKey = rsa.PublicKey.load_pkcs1_openssl_pem(resp[</span><span style="color:#CE9178;">'key'</span><span style="color:#D4D4D4;">]) </span><span style="color:#6A9955;"># 读取 PEM 密钥</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">encryptedPassword = rsa.encrypt((resp[</span><span style="color:#CE9178;">'hash'</span><span style="color:#D4D4D4;">]+password).encode(), pubKey) </span><span style="color:#6A9955;"># 盐需要加在明文密码之前,一并加密</span></span>
|
||
<span class="line"><span style="color:#DCDCAA;">print</span><span style="color:#D4D4D4;">(encryptedPassword)</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></div><p>下面将输出一段 bytes 数据:</p><div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-"><span class="line"><span>b'}\\x9c\\xd4\\xcd\\x88\\x92\\xa7\\xde\\x85\\xdb\\xabm\\xd7\\xd3\\x08\\x02@xo\\x85\\xa4\\xe1\\x11\\xd0o\\x80\\x03.$\\xc8l\\xbe\\xba;\\xfe\\xee\\xa7(\\xf8S\\x95\\x1e\\x9106\\xa4\\x1d\\xcf\\x8e\\xbe\\x8d\\x94A\\x86s\\xf9"\\x12\\x0c\\x135\\xbb\\xbc\\xe1\\xde\\x1b\\x90\\t)P\\xeb\\xa9\\x8fXY]\\x83\\x18\\x81f\\n:\\xdb\\xe1\\xbe\\xe8\\x1e\\xba\\x1c D8d}B\\x17\\xf9\\x8a\\xf0i\\'1\\xa5\\xc4\\x05&\\xaa;n\\xf8{\\xa02\\xffY\\xcelU\\xd5\\xaf\\x8aJK\\xdc\\xf1@\\xbc\\x93'</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>接下来需要把加密后的结果进行 base64 编码</p><div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-python"><span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> base64</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">b64Password = base64.b64encode(encryptedPassword).decode()</span></span>
|
||
<span class="line"><span style="color:#DCDCAA;">print</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'result ='</span><span style="color:#D4D4D4;">, b64Password)</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></div><p>以下为最终加密结果,可直接向 API 请求体传参以登录:</p><p>因为 RSA 公钥加密的<strong>无法解密性</strong>,故无法本地验证,仅可请求 API 验证(略...</p><div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-"><span class="line"><span>result = fZzUzYiSp96F26tt19MIAkB4b4Wk4RHQb4ADLiTIbL66O/7upyj4U5UekTA2pB3Pjr6NlEGGc/kiEgwTNbu84d4bkAkpUOupj1hZXYMYgWYKOtvhvugeuhwgRDhkfUIX+YrwaScxpcQFJqo7bvh7oDL/Wc5sVdWvikpL3PFAvJM=</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>以下为密码加密的Java实现:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-java"><span class="line"><span style="color:#569CD6;">package</span><span style="color:#D4D4D4;"> com.ho.test;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> cn.hutool.core.codec.Base64;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> javax.crypto.Cipher;</span></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.security.KeyFactory;</span></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.security.PublicKey;</span></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.security.spec.X509EncodedKeySpec;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#569CD6;">public</span><span style="color:#569CD6;"> class</span><span style="color:#4EC9B0;"> Test3</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> public</span><span style="color:#569CD6;"> static</span><span style="color:#4EC9B0;"> void</span><span style="color:#DCDCAA;"> main</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">[] </span><span style="color:#9CDCFE;">args</span><span style="color:#D4D4D4;">) </span><span style="color:#569CD6;">throws</span><span style="color:#4EC9B0;"> Exception</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> //用户密码</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> password</span><span style="color:#D4D4D4;"> = </span><span style="color:#CE9178;">"abcdef"</span><span style="color:#D4D4D4;">;</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> //获取到的证书内容</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> key</span><span style="color:#D4D4D4;"> = </span><span style="color:#CE9178;">"-----BEGIN PUBLIC KEY-----</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">Xl69GV6klzgxW6d2xQIDAQAB</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">-----END PUBLIC KEY-----</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">"</span><span style="color:#D4D4D4;">;</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> //获取到的盐值</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> hash</span><span style="color:#D4D4D4;"> = </span><span style="color:#CE9178;">"bb73382121594c46"</span><span style="color:#D4D4D4;">;</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> String</span><span style="color:#D4D4D4;">[] </span><span style="color:#9CDCFE;">split</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">key</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">strip</span><span style="color:#D4D4D4;">().</span><span style="color:#DCDCAA;">split</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"</span><span style="color:#D7BA7D;">\\n</span><span style="color:#CE9178;">"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> newKey</span><span style="color:#D4D4D4;"> = split[</span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">] + split[</span><span style="color:#B5CEA8;">2</span><span style="color:#D4D4D4;">] + split[</span><span style="color:#B5CEA8;">3</span><span style="color:#D4D4D4;">] + split[</span><span style="color:#B5CEA8;">4</span><span style="color:#D4D4D4;">];</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> //进行加密</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> KeyFactory</span><span style="color:#9CDCFE;"> keyFactory</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">KeyFactory</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getInstance</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"RSA"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> X509EncodedKeySpec</span><span style="color:#9CDCFE;"> keySpec</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#DCDCAA;"> X509EncodedKeySpec</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">Base64</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">decode</span><span style="color:#D4D4D4;">(newKey));</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> PublicKey</span><span style="color:#9CDCFE;"> publicKey</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">keyFactory</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">generatePublic</span><span style="color:#D4D4D4;">(keySpec);</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> Cipher</span><span style="color:#9CDCFE;"> cipher</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">Cipher</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getInstance</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">keyFactory</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getAlgorithm</span><span style="color:#D4D4D4;">());</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> cipher</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">init</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">Cipher</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">PUBLIC_KEY</span><span style="color:#D4D4D4;">, publicKey);</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> byte</span><span style="color:#D4D4D4;">[] </span><span style="color:#9CDCFE;">bytes</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">cipher</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">doFinal</span><span style="color:#D4D4D4;">((hash + password).</span><span style="color:#DCDCAA;">getBytes</span><span style="color:#D4D4D4;">());</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> encode</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">Base64</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">encode</span><span style="color:#D4D4D4;">(bytes);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> System</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">out</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">println</span><span style="color:#D4D4D4;">(encode);</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 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><h2 id="手机号验证" tabindex="-1"><a class="header-anchor" href="#手机号验证"><span>手机号验证</span></a></h2><h3 id="简述" tabindex="-1"><a class="header-anchor" href="#简述"><span>简述</span></a></h3><p>有时使用密码登录时, 无论使用网页端还是手机端接口, 由于 请求头缺失/请求频率高/请求IP 等原因, 会返回如下内容, 此时需要进行手机号验证或绑定</p><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"0"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "is_new"</span><span style="color:#D4D4D4;">: </span><span style="color:#569CD6;">false</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "status"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">2</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"本次登录环境存在风险, 需使用手机号进行验证或绑定"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "url"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"https://passport.bilibili.com/h5-app/passport/risk/verify?tmp_token=imtmptk&request_id=imreqid&source=risk"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "refresh_token"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">""</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "timestamp"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "hint"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">""</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "in_reg_audit"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</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></div><h3 id="获取-captcha" tabindex="-1"><a class="header-anchor" href="#获取-captcha"><span>获取 captcha</span></a></h3><blockquote><p>https://passport.bilibili.com/x/safecenter/captcha/pre</p></blockquote><p><em>请求方法: POST</em></p><p><strong>正文参数 (application/x-www-form-urlencoded):</strong></p><table><thead><tr><th>参数名</th><th>类型</th><th>内容</th><th>必要性</th><th>备注</th></tr></thead><tbody><tr><td>source</td><td>str</td><td>risk</td><td>不必要</td><td></td></tr></tbody></table><p><strong>JSON 回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>num</td><td>返回值</td><td>0: 成功</td></tr><tr><td>message</td><td>str</td><td>错误信息</td><td>默认为 0</td></tr><tr><td>ttl</td><td>num</td><td>1</td><td></td></tr><tr><td>data</td><td>obj</td><td>数据本体</td><td></td></tr></tbody></table><p><code>data</code> 对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>recaptcha_type</td><td>str</td><td>验证码类型</td><td>目前仅 <code>geetest</code></td></tr><tr><td>recaptcha_token</td><td>str</td><td>验证码 token</td><td></td></tr><tr><td>gee_challenge</td><td>str</td><td>极验 challenge</td><td></td></tr><tr><td>gee_gt</td><td>str</td><td>极验 gt</td><td></td></tr></tbody></table><p><strong>示例:</strong></p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#569CD6;"> -X</span><span style="color:#CE9178;"> POST</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/x/safecenter/captcha/pre'</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"0"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "recaptcha_type"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"geetest"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "recaptcha_token"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"8a418aa9eebe411599d759fc318d55e1"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "gee_challenge"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"4e5353e7ab9f9aef0c97fa5a5b1ad101"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "gee_gt"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"ac597a4506fee079629df5d8b66dd4fe"</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></div></details><h3 id="发送验证码" tabindex="-1"><a class="header-anchor" href="#发送验证码"><span>发送验证码</span></a></h3><blockquote><p>https://passport.bilibili.com/x/safecenter/common/sms/send</p></blockquote><p><em>请求方法: POST</em></p><p><strong>正文参数 (application/x-www-form-urlencoded):</strong></p><table><thead><tr><th>参数名</th><th>类型</th><th>内容</th><th>必要性</th><th>备注</th></tr></thead><tbody><tr><td>tmp_code</td><td>str</td><td>url query 中的 tmp_code</td><td>必要</td><td>参见 <a href="#%E7%AE%80%E8%BF%B0">简述</a> 中 JSON 示例中的 <code>url</code></td></tr><tr><td>sms_type</td><td>str</td><td><code>loginTelCheck</code></td><td>必要</td><td></td></tr><tr><td>recaptcha_token</td><td>str</td><td>验证码 token</td><td>必要</td><td>参见 <a href="#%E8%8E%B7%E5%8F%96-captcha">获取 captcha</a></td></tr><tr><td>gee_challenge</td><td>str</td><td>极验 challenge</td><td>必要</td><td>参见 <a href="#%E8%8E%B7%E5%8F%96-captcha">获取 captcha</a></td></tr><tr><td>gee_validate</td><td>str</td><td>极验 validate</td><td>必要</td><td>验证后获得</td></tr><tr><td>gee_seccode</td><td>str</td><td>极验 seccode</td><td>必要</td><td>验证后获得</td></tr></tbody></table><p><strong>JSON回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>num</td><td>返回值</td><td>0: 成功</td></tr><tr><td>message</td><td>str</td><td>错误信息</td><td>默认为 0</td></tr><tr><td>ttl</td><td>num</td><td>1</td><td></td></tr><tr><td>data</td><td>obj</td><td>数据本体</td><td></td></tr></tbody></table><p><code>data</code> 对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>captcha_key</td><td>str</td><td>验证码 key</td><td></td></tr></tbody></table><p><strong>示例:</strong></p><p>假设 <code>tmp_code</code> 为 <code>imtmptk</code>, <code>recaptcha_token</code> 为 <code>kfc</code>, <code>gee_challenge</code> 为 <code>crazythursday</code>, <code>gee_validate</code> 为 <code>vivo50</code>, <code>gee_seccode</code> 为 <code>vivo50|jordan</code></p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#569CD6;"> -X</span><span style="color:#CE9178;"> POST</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/x/safecenter/common/sms/send'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'tmp_code=imtmptk'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'sms_type=loginTelCheck'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'recaptcha_token=kfc'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'gee_challenge=crazythursday'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'gee_validate=vivo50'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'gee_seccode=vivo50|jordan'</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></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"0"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "captcha_key"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"42403fb08ed2cd97afff14edefbae482"</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></div></details><h3 id="验证手机验证码" tabindex="-1"><a class="header-anchor" href="#验证手机验证码"><span>验证手机验证码</span></a></h3><blockquote><p>https://passport.bilibili.com/x/safecenter/login/tel/verify</p></blockquote><p><em>请求方法: POST</em></p><p><strong>正文参数 (application/x-www-form-urlencoded):</strong></p><table><thead><tr><th>参数名</th><th>类型</th><th>内容</th><th>必要性</th><th>备注</th></tr></thead><tbody><tr><td>tmp_code</td><td>str</td><td>url query 中的 tmp_code</td><td>必要</td><td>参见 <a href="#%E7%AE%80%E8%BF%B0">简述</a> 中 JSON 示例中的 <code>url</code></td></tr><tr><td>captcha_key</td><td>str</td><td>验证码 key</td><td>必要</td><td>参见 <a href="#%E5%8F%91%E9%80%81%E9%AA%8C%E8%AF%81%E7%A0%81">发送验证码</a></td></tr><tr><td>type</td><td>str</td><td><code>loginTelCheck</code></td><td>必要</td><td></td></tr><tr><td>code</td><td>num</td><td>接收到的验证码</td><td>必要</td><td></td></tr><tr><td>request_id</td><td>str</td><td>url query 中的 request_id</td><td>必要</td><td>参见 <a href="#%E7%AE%80%E8%BF%B0">简述</a> 中 JSON 示例中的 <code>url</code></td></tr><tr><td>source</td><td>str</td><td>risk</td><td>必要</td><td></td></tr></tbody></table><p><strong>JSON回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>num</td><td>返回值</td><td>0: 成功</td></tr><tr><td>message</td><td>str</td><td>错误信息</td><td>默认为 0</td></tr><tr><td>ttl</td><td>num</td><td>1</td><td></td></tr><tr><td>data</td><td>obj</td><td>数据本体</td><td></td></tr></tbody></table><p><code>data</code> 对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>str</td><td>交换代码</td><td>用于后面 <a href="#%E4%BA%A4%E6%8D%A2-cookie">交换 Cookie</a></td></tr></tbody></table><p><strong>示例:</strong></p><p>假设 <code>tmp_code</code> 为 <code>imtmptk</code>, <code>captcha_key</code> 为 <code>42403fb08ed2cd97afff14edefbae482</code>, <code>code</code> 为 <code>114514</code>, <code>request_id</code> 为 <code>imreqid</code></p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#569CD6;"> -X</span><span style="color:#CE9178;"> POST</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/x/safecenter/login/tel/verify'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'tmp_code=imtmptk'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'captcha_key=42403fb08ed2cd97afff14edefbae482'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'type=loginTelCheck'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'code=114514'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode</span><span style="color:#CE9178;">'request_id=imreqid'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode</span><span style="color:#CE9178;">'source=risk'</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></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"0"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"6eadf783c55a387b143773282b217682"</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></div></details><h3 id="交换-cookie" tabindex="-1"><a class="header-anchor" href="#交换-cookie"><span>交换 Cookie</span></a></h3><blockquote><p>https://passport.bilibili.com/x/passport-login/web/exchange_cookie</p></blockquote><p><em>请求方法: POST</em></p><p><strong>正文参数 (application/x-www-form-urlencoded):</strong></p><table><thead><tr><th>参数名</th><th>类型</th><th>内容</th><th>必要性</th><th>备注</th></tr></thead><tbody><tr><td>source</td><td>str</td><td>risk</td><td>必要</td><td></td></tr><tr><td>code</td><td>str</td><td>交换代码</td><td>必要</td><td>参见 <a href="#%E9%AA%8C%E8%AF%81%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81">验证手机验证码</a></td></tr></tbody></table><p><strong>JSON回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>num</td><td>返回值</td><td>0: 成功</td></tr><tr><td>message</td><td>str</td><td>错误信息</td><td>默认为 0</td></tr><tr><td>ttl</td><td>num</td><td>1</td><td></td></tr><tr><td>data</td><td>obj</td><td>数据本体</td><td></td></tr></tbody></table><p><code>data</code> 对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>url</td><td>str</td><td>游戏分站跨域登录 url</td><td></td></tr><tr><td>refresh_token</td><td>str</td><td>刷新 token</td><td></td></tr></tbody></table><p><strong>示例:</strong></p><p>假设 <code>code</code> 为 <code>6eadf783c55a387b143773282b217682</code></p><div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-shell"><span class="line"><span style="color:#DCDCAA;">curl</span><span style="color:#569CD6;"> -X</span><span style="color:#CE9178;"> POST</span><span style="color:#CE9178;"> 'https://passport.bilibili.com/x/passport-login/web/exchange_cookie'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode </span><span style="color:#CE9178;">'code=6eadf783c55a387b143773282b217682'</span><span style="color:#D7BA7D;"> \\</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">--data-urlencode</span><span style="color:#CE9178;">'source=risk'</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></div><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"0"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "url"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"https://passport.biligame.com/x/passport-login/web/crossDomain?DedeUserID=645769214&DedeUserID__ckMd5=653409864bf9e200&Expires=1739265009&SESSDATA=11d97d2a,1739265009,928d7*82CjCKOhDRm5gROpSfgQ7B2axGVMWm5LuwNTkNDK2vjeGl7xvAsfsCINKmczXvO_Z45FsSVlJ1NHdlYlpSei1lYjdqUXRMaUpuRk9GbjVPS0psc3ZTcDFGRjhnNGhIbHRlZ0ZQRWQ1MUlUY2pnQ0lkTVRYNjlabmlUWGxHcVdkV3hrcElpa0ZEZEZRIIEC&bili_jct=3cdee5b84eb48d4f08bcfd57b58cf40b&gourl=https%3A%2F%2Fwww.bilibili.com%2F&first_domain=.bilibili.com"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "refresh_token"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"43de156ad241864640f9d9721656a682"</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></div></details><details><summary>查看响应头部示例:</summary><div class="language-http line-numbers-mode" data-highlighter="shiki" data-ext="http" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-http"><span class="line"><span style="color:#D4D4D4;">HTTP/2 </span><span style="color:#B5CEA8;">200</span><span style="color:#CE9178;"> OK</span></span>
|
||
<span class="line"><span style="color:#569CD6;">date:</span><span style="color:#CE9178;"> Thu, 15 Aug 2024 09:10:09 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">content-type:</span><span style="color:#CE9178;"> application/json; charset=utf-8</span></span>
|
||
<span class="line"><span style="color:#569CD6;">access-control-allow-credentials:</span><span style="color:#CE9178;"> true</span></span>
|
||
<span class="line"><span style="color:#569CD6;">access-control-allow-methods:</span><span style="color:#CE9178;"> GET,POST,PUT,DELETE</span></span>
|
||
<span class="line"><span style="color:#569CD6;">access-control-allow-origin:</span><span style="color:#CE9178;"> https://passport.bilibili.com</span></span>
|
||
<span class="line"><span style="color:#569CD6;">bili-status-code:</span><span style="color:#CE9178;"> 0</span></span>
|
||
<span class="line"><span style="color:#569CD6;">bili-trace-id:</span><span style="color:#CE9178;"> 175262647666bdc5</span></span>
|
||
<span class="line"><span style="color:#569CD6;">set-cookie:</span><span style="color:#CE9178;"> SESSDATA=xxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT; HttpOnly; Secure</span></span>
|
||
<span class="line"><span style="color:#569CD6;">set-cookie:</span><span style="color:#CE9178;"> bili_jct=xxxxxxxxxxxxxxxxxxxxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">set-cookie:</span><span style="color:#CE9178;"> DedeUserID=114514191; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">set-cookie:</span><span style="color:#CE9178;"> DedeUserID__ckMd5=0123456789abcdef; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">set-cookie:</span><span style="color:#CE9178;"> sid=xxxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">vary:</span><span style="color:#CE9178;"> Origin</span></span>
|
||
<span class="line"><span style="color:#569CD6;">x-bili-trace-id:</span><span style="color:#CE9178;"> 60f0305e2abc511d175262647666bdc5</span></span>
|
||
<span class="line"><span style="color:#569CD6;">access-control-allow-headers:</span><span style="color:#CE9178;"> Origin,No-Cache,X-Requested-With,If-Modified-Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,Access-Control-Allow-Credentials,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Cache-Webcdn,x-bilibili-key-real-ip,x-backend-bili-real-ip,x-risk-header</span></span>
|
||
<span class="line"><span style="color:#569CD6;">cross-origin-resource-policy:</span><span style="color:#CE9178;"> cross-origin</span></span>
|
||
<span class="line"><span style="color:#569CD6;">access-control-expose-headers:</span><span style="color:#CE9178;"> X-Bili-Gaia-Vvoucher,X-Bili-Trace-Id</span></span>
|
||
<span class="line"><span style="color:#569CD6;">expires:</span><span style="color:#CE9178;"> Thu, 15 Aug 2024 09:10:08 GMT</span></span>
|
||
<span class="line"><span style="color:#569CD6;">cache-control:</span><span style="color:#CE9178;"> no-cache</span></span>
|
||
<span class="line"><span style="color:#569CD6;">x-cache-webcdn:</span><span style="color:#CE9178;"> BYPASS from blzone01</span></span>
|
||
<span class="line"><span style="color:#569CD6;">content-encoding:</span><span style="color:#CE9178;"> br</span></span>
|
||
<span class="line"><span style="color:#569CD6;">X-Firefox-Spdy:</span><span style="color:#CE9178;"> h2</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></div></details>`,110))])}const b=p(c,[["render",D]]),m=JSON.parse('{"path":"/docs/login/login_action/password.html","title":"密码登录","lang":"zh-CN","frontmatter":{},"git":{"updatedTime":1726759053000,"contributors":[{"name":"SocialSisterYi","username":"SocialSisterYi","email":"1440239038@qq.com","commits":3,"url":"https://github.com/SocialSisterYi"},{"name":"LaMerChiang","username":"LaMerChiang","email":"catlair@qq.com","commits":1,"url":"https://github.com/LaMerChiang"},{"name":"SessionHu","username":"SessionHu","email":"102411014+SessionHu@users.noreply.github.com","commits":2,"url":"https://github.com/SessionHu"}],"changelog":[{"hash":"1e24c6b1889160c4c35c01416aa4239501accf5f","time":1726759053000,"email":"102411014+SessionHu@users.noreply.github.com","author":"Session小胡","message":"调整部分接口描述与错误修复 (#1088)","coAuthors":[{"name":"社会易姐QwQ","email":"45892418+SocialSisterYi@users.noreply.github.com"}]},{"hash":"60a0c5d1a2f44fe61335da04571305fa7727a968","time":1724238159000,"email":"102411014+SessionHu@users.noreply.github.com","author":"Session小胡","message":"feat: 各种接口补充与错误修正 (#1066)"},{"hash":"92b30f354ab21b97fe52357161fd04e2ca687c97","time":1693842068000,"email":"catlair@qq.com","author":"LaMerChiang","message":"fix: 修正文档中存在的错误路径,标签和目录 (#806)"},{"hash":"f6760f4be38d5b592d396b211e48c666286524de","time":1677124138000,"email":"1440239038@qq.com","author":"SocialSisterYi","message":"🔨remove header index"},{"hash":"7d89ece2ac46425810647c4ac92acf5f3721cb68","time":1676998806000,"email":"1440239038@qq.com","author":"SocialSisterYi","message":"🚀调整项目结构"}]},"filePathRelative":"docs/login/login_action/password.md"}');export{b as comp,m as data};
|