Files
mihoyo-api-collect/hoyolab/login/password_passport.md
2023-10-26 07:38:45 +08:00

9.4 KiB
Raw Blame History

米哈游通行证密码登录


密码登录

操作步骤

  1. 申请人机验证任务,获取gtmmt_key等验证数据
  2. 登录获取Login Ticket

申请人机验证任务

请求方式GET

https://webapi.account.mihoyo.com/Api/create_mmt

参数:

字段 类型 内容 备注
scene_type num 暂不知道具体含义,可直接使用值 1 必须传入,可参考米哈游通行证密码登录页使用的值为 1
now num 当前的Unix时间戳 必须传入
reason str 调用API的网页链接 可参考米哈游通行证密码登录页使用user.mihoyo.com%2523%252Flogin%252Fpassword已进行URL编码
action_type str 登录方式
login_by_password 密码登录
t num 当前的Unix时间戳
account str 绑定手机或绑定邮箱

JSON返回

根对象:

字段 类型 内容 备注
code num 返回码
data obj 返回数据

data对象:

字段 类型 内容 备注
mmt_data obj 极验验证任务数据
mmt_type num 验证任务类型
1 需要进行人机验证
0 无需进行人机验证
msg str 返回消息
scene_type num 与URL请求参数中的scene_type相同
status num 返回码
1 成功

data对象→mmt_data对象:

字段 类型 内容 备注
mmt_key str 验证任务 mmt_data 对象仅包含该字段时,说明不需要进行人机验证,可直接使用该值进行登录
gt str 验证ID 验证ID极验文档中的captchaId通常为服务器申请得到服务器要求使用极验第四代行为验证时验证ID通常为6697d9dd2614c8a2a55752732494fd56(服务器要求使用极验第三代行为验时)
challenge str 验证流水号 服务器要求使用极验第三代行为验时需要用到
new_captcha num 极验验证码相关的参数,是否为新验证码类型的离线情况下使用 一般为 1
risk_type str 结合风控融合,指定验证形式
slide 拖动滑块完成拼图
服务器要求使用极验第三代行为验时不返回该项
success num 是否成功
1 成功
use_v4 bool 是否使用极验第4代适应性验证 服务器要求使用极验第三代行为验时不返回该项

备注:

  • 若直接访问该api将有很大概率要求使用极验第三代行为验
  • 通常首次申请验证任务返回的mmt_data对象只会包含mmt_key,不会返回gt等其他字段,这说明不需要进行人机验证,可直接使用mmt_key字段值进行登录(也可通过mmt_type判断)
  • JSON返回数据的mmt_data对象中一些字段说明参考自极验官方文档
查看示例
// 无需进行验证时:
{
  "code": 200,
  "data": {
    "mmt_data": {
      "mmt_key": "nAZzNc45p76J85nz3PRV6tjGp0SX9TDc"
    },
    "mmt_type": 0,
    "msg": "成功",
    "scene_type": 1,
    "status": 1
  }
}

// 需要进行验证时 - 要求使用第四代验证
{
  "code": 200,
  "data": {
    "mmt_data": {
      "gt": "0b3dbaab0ad3f8344ab45342c3f3d909",
      "mmt_key": "3hfbcdJd5K9g23Fu0hRFA7DDDRRzKJdC",
      "new_captcha": 1,
      "risk_type": "slide",
      "success": 1,
      "use_v4": true
    },
    "mmt_type": 1,
    "msg": "成功",
    "scene_type": 1,
    "status": 1
  }
}
// 需要进行验证时 - 要求使用第三代验证
{
    "code": 200,
    "data": {
        "mmt_data": {
            "challenge": "6697d9dd2614c8a2a55752732494fd56",
            "gt": "ae0942d9463f21fb73d27d49ed2f1154",
            "mmt_key": "gdfjQZgTpYAJbI7XpqV5vBtmFwHXttR2",
            "new_captcha": 1,
            "success": 1
        },
        "mmt_type": 1,
        "msg": "成功",
        "scene_type": 1,
        "status": 1
    }
}

获取Login Ticket

请求方式POST

https://webapi.account.mihoyo.com/Api/login_by_password

JSON请求

字段 类型 内容 备注
mmt_key str 验证任务
geetest_v4_data obj 验证结果数据 极验文档getValidate() 返回的对象
具体内容:请求参数
若使用第三代验证时无需传入此项
geetest_challenge str 极验第三代行为验的sdk返回的验证流水号 若使用第四代验证时无需传入此项
geetest_validate str 极验第三代行为验的sdk返回的validate 若使用第四代验证时无需传入此项
geetest_seccode str 极验第三代行为验的sdk返回的seccode 若使用第四代验证时无需传入此项
account str 要登录的账户
password str 密码使用RSA + Base64加密或不加密
is_crypto bool 密码是否被加密
source str 登录操作来源 可参考 米哈游通行证密码登录页 使用的是 user.mihoyo.com
t num 当前的秒级时间戳

geetest_v4_data对象:

字段 类型 内容 备注
lot_number str 验证流水号
captcha_output str 验证输出信息
pass_token str 验证通过标识
gen_time str 验证通过时间戳
captcha_id str 验证 ID
sign_token str 验证签名

注:

若需加密密码需要使用的RSA公钥参见该提议

加密的示例代码如下Python需要安装pycryptodome库

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64

public_key = '''-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDvekdPMHN3AYhm/vktJT+YJr7
cI5DcsNKqdsx5DZX0gDuWFuIjzdwButrIYPNmRJ1G8ybDIF7oDW2eEpm5sMbL9zs
9ExXCdvqrn51qELbqj0XxtMTIpaCHFSI50PfPpTFV9Xt/hmyVwokoOXFlAEgCn+Q
CgGs52bFoYMtyi+xEQIDAQAB
-----END PUBLIC KEY-----'''

def rsa_encrypt(message):
    cipher = Cipher_pkcs1_v1_5.new(RSA.importKey(public_key))
    cipher_text = base64.b64encode(cipher.encrypt(message.encode())).decode()
    return cipher_text

JSON返回

根对象:

字段 类型 内容 备注
code num 返回码
data obj 返回数据

data对象:

字段 类型 内容 备注
account_info obj 账号信息
msg str 返回消息
status num 返回码
1 成功

data对象→account_info对象:

字段 类型 内容 备注
account_id num 米游社账号ID
area_code str 绑定手机的国家区号
create_time num 账号注册时间的Unix时间戳
email str 账号的绑定邮箱 该值的中间部分将以星号隐藏
identity_code str 账号实名认证的身份证号
is_adult num 实名认证对应信息是否为成年
1 是
is_email_verify num 绑定邮箱是否已验证
1 是
mobile str 账号的绑定手机 该值的中间部分将以星号隐藏
real_name str 账号实名认证的真实姓名 该值的中间部分将以星号隐藏
safe_area_code str 安全手机的国家区号 该字段已弃用
safe_level num 安全级别 该账号的安全级别
3 高
safe_mobile str 账号的安全手机 该字段已弃用
weblogin_token str Login Ticket 该字段也将出现在响应头的Set-Cookie字段中

备注:

可直接从响应Cookie中获取 Login Ticket

查看示例
{
  "code": 200,
  "data": {
    "account_info": {
      "account_id": 123456789,
      "area_code": "+86",
      "create_time": 1614948789,
      "email": "user****mail@mail.com",
      "identity_code": "111************000",
      "is_adult": 1,
      "is_email_verify": 1,
      "mobile": "181****8888",
      "real_name": "**川",
      "safe_area_code": "+86",
      "safe_level": 3,
      "safe_mobile": "181****8888",
      "weblogin_token": "QDDgghjghHydhdxyduf875UIDYDYq"
    },
    "msg": "成功",
    "status": 1
  }
}