UIGF-org / mihoyo-api-collect

收集米哈游旗下的游戏与应用的API。
Other
337 stars 31 forks source link

问一下国际服的东西 #53

Closed iCpdXD closed 5 months ago

iCpdXD commented 5 months ago

国际服获取LToken我推测出是 https://api-account-os.hoyoverse.com/account/auth/api/getMultiTokenByLoginTicket ,但我没搞明白通过LToken获取绑定游戏账号的基本信息该用什么,有人能帮帮我嘛?顺带一提,有能获取角色武器信息的api嘛?

BTMuli commented 5 months ago

通过LToken获取绑定游戏账号的基本信息该用什么

与国服类似,可以参考 文档,数据都是差不多的。

有能获取角色武器信息的api嘛?

获取角色列表,返回相关数据如下:

https://github.com/UIGF-org/mihoyo-api-collect/blob/a8dc1ccadafc23d451ff89b0fc69d85f0733412f/hoyolab/user/game_account_info.md?plain=1#L766-L777

Lightczx commented 5 months ago

DS2有效期只有10秒

iCpdXD commented 5 months ago

DS2有效期只有10秒

我只会java所以是用java写的,我生成好的DS2是立马使用的 但回复依旧是 { "data": null, "message": "invalid request", "retcode": -10001 } image 这是另外一个生成ds2的代码,使用起来也是-10001 ==

qhy040404 commented 5 months ago

首先,你的role_id怎么只有8位

其次,hoyolab的salt与国服是不一样的

iCpdXD commented 5 months ago

首先,你的role_id怎么只有8位

其次,hoyolab的salt与国服是不一样的

抱歉,我role_id一直用的是hoyolab中的通行证id,最近我这边登录游戏一直是“请求频繁”就没上号确认(失忆了)=。= 那hoyolab的salt是什么?(刚刚找了找,我没找到...

MoRanYue commented 5 months ago

首先,你的role_id怎么只有8位

其次,hoyolab的salt与国服是不一样的

抱歉,我role_id一直用的是hoyolab中的通行证id,最近我这边登录游戏一直是“请求频繁”就没上号确认(失忆了)=。= 那hoyolab的salt是什么?(刚刚找了找,我没找到...

HoYoLab版本:2.54.0 K2:599uqkwc0dlqu3h6epzjzfhgyyrd44ae LK2:rk4xg2hakoi26nljpr099fv9fck1ah10

iCpdXD commented 5 months ago

首先,你的role_id怎么只有8位 其次,hoyolab的salt与国服是不一样的

抱歉,我role_id一直用的是hoyolab中的通行证id,最近我这边登录游戏一直是“请求频繁”就没上号确认(失忆了)=。= 那hoyolab的salt是什么?(刚刚找了找,我没找到...

HoYoLab版本:2.54.0 K2:599uqkwc0dlqu3h6epzjzfhgyyrd44ae LK2:rk4xg2hakoi26nljpr099fv9fck1ah10

老哥,抱歉啊周末去外地玩了才看到 我换了一下,结果现在返回的是 { "error": 403, "message": "Our services are not available in your country or region." } 这错误怎么越来越离谱==

MilvusSky commented 5 months ago

首先,你的role_id怎么只有8位 其次,hoyolab的salt与国服是不一样的

抱歉,我role_id一直用的是hoyolab中的通行证id,最近我这边登录游戏一直是“请求频繁”就没上号确认(失忆了)=。= 那hoyolab的salt是什么?(刚刚找了找,我没找到...

HoYoLab版本:2.54.0 K2:599uqkwc0dlqu3h6epzjzfhgyyrd44ae LK2:rk4xg2hakoi26nljpr099fv9fck1ah10

老哥,抱歉啊周末去外地玩了才看到 我换了一下,结果现在返回的是 { "error": 403, "message": "Our services are not available in your country or region." } 这错误怎么越来越离谱==

上代理,hoyolab禁大陆的

iCpdXD commented 5 months ago

上代理,hoyolab禁大陆的

坏了,现在不是上不上代理的问题了(昨天用全局的代理也不行),我现在除了更新的Cookie,改了其他没改,但返回又是-10001 我看国际服要验证的请求头只有 x-rpc-client_type、 4XsaltDS2、Cookie(LToken)这四个 image 在调用的时候我是不是也不用在意这么多,只保证验证的四个没错就行? 还有就是,我现在都还不清除是我调用的有问题还是生成的是ds2有问题== 有没有哪位老哥代码or软件调通过的,给我看看demo或教教我QAQ

Lightczx commented 5 months ago

谁跟你说有4X这个头的

Lightczx commented 5 months ago

另外 -10001 100%是生成的DS不正确 参数问题会返回 -101

MilvusSky commented 5 months ago

上代理,hoyolab禁大陆的

坏了,现在不是上不上代理的问题了(昨天用全局的代理也不行),我现在除了更新的Cookie,改了其他没改,但返回又是-10001 我看国际服要验证的请求头只有 x-rpc-client_type、 4XsaltDS2、Cookie(LToken)这四个 image 在调用的时候我是不是也不用在意这么多,只保证验证的四个没错就行? 还有就是,我现在都还不清除是我调用的有问题还是生成的是ds2有问题== 有没有哪位老哥代码or软件调通过的,给我看看demo或教教我QAQ

字段就是DS,不是DS2

QooLianyi commented 5 months ago

0B~X$)N_(G@%5Q99K}3H(7H

文档上所说的验证请求头部分,X4 salt代表的是生成DS所需的salt为X4,并不是让你在header内设置一个X4字段;DS2代表的是所需的DS为DSGen2,同理还有DSGen1,不同版本的DS有不同的生成规则,不论是DSGen1还是DSGen2,在header内的字段名总是DS

以下是一个请求头模板,只列出了部分出现频率高的字段,实际上会包含更多的字段

x-rpc-client_type: 5
DS: 生成的DS
Cookie: 账号的cookie
iCpdXD commented 5 months ago

rk4xg2hakoi26nljpr099fv9fck1ah10

上代理,hoyolab禁大陆的

坏了,现在不是上不上代理的问题了(昨天用全局的代理也不行),我现在除了更新的Cookie,改了其他没改,但返回又是-10001 我看国际服要验证的请求头只有 x-rpc-client_type、 4XsaltDS2、Cookie(LToken)这四个 image 在调用的时候我是不是也不用在意这么多,只保证验证的四个没错就行? 还有就是,我现在都还不清除是我调用的有问题还是生成的是ds2有问题== 有没有哪位老哥代码or软件调通过的,给我看看demo或教教我QAQ

字段就是DS,不是DS2

private static String getRole() throws IOException {
    String lToken = getLToken();
    HttpHost proxy = new HttpHost("127.0.0.1", 7890, "http");
    CloseableHttpClient httpClient = HttpClients.custom()
            .setRoutePlanner(new DefaultProxyRoutePlanner(proxy))
            .build();
    String baseUrl = "https://bbs-api-os.hoyolab.com/game_record/genshin/api/index";
    String role_id = "717663716";
    String server = "os_euro";
    String urlWithParams = baseUrl + "?server=" + server + "&role_id=" + role_id;
    HttpGet roleHttpGet = new HttpGet(urlWithParams);
    roleHttpGet.setHeader("X-Rpc-Client_type", "5");
    roleHttpGet.setHeader("Ds", "1716280271,k3AkSj,2f9cbdd8e53b7ec395263b65f9433527");
    roleHttpGet.setHeader("Cookie", lToken);
    HttpResponse responseRole = httpClient.execute(roleHttpGet);
    String role = EntityUtils.toString(responseRole.getEntity());
    System.out.println(role);
    httpClient.close();
    return role;
}

按道理来讲,带上代理访问应该就是这一段代码,但结果还是-10001 我担心是我ds生成的问题,我直接是刷新的hoyolab从请求头拿到的ds image

iCpdXD commented 5 months ago

0B~X$)N_(G@%5Q99K}3H(7H

文档上所说的验证请求头部分,X4 salt代表的是生成DS所需的salt为X4,并不是让你在header内设置一个X4字段;DS2代表的是所需的DS为DSGen2,同理还有DSGen1,不同版本的DS有不同的生成规则,不论是DSGen1还是DSGen2,在header内的字段名总是DS

以下是一个请求头模板,只列出了部分出现频率高的字段,实际上会包含更多的字段

x-rpc-client_type: 5
DS: 生成的DS
Cookie: 账号的cookie

这个要验证的”cookie“不就应该就是通过Login Ticket获取SToken(V1)和LToken(V1)这个地方获取的ltoken嘛?这个我拿到了

Lightczx commented 5 months ago

DS只能自己生成,拿别的请求的没用,歇歇吧

Lightczx commented 5 months ago

另外HoYoLAB与米游社的SALT不能混用

iCpdXD commented 5 months ago

另外HoYoLAB与米游社的SALT不能混用 HoYoLAB的SALT是啥啊?我翻了很多,都是讨论米游社的没找到HoYoLAB的 这没有SALT,我也生成不了DS啊 =。=

BTMuli commented 5 months ago

这没有SALT,我也生成不了DS啊 =。=

为什么不先用米游社的请求呢?只是测试ds算法的话两者是通用的

iCpdXD commented 5 months ago

这没有SALT,我也生成不了DS啊 =。=

为什么不先用米游社的请求呢?只是测试ds算法的话两者是通用的

  1. 我是想搞个能获取国际服数据,所以一直在尝试用HoYoLAB
  2. 我用米游社的也测试过,也是同样的-10001 目的是想获取国际服数据,所以问的问题也都是和国际服相关的(但米游社是同时在尝试)
public class Demo {
    public static void main(String[] args){
        // 要使用的salt,此为4X salt
        String salt = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs";
        // 发送GET请求时的query参数
        String query = "server=cn_gf01&role_id=101723216";
        // 1. 获取当前的Unix时间戳(秒)
        long t = Instant.now().getEpochSecond();
        // 2. 生成100000到200000之间的随机整数
        Random random = new Random();
        int r = random.nextInt(100001) + 100000;
        if (r == 100000) {
            r = 642367;// 确保 r 不等于 100000
        }
        //3.获取query参数,并按照字母升序排列
        String[] queryParams = query.split("&");
        Arrays.sort(queryParams);
        query = String.join("&", queryParams);
        // 4. 组装格式化字符串
        String main = String.format("salt=%s&t=%d&r=%d&b=&q=%s", salt, t, r, query);
        // 5. 进行MD5编码
        String ds = md5(main);
        // 6. 最终结果
        String finalResult = String.format("%d,%d,%s", t, r, ds);
        System.out.println(finalResult);
    }

    public static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8));
            // 将byte数组转为16进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : messageDigest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

这是java写的,改了一下也都有加注释,能帮我看看问题在哪嘛?(那我就先解决ds的问题再说问HoYoLAB的SALT)

Lightczx commented 5 months ago

getMultiTokenByLoginTicket 甚至根本不需要DS 和Cookie,只需要正确的query参数。 除非你在请求别的接口,否则我也不清楚为什么会有 -10001

Lightczx commented 5 months ago

game_record/genshin/api/index 需要正确的referer

Lightczx commented 5 months ago

另外你随便点开一个在这里评论的人,他的主页要是没有项目我原地赤石