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+验证结果seccode
  • 提交短信验证码以验证登录操作,使用国际地区代码cid+手机号码tel+短信验证码code
  • ",2))]),n[48]||(n[48]=o(`

    获取国际冠字码_web端

    https://passport.bilibili.com/web/generic/country/list

    请求方式:GET

    json回复:

    根对象:

    字段类型内容备注
    codenum返回值0:成功
    dataobj数据本体

    data对象:

    字段类型内容备注
    commonarray常用国家&地区
    othersarray其他国家&地区

    data中的commonothers数组:

    类型内容备注
    0obj国家&地区1
    nobj国家&地区(n+1)
    ……obj…………

    commonothers数组中的对象:

    字段类型内容备注
    idnum国际代码值
    cnamestr国家&地区名
    country_idstr国家&地区区号

    示例:

    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"
                },
                …………
            ]
        }
    }

    发送短信验证码_app端

    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回复:

    根对象:

    字段类型内容备注
    codenum返回值0:成功
    -400:请求错误
    1002:手机号格式错误
    86203:短信发送次数已达上限
    1003:验证码已经发送
    1025:该手机号在哔哩哔哩有过永久封禁记录,无法再次注册或绑定新账号
    2400:登录秘钥错误
    2406:验证极验服务出错
    messagestr错误信息成功为0
    dataobj信息本体

    data对象:

    字段类型内容备注
    captcha_keystr短信登录 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":"...."
        }
    }

    发送短信验证码_web端

    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回复:

    根对象:

    字段类型内容备注
    codenum返回值0:成功
    -400:请求错误
    1002:手机号格式错误
    86203:短信发送次数已达上限
    1003:验证码已经发送
    1025:该手机号在哔哩哔哩有过永久封禁记录,无法再次注册或绑定新账号
    2400:登录秘钥错误
    2406:验证极验服务出错
    messagestr错误信息成功为0
    dataobj信息本体

    data对象:

    字段类型内容备注
    captcha_keystr短信登录 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"
        }
    }

    使用短信验证码登录_app端

    https://passport.bilibili.com/x/passport-login/login/sms

    请求方式:POST

    验证登录成功后会返回实体内容:

    mid expires_in access_token refresh_token

    正文参数 (application/x-www-form-urlencoded):

    参数名类型内容必要性备注
    cidnum国际冠字码必要可以从获取国际冠字码获取
    telnum手机号码必要
    login_session_idstr登录标识必要必须与上述login_session_id保持一致
    codenum短信验证码必要timeout 为 5min
    captcha_keystr短信登录 token必要上述API请求成功后返回

    json回复:

    根对象:

    字段类型内容备注
    codenum返回值0:成功
    -400:请求错误
    1006:请输入正确的短信验证码
    1007:短信验证码已过期
    messagestr错误信息
    dataobj信息本体

    data对象:

    字段类型内容备注
    midstr用户uid
    expires_instr过时时间
    access_tokenstr登录 token
    refresh_tokenstr刷新 token
    cookie_infoArraycookie集合

    示例:

    使用手机号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-01

    使用短信验证码登录_web端

    https://passport.bilibili.com/x/passport-login/web/login/sms

    请求方式:POST

    验证登录成功后会进行设置以下cookie项:

    DedeUserID DedeUserID__ckMd5 SESSDATA bili_jct

    正文参数 (application/x-www-form-urlencoded):

    参数名类型内容必要性备注
    cidnum国际冠字码必要可以从获取国际冠字码获取
    telnum手机号码必要
    codenum短信验证码必要timeout 为 5min
    sourcestr登录来源必要main_web:独立登录页
    main_mini:小窗登录
    captcha_keystr短信登录 token必要上述API请求成功后返回
    go_urlstr跳转url非必要默认为 https://www.bilibili.com
    keepbool是否记住登录非必要true:记住登录
    false:不记住登录

    json回复:

    根对象:

    字段类型内容备注
    codenum返回值0:成功
    -400:请求错误
    1006:请输入正确的短信验证码
    1007:短信验证码已过期
    messagestr错误信息
    dataobj信息本体

    data对象:

    字段类型内容备注
    is_newbool是否为新注册用户false:非新注册用户
    true:新注册用户
    statusnum0未知,可能0就是成功吧
    urlstr跳转 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
    `,47))])}const m=p(c,[["render",D]]),b=JSON.parse('{"path":"/docs/login/login_action/SMS.html","title":"短信登录","lang":"zh-CN","frontmatter":{},"git":{"updatedTime":1745426370000,"contributors":[{"name":"SocialSisterYi","username":"SocialSisterYi","email":"1440239038@qq.com","commits":2,"url":"https://github.com/SocialSisterYi"},{"name":"Ding","username":"Ding","email":"michael19950415@outlook.com","commits":1,"url":"https://github.com/Ding"},{"name":"SessionHu","username":"SessionHu","email":"102411014+SessionHu@users.noreply.github.com","commits":1,"url":"https://github.com/SessionHu"}],"changelog":[{"hash":"d5cfe489b903dd9cdbb5390750d88f8a9c89436b","time":1745426370000,"email":"102411014+SessionHu@users.noreply.github.com","author":"SessionHu","message":"fixlogin/login_action/SMS.md): broken links"},{"hash":"8e2a4a9025e8fc22d6ab78f9434c2f49d7119d08","time":1685068383000,"email":"michael19950415@outlook.com","author":"Ding","message":"添加app短信登录接口 (#685)"},{"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/SMS.md"}');export{m as comp,b as data};