米游社api相关

 · 2022-5-9 · 次阅读


请求规范(请求头)

字段 说明 参考值(无特殊需求可以照抄)
x-rpc-app_version 米游社app版本 2.11.1
User-Agent UA字段 Mozilla/5.0 AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1
x-rpc-client_type 客户端类型 5
Referer Referer字段 https://webstatic.mihoyo.com/
Cookie 米游社Cookie 浏览器登录米游社,F12找到控制台,输入"document.cookie"回车即可,如下图
DS 动态密钥 生成方法如下

Snipaste_2022-05-09_18-54-50

动态密钥

动态密钥由3部分构成,最后一部分是一个MD5。MD5的输入由5个部分构成,按照如下格式进行组合:

data = f"salt={CN_DS_SALT}&t={t}&r={r}&b={b}&q={q}"

参数说明:

参数 含义
CN_DS_SALT 盐,在当前版本的米游社app里这个值是“xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs”
t 时间戳
r 一个从100000到200000的随机数
b POST请求的数据,需要将字典对象序列化
q GET请求的数据,形如"aaa=aaa&bbb=bbb&ccc=ccc"

伪代码如下:

data = "salt={CN_DS_SALT}&t={t}&r={r}&b={b}&q={q}"
md5data = md5(data)
DS = "{t},{r},{h}"

给出两种实现方式:

python(@heartalborada

CN_DS_SALT = 'xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs'
def generate_cn_ds(body = None, query = None) -> str:
    '''
    Body: POST请求
    query: GET请求
    '''
    t = int(time.time())
    r = random.randint(100001, 200000)
    b = json.dumps(body) if body else ""
    q = "&".join(f"{k}={v}" for k, v in sorted(query.items())) if query else ""
    h = hashlib.md5(f"salt={CN_DS_SALT}&t={t}&r={r}&b={b}&q={q}".encode()).hexdigest()
    return f"{t},{r},{h}"

C#(@DGP-Studio

using Snap.Data.Json;
using Snap.Data.Utility;
using System;
using System.Linq;

public class DynamicSecretProvider2 : Md5Converter
{
    private static readonly string APISalt = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs";

    public static string Create(string queryUrl, object? postBody = null)
    {
        long t = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
        string r = GetRandomString();
        string b = postBody is null ? "" : Json.Stringify(postBody);
        string q = "";
        string[] urlParts = queryUrl.Split('?');
        if (urlParts.Length == 2)
        {
            string[] queryParams = urlParts[1].Split('&').OrderBy(x => x).ToArray();
            q = string.Join("&", queryParams);
        }
        string check = GetComputedMd5($"salt={APISalt}&t={t}&r={r}&b={b}&q={q}");

        return $"{t},{r},{check}";
    }

    private static readonly Random random = new();
    private static string GetRandomString()
    {
        return random.Next(100000, 200000).ToString();
    }
}

API

UID 查询玩家基本信息

url:https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/index

请求方式:GET

传入字段 说明
role_id 玩家UID 如“100010000”
server 玩家所在服务器 “cn_gf01”国服官服,“cn_qd01”国服B服

获取角色武器和圣遗物

url:https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/character

请求方式:POST

传入字段 说明
character_ids 要查询的角色id 传入空数组即可,即 [],可获取全部角色
role_id 玩家UID 如“100010000”
server 玩家所在服务器 “cn_gf01”国服官服,“cn_qd01”国服B服

获取档期和上期角色数据

url:https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/spiralAbyss

请求方式:GET

传入字段 说明
role_id 玩家UID 如“100010000”
server 玩家所在服务器 “cn_gf01”国服官服,“cn_qd01”国服B服
schedule_type 档期类型 “1”为本期,“2”为上期