mirror of
https://github.com/UIGF-org/mihoyo-api-collect.git
synced 2025-12-13 21:28:13 +08:00
7.5 KiB
7.5 KiB
米游社密码登录
密码登录
操作步骤
- 申请人机验证任务,获取
gt,mmt_key等任务数据 - 使用账号密码 获取 Login Ticket
申请人机验证任务
请求方式:GET
https://webapi.account.mihoyo.com/Api/create_mmt
参数:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| scene_type | num | 暂不知道具体含义,可直接使用值 1 |
可参考 米哈游通行证密码登录页 使用的值为 1 |
| now | num | 当前的秒级时间戳 | |
| reason | str | 调用API的网页链接 | 可参考 米哈游通行证密码登录页 使用的是 user.mihoyo.com%2523%252Flogin%252Fpassword(已进行URL编码) |
| action_type | str | 登陆方式login_by_password 密码登录 |
|
| t | num | 当前的秒级时间戳 | |
| 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,极验后台申请得到 |
| new_captcha | num | 宕机情况下使用 | 一般为 1 |
| risk_type | str | 结合风控融合,指定验证形式slide 拖动滑块完成拼图 |
|
| success | num | 是否成功1 成功 |
|
| use_v4 | bool | 是否使用极验第四代适应性验证 | 极验官网:https://www.geetest.com/adaptive-captcha |
备注:
- 一般来说,密码登录基本上都不会被要求人机验证(但是谁知道呢)
- 通常首次申请验证任务返回的
mmt_data对象只会包含mmt_key,不会返回gt等其他字段,这说明不需要进行人机验证,可直接使用mmt_key字段值进行登录(也可通过mmt_type判断) - JSON返回数据的
mmt_data对象中一些字段说明参考自 极验官方文档
查看示例
- 请求:
https://webapi.account.mihoyo.com/Api/create_mmt?scene_type=1&now=1691855137471&reason=user.mihoyo.com%23%2Flogin%2Fpassword&action_type=login_by_password&account=<你的账户>&t=1691855137471 - 返回:
- 无需进行人机验证的情况:
{ "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 } }
- 无需进行人机验证的情况:
获取Login Ticket
请求方式:POST
https://webapi.account.mihoyo.com/Api/login_by_password
参数:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| mmt_key | str | 验证任务 | |
| account | str | 要登录的账户 | |
| password | str | 密码(使用RSA + Base64加密或不加密) | |
| is_crypto | bool | 密码是否被加密 | |
| source | str | 登录操作来源 | 可参考 米哈游通行证密码登录页 使用的是 user.mihoyo.com |
| t | num | 当前的秒级时间戳 |
注:
若需加密密码,需要使用的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 | 绑定手机的国家区号 | 如 +86 |
| create_time | num | 账号注册时间的Unix时间戳 | 该值的中间部分将以星号隐藏 |
| str | 邮箱 | 该值的中间部分将以星号隐藏 | |
| identity_code | str | 身份证号 | |
| is_adult | num | 用户是否为成人1 是 |
|
| is_email_verify | num | 是否已验证邮箱1 是 |
|
| mobile | str | 手机号 | 该值的中间部分将以星号隐藏 |
| real_name | str | 真实姓名 | 该值的中间部分将以星号隐藏 |
| safe_area_code | str | 绑定手机的国家区号 | 如 +86 |
| safe_level | num | 安全级别 | 该账号的安全级别 3 高 |
| safe_mobile | str | 绑定手机 | 该值的中间部分将以星号隐藏 |
| weblogin_token | str | 即Cookie中的 Login Ticket 字段 | 该字段也将出现在响应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
}
}