请求规范(请求头)
字段 | 说明 | 参考值(无特殊需求可以照抄) |
---|---|---|
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 | 动态密钥 | 生成方法如下 |
动态密钥
动态密钥由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”为上期 |