Giter Club home page Giter Club logo

mihoyo-api-collect's People

Contributors

cntvc avatar cptprogrammer avatar dgck81lnn avatar draugus avatar error063 avatar ljzd-pro avatar luorenmu avatar masterain98 avatar moranyue avatar moyanj avatar womsxd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

mihoyo-api-collect's Issues

部分API会验证请求头字段`x-rpc-device_fp`

做星铁体力查询的时候,注意到/game_record/app/hkrpg/api/note这个API如果长期不添加x-rpc-device_fp字段会必定触发验证码(retcode 1034),因此建议鉴权中将x-rpc-device_fp放在“少数API才需要验证的额外的请求头”中。

并入UIGF官网文档

虽然有些地方有点错误,但是总体整理的还是不错的,有没有兴趣并入到UIGF的文档里面呢

关于原神国际服获取祈愿记录 API 的一些信息

以下信息完善后可补充至 /hoyolab/user/game_account_info.md

请求路径与国服相比只有域名不同:

https://hk4e-api-os.hoyoverse.com/event/gacha_info/api/getGachaLog

请求参数与国服类似,增加了 region 参数,但不清楚缺少此参数是否还能成功查询。其值即为 “ID对照表”中的“服务器名称”

(另外,我可以肯定 init_type 参数对于 API 请求没有实际作用,这是祈愿记录页面的遗留参数,表示祈愿类型下拉框初始选中的类型。)

关于post请求的ds算法

body和query一般来说不会同时存在。
指的是在使用post请求,没有query的时候删除那个字段还是直接设置为空
main = f"salt={salt}&t={t}&r={r}&b={body}&q={query}"
main = f"salt={salt}&t={t}&r={r}&b={body}"
这2种我都试过了,都显示服务不可用

<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body bgcolor="white">
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx</center>
</body>
</html>

完整的请求代码如下

async def main():
    # device_id: str = "".join(str(uuid.uuid4()).split("-")).upper() # str(uuid.uuid4()).upper() # "".join(str(uuid.uuid4()).split("-")).upper()
    device_id: str = ''.join(random.choices(ascii_letters + digits, k=32))
    print(device_id)
    print(len(device_id))
    post_data = {
        "role_id": "117373444",
        "server": "prod_gf_cn"
    }
    headers = {
        "x-rpc-app_version": "2.44.1",
        "x-rpc-client_type": "5",
        "x-rpc-device_id": device_id,
        "X-Requested-With": "com.mihoyo.hyperion",
        "Origin": "https://api-takumi-record.mihoyo.com",
        "Host": "api-takumi.mihoyo.com",
        "Referer": "https://webstatic.mihoyo.com",
        "User-Agent": "Mozilla/5.0 (Linux; Android 13; M2101K9C Build/TKQ1.220829.002; wv) " +
            "AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/108.0.5359.128 Mobile Safari/537.36 miHoYoBBS/2.44.1",
        "DS": ds.get_ds(post_data)
    }
    async with aiohttp.ClientSession(cookies=cookies) as session:  # type: ignore
        async with session.get('https://api-takumi-record.mihoyo.com/game_record/app/hkrpg/api/index', params=post_data, headers=headers) as response:
            data = await response.text()
            print(data)

其中get_ds函数长这样

def get_ds(body: Any, query: str = ""):
    # 将要使用的salt,此为2.44.1版本的salt。
    salt = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs"
    # body(post)和query(get)一般来说不会同时存在。
    # 可以使用json库的dumps函数将对象转为JSON字符串。
    body = json.dumps(body)
    # query = "&".join(sorted(query.split("&")))
    t = int(time.time())
    # 直接用更简单粗暴的方法
    r = random.randint(100001, 200000)
    main = f"salt={salt}&t={t}&r={r}&b={body}" # &q={query}"
    print(main)
    ds = md5(main.encode(encoding='UTF-8')).hexdigest()

    final = f"{t},{r},{ds}" # 最终结果。
    return final

现在4X salt和DS2算法有变化吗?生成的DS无法使用。

按照鉴权那页写的js,
let salt = 'xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs';
let time = new Date().getTime().toString().substring(0, 10);
let random = Math.floor(Math.random() * 100001 + 100001);
let body = '';
let query = "role_id=xxxxx&server=prod_gf_cn&isPrev=&schedule_type=1&need_all=true"
let sign = md5("salt=" + salt + "&t=" + time + "&r=" + random + "&b=" + body + "&q=" + query);
console.log(time + "," + random + "," + sign)

header是
Host: api-takumi-record.mihoyo.com
DS:ds
x-rpc-app_version: 2.52.1
x-rpc-client_type: 5

用米游社抓包出来的ds放进去能用,用上述代码生成的ds丢header里会报-10001错误,代码应该没错吧,请问是不是算法或salt改变了?

**版米游社`salt`

可用的salt

需要在验证请求头的API的生成DS请求头字段值时使用合适的salt

K2 LK2 米游社版本
BIPaooxbWZW02fGHZL1If26mYCljPgst 9ttJY72HxbjwWRNHJvn0n2AYue47nYsK 2.63.1
pIlzNr5SAZhdnFW8ZxauW8UlxRdZc45r 0wr0OpH2BNuekYrfeRwkiDdshvt10cTY 2.62.2
uTUzziiV9FazyGA7XgVIk287ZczinFRV L6ht0P18usSaC9c5Do3olmygiR4QX389 2.61.1
AcpNVhfh0oedCobdCyFV8EE1jMOVDy9q 1OJyMNCqFlstEQqqMOv0rKCIdTOoJhNt 2.60.1
awFeNNTsLYcK20LSO60Es8CRVZOjCB1b 6pNd5NnDnbwKxewrPwEoWlSYwhualS2H 2.59.1
kzTvKGDHumYf6h1Ia5txMjxAJuTtD0ol KTJQGN2a2Trqk0tcQZS6JV3rU7CnV8Q6 2.58.2
1XgQyjgs3iGBwEwgnqySnqtPdw0Yi2mP 20k4lPpyult9CEZ2dhoEkV09lkt0Rqes 2.57.1
4boKU9HR49XublAiGdlH6xCpjAnaix3X wam87VdmOXIGINFFSChd4D5idFx9KGiY 2.56.1
xc1lzZFOBGU0lz8ZkPgcrWZArZzEVMbA F6tsiCZEIcL9Mor64OXVJEKRRQ6BpOZa 2.55.1
HwppTvPwIAKGTG7DhnwQRHhQ1LP3oR3S 6opzJn4gevA62u3g6arFwLKu8Hvq9kdP 2.54.1
yuzHvf4MkGYyoS4837hHOwLMyVOmtPuY 0PUWkNIBnLcg8GgRNRJc14kSn4SrPBsS 2.53.1
HiwYTTu2ovGcU51ehSXfe22SpNmQumlT QCRgj6bHHQvS0Rz03loexYSXpuiO3DZ6 2.52.1
OFYrOudMZI78JBshNtCipA12GLQ4smLZ 8eow43oFDpZeLfsSlpYVdtO6cbPN9yAu 2.51.1
A4lPYtN0KGRVwE5M5Fm0DqQiC5VVMVM3 kkFiNdhyHqZ1VnDRHnU1podIvO4eiHcs 2.50.1
egBrFMO1BPBG0UX5XOuuwMRLZKwTVKRV DG8lqMyc9gquwAUFc7zBS62ijQRX9XF7 2.49.1
OYcKGMRDRpnluotQHWwPDnV4xZG4WRMx 9YiFQ07upss6RVY7bwrUe3Hly9pktOr4 2.47.1
KZazpG4cO2QECFDBUCxdhS8cYCsQHfzn X7UOLLnTuNS3kgTJ1BUHOvKpiqp3kmym 2.46.1
Ea0hkTHxe9cJDwlw4hswBGHDfSlmM5t9 J1ylcAXhqus0YkEOEqeYDia4ldrd1Wvg 2.45.1
dZAwGk4e9aC0MXXItkwnHamjA1x30IYw IEIZiKYaput2OCKQprNuGsog1NZc1FkS 2.44.1
ODzG1Jrn6zebX19VRmaJwjFI2CDvBUGq V1PYbXKQY7ysdx3MNCcNbsE1LtY2QZpW 2.43.1
jrU9ULHGZdM9Os3uGHOpjyRELYxby5cg 9gaxOdeeY2W9dw5x62pywhik8cxy5TIJ 2.42.1
TsmyHpZg8gFAVKTtlPaL6YwMldzxZJxQ osgT0DljLarYxgebPPHJFjdaxPfoiHGt 2.41.1
fdv0fY9My9eA7MR0NpjGP9RjueFvjUSQ jEpJb9rRARU2rXDA9qYbZ3selxkuct9a 2.40.1
PVeGWIZACpxXZ1ibMVJPi9inCY4Nd4y2 yUZ3s0Sna1IrSNfk29Vo6vRapdOyqyhB 2.38.1
6J1hde1Wu02eF1DFlLpMjeg2dMloAytL Qqx8cyv7kuyD8fTw11SmvXSFHp7iZD29 2.37.1
n0KjuIrKgLHh08LWSCYP0WXlVXaYvV64 YVEIkzDFNHLeKXLxzqCA9TzxCpWwbIbk 2.36.1
ZSHlXeQUBis52qD1kEgKt5lUYed4b7Bb N50pqm7FSy2AkFz2B3TqtuZMJ5TOl3Ep 2.35.1
z8DRIUjNDT7IT5IZXvrUAxyupA1peND9 9nQiU3AV0rJSIBWgdynfoGMGKaklfbM7 2.34.1
6aupac9Brl9ngY6zTbW4R6qhFU4ieorq DrOURud7SJPhMq7QFGessqlP0W1H1Zde 2.33.1
TMZzKzTLKsdoHlg9HclqPVfswKPkVc3K tUjkz3RmgcqT3wn3EWVRypzw55JNOcqw 2.32.1
vf6vnwHNA28XvTVEG2quR7Jb1nDRshIp dzwqtbBBhnRsaaR74BrqgUo9wnGj192Y 2.31.1
pOdIuWYDJpUE8XywWIvJmqZ3MbQMIcly 8FvNSgrYbNmKA7it3x3PXM1UHt5k5QLD 2.30.1
fvdsy1uvjh2nH7pbRhsR3EehBmfKM07f N5SE5zP9dKlde9doDgnoy0smOneHEDBE 2.29.1
dWCcD2FsOUXEstC5f9xubswZxEeoBOTc ulInCDohgEs557j0VsPDYnQaaz6KJcv5 2.28.1
5egHWuxthS2A3y5cLAs5mFNxZ1Vq47Xm zWUvmGfuUDYtlyJixZKo4TNGkyy2eKdE 2.27.1
x5SqmUKVTOXQm0atFFgzaPnuukoR3kRR B82TrmbdFM1egQyX6nLLoMxHq0bv8o2i 2.26.1
51kF1mSQqrudUeG2bmOpfN1Zyi0w7kup 7vUrKhuTsGFhGFNRuEiFqDn08JqUoZjC 2.25.1
2vQN5HYZQjaMBsBURP2TEiQE2pWxmYBT qEla7MX4OncDWcZ5LIYNh3ZlBVTxvVzE 2.24.1
PRMloet7okK3GkDE9NUugVI9Uwqg772U MuS3jRY8gGBj3POP0oHls3rd2pICh8Dg 2.23.1
Xs13CXZSoSJiSyNqI7OueXHoYFW9nd7J x3zQtF0dT4VqRDhgghCtTMXM6FSZSaAk 2.22.1
WEZMArnp99q0ILEKBhjSmATg6WstvnsL ImmsH7Ucl9yUnGFRjbiPPrY1p8Ph626m 2.21.1
O7NuQxRWQLeDlx3ydb7g0ePHqnuCqUYu 78vFtRwwxhokqXggjHykueJg1Fb3OA01 2.20.1
zs1ckRtbocPtV5em1KvhQ3lohiUIvdRC wCN9yMxmW1shLBMGSxPXRTcwpVavUYZx 2.19.1
qgBAyoUemRSdTyG0cKCURW09K3mkfftA RYarginIzdoujH2WnEtL65isWpVZ5V9N 2.18.1
plKuQubSC47mKGRNQbvHT2JGV5Bv7jtO 3sOJyHWiJpymE0hW2b6OUQQrLq7G0c5c 2.17.1
iKN9RtYfW8sIimkfpLblSoDp4HvtMJB7 eOqOpOPvcRPPDt1PSdoaNRM78RJ3e8Tk 2.16.1
lGdUqAcvDgJNSKT3g8VNojvusFJnmWFB amtw04Bbfi2Uvo9u3THErtpNOZST3h0u 2.15.1
KpynUoRqKicWDCw5ZmFbHgcBIsjzE5np vTAcBCLSIOCfGxXLWhhj9k4ksvGQepQ9 2.14.1
6zT9berkIjLBimVKLeQiyYCN0tatGDpP R621k3PJicyCn77wXTSGszb3U8zkBQA 2.13.1
I4Yzj5EHZIVcEX6nYd1L3tdNqe3F0Xkc 48MMWHcOuxdqKSmb8OeMyiw5xdCHd1C 2.12.1
SrPve82idlmfrcRQqtMnhwKbdHJGGxMk WwkfRfjpaJIrbQQQlGOvfh31yHJeHV6 2.11.1
rd62nc33ngxzyuvlhcql3dqfaksdota8 4a8knnbk5pbjqsrudp3dq484m9axoc5g 2.10.1

以下版本早已不可用

K2 LK2 米游社版本
4q04st7bwy45c71az4yusak43n7en8wp w5k9n3aqhoaovgw25l373ee18nsazydo 2.9.1
dmq2p7ka6nsu0d3ev6nex4k1ndzrnfiy rk4xg2hakoi26nljpr099fv9fck1ah10 2.8.1
fd3ykrh7o1j54g581upo1tvpam0dsgtf 14bmu1mz0yuljprsfgpvjh3ju2ni468r 2.7.1
hfiki8qvnuai95p2845psdo9ydcmsrc0 w9p2p72p9octwd7lj1oa913hncq1k4td 2.6.1
4X 6X PROD
xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs t0qEgfub6cvueAPgR5m9aQWWVciEer7v JwYDpKvLj6MrMqqYU6jTKF17KNO2PXoS

安全性API的RSA公钥:

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

应该使用哪个salt

取决于你想在请求头的x-rpc-app_version中的米游社版本,每个版本有其对应的K2salt和LK2salt。但是4Xsalt和6Xsalt是每个版本都不变的。

也取决于请求头的x-rpc-client_type

  • x-rpc-client_type2时,一般使用K2salt,并配合DS1生成算法。
  • x-rpc-client_type4时,一般使用LK2salt,并配合DS1生成算法。
  • x-rpc-client_type5时,一般使用4X或6Xsalt,并配合DS2生成算法。

x-rpc-client_type的值会在需要验证请求头的API进行标识。

如果某个API需要独有的saltDS算法等,会进行标识。

用例:

  • K2和LK2通常用于米游社内的操作。
  • 4X通常用于查询游戏账号信息(如api-takumi-record.mihoyo.com的API使用较多)。
  • 6X使用较少,用于签到福利。
  • PROD主要用于账号相关的

salt位置

x-rpc-client_type2时使用的salt

APK被混淆后的com.mihoyo.hyperion.manager.AManager.k2()中。

x-rpc-client_type4时使用的salt

APK被混淆后的com.mihoyo.hyperion.manager.AManager.lk2()中。

x-rpc-client_type5时使用的salt

4Xsaltlibxxxxxx.so中的Java_com_mihoyo_hyperion_net_aaaaa_a2222
6Xsaltlibxxxx.so中的Java_com_mihoyo_hyperion_net_aaaaa_b5555

DS生成算法的位置

注:下文简称“DS算法”。

DS算法的位置:

com.mihoyo.hyperion.net.bbbbb.a2222

用于DS生成的函数

来自libdddd.so

DS1算法。

因为该函数直接传入了salt,因此记录该函数的参数值即可获得K2salt

参数:salt

返回:DS1

com.mihoyo.hyperion.net.aaaaa.a2222

来自libxxxxxx.so

DS2算法

参数:POST请求的数据,GET请求的URL参数

返回:DS2

com.mihoyo.hyperion.net.aaaaa.b5555

来自libxxxx.so

DS2算法

参数:POST请求的数据,GET请求的URL参数

返回:DS2

DS的英文名称

从作用上讲 DS 应该是 DataSign(数据签名)而不是 Dynamic Secret(动态密钥)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.