前言

  作为一个电脑手机都(曾经)非常垃圾的玩家,云原神真的是个好东西。mihomo 推出的云原神注册送了5个小时,之后每天登录云原神就可以送15分钟,最多10小时。但上学之后没办法天天登录,所以就需要一个能够自动签到的方法。

链接在结尾!

需求

  • 能够通过给定的令牌之类通过 API 实现自动签到

实现过程

  首先,通过 HTTP 抓包获取签到的 API,我们可以知道签到的 API 是:

GET /hk4e_cg_cn/wallet/wallet/get HTTP/1.1
Host: api-cloudgame.mihoyo.com
Accept: */*
Referer: https://app.mihoyo.com
x-rpc-app_id: 1953443910
x-rpc-app_version: 3.4.1
x-rpc-channel: mihoyo
x-rpc-client_type: 3
x-rpc-combo_token: bi=hk4e_cn;ai=4;ci=1;ct=xxxxxxxx;oi=xxxxxxxx;si=xxxxxxxx
x-rpc-device_id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
x-rpc-device_model: winnt/windows
x-rpc-device_name: DESKTOP-8KS1MEE
x-rpc-preview: 0
x-rpc-sys_version: 10.0.19045
x-rpc-vendor_id: 2
Accept-Encoding: gzip, deflate

  接着,我们来分析一下它的请求头。因为并不是所有的字段都是固定的。

Host: 定值 api-cloudgame.mihoyo.com
Accept: 定值 */*
Referer: 定值 https://app.mihoyo.com
Accept-Encoding: 定值 gzip, deflate
x-rpc-app_id: 定值 1953443910
x-rpc-app_version: 不是定值,随着版本更新而变化(这里有点特殊,后文会讲)
x-rpc-channel: 不是定值,iOS为appstore,安卓与PC都为mihoyo
x-rpc-client_type: 不是定值,iOS为1,安卓为2,PC为3
x-rpc-combo_token: 不是定值,这就是身份认证的令牌了
x-rpc-device_id: 不是定值,应是每个设备有一个在mihomo唯一的ID
x-rpc-device_model: 不是定值,为设备型号
x-rpc-device_name: 不是定值
x-rpc-preview: 定值 0
x-rpc-sys_version: 不是定值,为操作系统版本
x-rpc-vendor_id: 不确定是否为定值 2

  难点:我们可以发现,版本号理论上是可以自动获取的,而此处与原审的版本号并不一直与原神相同,虽然实测版本号错误目前没发现会有什么问题,但为了保险起见,还是需要找一个可靠的 API 来获取云原神的版本号。

  我曾经尝试过多个 API,第一个是https://api-cloudgame-static.mihoyo.com/hk4e_cg_cn/gamer/api/getFunctionShieldNew?client_type=1,可一段时间后不好使了。

  第二个 API 是通过其他开源的项目找到的原神启动器检查版本的 API,地址是https://sdk-static.mihoyo.com/hk4e_cn/mdk/launcher/api/resource?key=eYd89JmJ&launcher_id=18,不过云原神在3.4发布了第二个版本后,此处并没有更新为最新的3.4.1

  最后一个 API 也是官方云原神检查更新的 API,是通过电脑端抓包得到的。地址为https://api-takumi.mihoyo.com/ptolemaios/api/getLatestRelease?app_id=1953443910&app_version=3.3.0&channel=mihoyo,相信有读者已经发现问题了。其中的app_version字段我在此处写了3.3.0,原因是如果将这个参数省略或者改为当前的云原神版本号,返回体中将不包含任何有用的信息,就会像下面这样。

{
    "retcode":0,
    "message":"OK",
    "data":{
        "strategy_id":0,
        "update_type":0,
        "dialog_num":0,
        "dialog_period_type":0,
        "dialog_period":0,
        "dialog_title":"",
        "dialog_content":"",
        "package_name":"",
        "package_url":"",
        "package_size":"0",
        "has_update":false,
        "package_version":"",
        "package_md5":"",
        "user_defined":""
    }
}

  因此,必须将app_version设置成以前的版本。那么问题又来了,所有以前的版本都行吗?以后是不是还要手动更新版本号呢?

  经过一番手动的尝试,发现只有3.0.0之后的版本号是可以正常返回的,内容如下。

{
    "retcode":0,
    "message":"OK",
    "data":{
        "strategy_id":1149,
        "update_type":2,
        "dialog_num":0,
        "dialog_period_type":0,
        "dialog_period":0,
        "dialog_title":"版本已更新",
        "dialog_content":"《云·原神》已更新,请点击下方按钮下载最新版本",
        "package_name":"yun_yuanshen_3.4.1.594_release_prod_setup_20230118153428.exe",
        "package_url":"https://cloudgame-static.mihoyo.com/app/pc/yun_yuanshen_3.4.1.594_release_prod_setup_20230118153428.exe",
        "package_size":"203404928",
        "has_update":true,
        "package_version":"3.4.1",
        "package_md5":"2902ec1923cb394db1c9b972d498fdf7",
        "user_defined":"{}"
    }
}

  那么到这里,大功告成,完结撒花!

  代码由于某些原因就不贴在这里了,大家可以去这些地方看看~

  Gitea(开发平台,最新)|GitHub(求★Star★)|GitLab|极狐GitLab(GitLab国内版)

我自己现在就在用这小玩意儿,有需要的话,我可以……

懂的都懂