import{_ as p,c as d,b as s,a as o,e as t,w as e,d as l,r,o as i}from"./app-Dgsdh8A6.js";const c={};function D(u,n){const a=r("RouteLink");return i(),d("div",null,[n[46]||(n[46]=s("h1",{id:"短信登录",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#短信登录"},[s("span",null,"短信登录")])],-1)),n[47]||(n[47]=s("p",null,"web端短信登录流程:",-1)),s("ol",null,[s("li",null,[t(a,{to:"/docs/login/login_action/"},{default:e(()=>n[0]||(n[0]=[l("完成人机验证")])),_:1,__:[0]})]),n[1]||(n[1]=o("
cid+手机号码tel+登录密钥token+极验challenge+验证结果validate+验证结果seccodecid+手机号码tel+短信验证码codehttps://passport.bilibili.com/web/generic/country/list
请求方式:GET
json回复:
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| code | num | 返回值 | 0:成功 |
| data | obj | 数据本体 |
data对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| common | array | 常用国家&地区 | |
| others | array | 其他国家&地区 |
data中的common和others数组:
| 项 | 类型 | 内容 | 备注 |
|---|---|---|---|
| 0 | obj | 国家&地区1 | |
| n | obj | 国家&地区(n+1) | |
| …… | obj | …… | …… |
common和others数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| id | num | 国际代码值 | |
| cname | str | 国家&地区名 | |
| country_id | str | 国家&地区区号 |
示例:
curl 'https://passport.bilibili.com/web/generic/country/list'{
"code": 0,
"data": {
"common": [
{
"id": 1,
"cname": "中国大陆",
"country_id": "86"
},
{
"id": 5,
"cname": "中国香港特别行政区",
"country_id": "852"
},
…………
],
"others": [
{
"id": 22,
"cname": "阿富汗",
"country_id": "93"
},
{
"id": 20,
"cname": "阿尔巴尼亚",
"country_id": "355"
},
…………
]
}
}https://passport.bilibili.com/x/passport-login/sms/send
请求方式:POST
同手机号短信发送 CD 时间为 60s
短信验证码 timeout 为 5min
验证内容由第一次返回进行处理,解析recaptcha_url的params传到极验进行验证后取到验证结果入参后再次调用即可
正文参数 (application/x-www-form-urlencoded):
`,22)),s("table",null,[n[25]||(n[25]=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[16]||(n[16]=s("tr",null,[s("td",null,"cid"),s("td",null,"num"),s("td",null,"国际冠字码"),s("td",null,"必要"),s("td",null,[l("可以从"),s("a",{href:"#%E8%8E%B7%E5%8F%96%E5%9B%BD%E9%99%85%E5%86%A0%E5%AD%97%E7%A0%81-web%E7%AB%AF"},"获取国际冠字码"),l("获取")])],-1)),n[17]||(n[17]=s("tr",null,[s("td",null,"tel"),s("td",null,"num"),s("td",null,"手机号码"),s("td",null,"必要"),s("td")],-1)),n[18]||(n[18]=s("tr",null,[s("td",null,"login_session_id"),s("td",null,"str"),s("td",null,"登录标识"),s("td",null,"必要"),s("td",null,"uuid去掉'-'后得到")],-1)),s("tr",null,[n[5]||(n[5]=s("td",null,"recaptcha_token",-1)),n[6]||(n[6]=s("td",null,"str",-1)),n[7]||(n[7]=s("td",null,"登录 API token",-1)),n[8]||(n[8]=s("td",null,"必要",-1)),s("td",null,[n[3]||(n[3]=l("在")),t(a,{to:"/docs/login/login_action/#%E7%94%B3%E8%AF%B7captcha%E9%AA%8C%E8%AF%81%E7%A0%81"},{default:e(()=>n[2]||(n[2]=[l("申请 captcha 验证码")])),_:1,__:[2]}),n[4]||(n[4]=l("接口处获取"))])]),s("tr",null,[n[12]||(n[12]=s("td",null,"gee_challenge",-1)),n[13]||(n[13]=s("td",null,"str",-1)),n[14]||(n[14]=s("td",null,"极验 challenge",-1)),n[15]||(n[15]=s("td",null,"必要",-1)),s("td",null,[n[10]||(n[10]=l("在")),t(a,{to:"/docs/login/login_action/#%E7%94%B3%E8%AF%B7captcha%E9%AA%8C%E8%AF%81%E7%A0%81"},{default:e(()=>n[9]||(n[9]=[l("申请 captcha 验证码")])),_:1,__:[9]}),n[11]||(n[11]=l("接口处获取"))])]),n[19]||(n[19]=s("tr",null,[s("td",null,"gee_validate"),s("td",null,"str"),s("td",null,"极验 result"),s("td",null,"必要"),s("td",null,"极验验证后得到")],-1)),n[20]||(n[20]=s("tr",null,[s("td",null,"gee_seccode"),s("td",null,"str"),s("td",null,[l("极验 result +"),s("code",null,"|jordan")]),s("td",null,"必要"),s("td",null,"极验验证后得到")],-1)),n[21]||(n[21]=s("tr",null,[s("td",null,"channel"),s("td",null,"str"),s("td",null,"通道?"),s("td",null,"必要"),s("td",null,'一般固定值为"bili"')],-1)),n[22]||(n[22]=s("tr",null,[s("td",null,"buvid"),s("td",null,"str"),s("td",null,"buvid"),s("td",null,"必要"),s("td",null,"参考如下方法生成")],-1)),n[23]||(n[23]=s("tr",null,[s("td",null,"local_id"),s("td",null,"str"),s("td",null,"同上"),s("td",null,"必要"),s("td",null,"同上")],-1)),n[24]||(n[24]=s("tr",null,[s("td",null,"statistics"),s("td",null,"str"),s("td",null,"?"),s("td",null,"必要"),s("td",null,'一般固定为{"appId":1,"platform":3,"version":"7.27.0","abtest":""},非key-value入参需要转URL编码')],-1))])]),n[49]||(n[49]=o(`json回复:
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| code | num | 返回值 | 0:成功 -400:请求错误 1002:手机号格式错误 86203:短信发送次数已达上限 1003:验证码已经发送 1025:该手机号在哔哩哔哩有过永久封禁记录,无法再次注册或绑定新账号 2400:登录秘钥错误 2406:验证极验服务出错 |
| message | str | 错误信息 | 成功为0 |
| data | obj | 信息本体 |
data对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| captcha_key | str | 短信登录 token | 在下方传参时需要,请备用 |
示例:
例如手机号为13888888888,国际id为1 (中国大陆),登录秘钥为aabbccdd,极验challenge为2333,极验结果为666666,进行发送短信验证码操作
curl 'https://passport.bilibili.com/x/passport-login/sms/send' \\
--data-urlencode 'tel=13888888888' \\
--data-urlencode 'cid=1' \\
--data-urlencode 'login_session_id=669900' \\
--data-urlencode 'recaptcha_token=aabbccdd' \\
--data-urlencode 'gee_challenge=2333' \\
--data-urlencode 'gee_validate=666666' \\
--data-urlencode 'gee_seccode=666666|jordan' \\
--data-urlencode 'channel=bili' \\
--data-urlencode 'buvid=999999' \\
--data-urlencode 'local_id=999999' \\
--data-urlencode 'statistics=%7B%22appId%22%3A1%2C%22platform%22%3A3%2C%22version%22%3A%227.27.0%22%2C%22abtest%22%3A%22%22%7D'生成buvid方法
static buvid() : string {
var mac = [];
for (let i = 0; i < 6; i++) {
var min = Math.min(0, 0xff)
var max = Math.max(0, 0xff)
var num = parseInt((Math.random() * (min - max + 1) + max).toString()).toString(16)
mac.push(num)
}
var md5 = this.md5(mac.join(':'));
var md5Arr = md5.split('');
return "XY\${md5Arr[2]}\${md5Arr[12]}\${md5Arr[22]}\${md5}"
}{"code":0,
"message":"0",
"ttl":1,
"data":{
"captcha_key":"7542f109c3318d74847626495c68c321",
"recaptcha_url":"...."
}
}https://passport.bilibili.com/x/passport-login/web/sms/send
请求方式:POST
同手机号短信发送 CD 时间为 60s
短信验证码 timeout 为 5min
正文参数 (application/x-www-form-urlencoded):
`,17)),s("table",null,[n[45]||(n[45]=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[40]||(n[40]=s("tr",null,[s("td",null,"cid"),s("td",null,"num"),s("td",null,"国际冠字码"),s("td",null,"必要"),s("td",null,[l("可以从"),s("a",{href:"#%E8%8E%B7%E5%8F%96%E5%9B%BD%E9%99%85%E5%86%A0%E5%AD%97%E7%A0%81-web%E7%AB%AF"},"获取国际冠字码"),l("获取")])],-1)),n[41]||(n[41]=s("tr",null,[s("td",null,"tel"),s("td",null,"num"),s("td",null,"手机号码"),s("td",null,"必要"),s("td")],-1)),n[42]||(n[42]=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"),l(":独立登录页"),s("br"),s("code",null,"main_mini"),l(":小窗登录")])],-1)),s("tr",null,[n[29]||(n[29]=s("td",null,"token",-1)),n[30]||(n[30]=s("td",null,"str",-1)),n[31]||(n[31]=s("td",null,"登录 API token",-1)),n[32]||(n[32]=s("td",null,"必要",-1)),s("td",null,[n[27]||(n[27]=l("在")),t(a,{to:"/docs/login/login_action/#%E7%94%B3%E8%AF%B7captcha%E9%AA%8C%E8%AF%81%E7%A0%81"},{default:e(()=>n[26]||(n[26]=[l("申请 captcha 验证码")])),_:1,__:[26]}),n[28]||(n[28]=l("接口处获取"))])]),s("tr",null,[n[36]||(n[36]=s("td",null,"challenge",-1)),n[37]||(n[37]=s("td",null,"str",-1)),n[38]||(n[38]=s("td",null,"极验 challenge",-1)),n[39]||(n[39]=s("td",null,"必要",-1)),s("td",null,[n[34]||(n[34]=l("在")),t(a,{to:"/docs/login/login_action/#%E7%94%B3%E8%AF%B7captcha%E9%AA%8C%E8%AF%81%E7%A0%81"},{default:e(()=>n[33]||(n[33]=[l("申请 captcha 验证码")])),_:1,__:[33]}),n[35]||(n[35]=l("接口处获取"))])]),n[43]||(n[43]=s("tr",null,[s("td",null,"validate"),s("td",null,"str"),s("td",null,"极验 result"),s("td",null,"必要"),s("td",null,"极验验证后得到")],-1)),n[44]||(n[44]=s("tr",null,[s("td",null,"seccode"),s("td",null,"str"),s("td",null,[l("极验 result +"),s("code",null,"|jordan")]),s("td",null,"必要"),s("td",null,"极验验证后得到")],-1))])]),n[50]||(n[50]=o(`json回复:
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| code | num | 返回值 | 0:成功 -400:请求错误 1002:手机号格式错误 86203:短信发送次数已达上限 1003:验证码已经发送 1025:该手机号在哔哩哔哩有过永久封禁记录,无法再次注册或绑定新账号 2400:登录秘钥错误 2406:验证极验服务出错 |
| message | str | 错误信息 | 成功为0 |
| data | obj | 信息本体 |
data对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| captcha_key | str | 短信登录 token | 在下方传参时需要,请备用 |
示例:
例如手机号为13888888888,国际id为1 (中国大陆),登录秘钥为aabbccdd,极验challenge为2333,极验结果为666666,进行发送短信验证码操作
curl 'https://passport.bilibili.com/x/passport-login/web/sms/send' \\
--data-urlencode 'tel=13888888888' \\
--data-urlencode 'cid=1' \\
--data-urlencode 'source=main_web' \\
--data-urlencode 'token=aabbccdd' \\
--data-urlencode 'challenge=2333' \\
--data-urlencode 'validate=666666' \\
--data-urlencode 'seccode=666666|jordan'{"code":0,
"message":"0",
"ttl":1,
"data":{
"captcha_key":"7542f109c3318d74847626495c68c321"
}
}https://passport.bilibili.com/x/passport-login/login/sms
请求方式:POST
验证登录成功后会返回实体内容:
mid expires_in access_token refresh_token
正文参数 (application/x-www-form-urlencoded):
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|---|---|---|---|---|
| cid | num | 国际冠字码 | 必要 | 可以从获取国际冠字码获取 |
| tel | num | 手机号码 | 必要 | |
| login_session_id | str | 登录标识 | 必要 | 必须与上述login_session_id保持一致 |
| code | num | 短信验证码 | 必要 | timeout 为 5min |
| captcha_key | str | 短信登录 token | 必要 | 从上述API请求成功后返回 |
json回复:
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| code | num | 返回值 | 0:成功 -400:请求错误 1006:请输入正确的短信验证码 1007:短信验证码已过期 |
| message | str | 错误信息 | |
| data | obj | 信息本体 |
data对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| mid | str | 用户uid | |
| expires_in | str | 过时时间 | |
| access_token | str | 登录 token | |
| refresh_token | str | 刷新 token | |
| cookie_info | Array | cookie集合 |
示例:
使用手机号13888888888,短信验证码为123456,进行验证登录操作
curl 'https://passport.bilibili.com/x/passport-login/login/sms'
--data-urlencode 'cid=1' \\
--data-urlencode 'tel=13888888888' \\
--data-urlencode 'code=123456' \\
--data-urlencode 'captcha_key=999999' \\
--data-urlencode 'login_session_id=669900'{
"code": 0,
"data": {
"token_info": {
"mid": "...",
"expires_in": "114514",
"access_token": "",
"refresh_token": ""
//...
},
"cookie_info":[
//...
],
"message": "0"
}
}响应头部抓包信息:
可明显看见设置了几个cookie(填入浏览器即可成功登录)
HTTP/1.1 200 OK
Date: Mon, 13 Jul 2020 09:57:33 GMT
Content-Type: application/json;charset=UTF-8
Content-Length: 78
Connection: keep-alive
Server: Apache-Coyote/1.1
Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/; HttpOnly
Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: sid=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Expires: Mon, 13 Jul 2020 09:57:32 GMT
Cache-Control: no-cache
X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01https://passport.bilibili.com/x/passport-login/web/login/sms
请求方式:POST
验证登录成功后会进行设置以下cookie项:
DedeUserID DedeUserID__ckMd5 SESSDATA bili_jct
正文参数 (application/x-www-form-urlencoded):
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|---|---|---|---|---|
| cid | num | 国际冠字码 | 必要 | 可以从获取国际冠字码获取 |
| tel | num | 手机号码 | 必要 | |
| code | num | 短信验证码 | 必要 | timeout 为 5min |
| source | str | 登录来源 | 必要 | main_web:独立登录页main_mini:小窗登录 |
| captcha_key | str | 短信登录 token | 必要 | 从上述API请求成功后返回 |
| go_url | str | 跳转url | 非必要 | 默认为 https://www.bilibili.com |
| keep | bool | 是否记住登录 | 非必要 | true:记住登录false:不记住登录 |
json回复:
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| code | num | 返回值 | 0:成功 -400:请求错误 1006:请输入正确的短信验证码 1007:短信验证码已过期 |
| message | str | 错误信息 | |
| data | obj | 信息本体 |
data对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| is_new | bool | 是否为新注册用户 | false:非新注册用户 true:新注册用户 |
| status | num | 0 | 未知,可能0就是成功吧 |
| url | str | 跳转 url | 默认为 https://www.bilibili.com |
示例:
使用手机号13888888888,短信验证码为123456,进行验证登录操作
curl 'https://passport.bilibili.com/x/passport-login/web/login/sms'
--data-urlencode 'cid=1' \\
--data-urlencode 'tel=13888888888' \\
--data-urlencode 'code=123456'{
"code": 0,
"data": {
"is_new": false,
"status": 0,
"url": "https://space.bilibili.com"
}
}响应头部抓包信息:
可明显看见设置了几个cookie(填入浏览器即可成功登录)
HTTP/1.1 200 OK
Date: Mon, 13 Jul 2020 09:57:33 GMT
Content-Type: application/json;charset=UTF-8
Content-Length: 78
Connection: keep-alive
Server: Apache-Coyote/1.1
Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/; HttpOnly
Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: sid=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Expires: Mon, 13 Jul 2020 09:57:32 GMT
Cache-Control: no-cache
X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01