もくじ
はじめに
前回の記事で、鳴潮のプレイヤーデータ取得APIにリクエストし、データが取得できたことを確認した。
そのデータには、ランチャーに表示されている結晶波長板(スタミナ)や先駆ラジオ(バトルパス)だけでなく、他にも様々な情報が見えたので、この記事で情報整理しておきたいなと。
情報は全て推測で書いてるので、間違ってるところあるかも。
API仕様
非公開APIにつき、予告なく仕様変更される可能性がある(記事は2025/10/17時点)。
あと大量アクセスは控えること。
リクエスト
URL
| パラメータ | 値 |
|---|---|
| Method | POST |
| URL | https://pc-launcher-sdk-api.kurogame.net/game/queryRole |
クエリパラメータ
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
| _t | No | string | UNIX時間 |
また、リクエストに次のJSONデータを含める必要がある。
JSONデータ
| キー | 必須 | 型 | 説明 |
|---|---|---|---|
| oauthCode | Yes | string | プレイヤーに固有の認証コード |
| playerId | Yes | stirng | ユーザID (※適当な値を入れても通る) |
| region | Yes | string | サーバ地域(America / Asia / Europe / HMT / SEA) |
oauthCodeから取得できるデータには誕生日などの個人情報が入っており外部に漏洩すると危険なので、管理は厳重に行うこと。
環境変数で管理することを強く推奨(→参考)。
Pythonでのリクエスト例
Bash
pip install requestsPython
import time
import requests
import json
t = int(time.time())
url = f"https://pc-launcher-sdk-api.kurogame.net/game/queryRole?_t={t}"
data = {
"oauthCode": oauthCode, # oauthCodeは各自で置き換える
"playerId": "701929833",
"region": "Asia"
}
resp = requests.post(url, json=data)
resp_json = resp.json()
print(json.dumps(resp_json, indent=4))
レスポンス
Success
リクエストが成功した時は、データが返ってくる。
JSON
{
"code": 0,
"message": "success",
"data": {
"Asia": "{\"Base\":{\"Name\":\"Miru.\",\"Id\":701929833,\"CreatTime\":1716563160357,\"ActiveDays\":464,\"Level\":80,\"WorldLevel\":8,\"RoleNum\":21,\"SoundBox\":10,\"Energy\":176,\"MaxEnergy\":240,\"StoreEnergy\":267,\"StoreEnergyRecoverTime\":0,\"EnergyRecoverTime\":1760724777910,\"Liveness\":0,\"LivenessMaxCount\":100,\"LivenessUnlock\":true,\"ChapterId\":18,\"WeeklyInstCount\":3,\"Boxes\":{\"2\":753,\"1\":889,\"3\":302,\"4\":62},\"BasicBoxes\":{\"2\":631,\"1\":539,\"3\":298,\"4\":78},\"PhantomBoxes\":{\"2\":144,\"1\":184,\"3\":116},\"BirthMon\":0,\"BirthDay\":0},\"BattlePass\":{\"Level\":7,\"WeekExp\":3350,\"WeekMaxExp\":12000,\"IsUnlock\":true,\"IsOpen\":true,\"Exp\":150,\"ExpLimit\":1000}}"
},
"timestamp": 1760701824950
}| フィールド | 型 | 説明 |
|---|---|---|
| code | integer | ステータスコード |
| message | string | ステータスメッセージ |
| data | object | サーバ地域オブジェクト |
| data.{region} | string<object> | プレイヤーデータ |
| timestamp | integer | タイムスタンプ(UNIX時間(1/1000)) |
Error
失敗時はエラーメッセージが返される。
JSON
// regionの値が違う、またはデータ同期中など、何らかの理由でデータが取得できなかった
{
"code": 1005,
"message": "retrying",
"data": null,
"timestamp": 1760702421363
}
// oauthCodeが間違っている
{
"code": 1001,
"message": "invalid token",
"data": null,
"timestamp": 1760703312508
}
// oauthCodeが無い
{
"code": -1,
"message": "oauthCode is empty",
"data": null,
"timestamp": 1760703867360
}
// playerIdが無い
{
"code": -1,
"message": "playerId is empty",
"data": null,
"timestamp": 1760703898845
}
// regionが無い
{
"code": -1,
"message": "region is empty",
"data": null,
"timestamp": 1760703921854
}
// リクエストメソッドが間違っている(例外エラー)
{
"timestamp": "2025-10-17T13:35:31.997+00:00",
"status": 405,
"error": "Method Not Allowed",
"path": "/game/queryRole"
}| フィールド | 型 | 説明 |
|---|---|---|
| code | integer | ステータスコード |
| message | string | エラーメッセージ |
| data | object | サーバ地域オブジェクトnullで固定 |
| timestamp | integer | タイムスタンプ(UNIX時間(1/1000)) |
データ詳細
生データはJSON文字列となっている。デコードしたものは以下の通り。
JSON
{
"Base": {
"Name": "Miru.",
"Id": 701929833,
"CreatTime": 1716563160357,
"ActiveDays": 464,
"Level": 80,
"WorldLevel": 8,
"RoleNum": 21,
"SoundBox": 10,
"Energy": 195,
"MaxEnergy": 240,
"StoreEnergy": 267,
"StoreEnergyRecoverTime": 0,
"EnergyRecoverTime": 1760724777910,
"Liveness": 0,
"LivenessMaxCount": 100,
"LivenessUnlock": true,
"ChapterId": 18,
"WeeklyInstCount": 3,
"Boxes": {
"2": 753,
"1": 889,
"3": 302,
"4": 62
},
"BasicBoxes": {
"2": 631,
"1": 539,
"3": 298,
"4": 78
},
"PhantomBoxes": {
"2": 144,
"1": 184,
"3": 116
},
"BirthMon": 0,
"BirthDay": 0
},
"BattlePass": {
"Level": 7,
"WeekExp": 3350,
"WeekMaxExp": 12000,
"IsUnlock": true,
"IsOpen": true,
"Exp": 150,
"ExpLimit": 1000
}
}| フィールド | 型 | 説明 |
|---|---|---|
| Base | object | プレイヤー情報 |
| BattlePass | object | 先駆ラジオ情報 |
Base
プレイヤー情報を格納する。
| フィールド | 型 | 説明 | 備考 |
|---|---|---|---|
| Name | string | プレイヤー名 | |
| Id | integer | ユーザID | |
| CreatTime | integer | アカウント作成時刻 | UNIX時間(1/1000) |
| ActiveDays | integer | 累計ログイン日数 | |
| Level | integer | ユニオンレベル | |
| WorldLevel | integer | ソラランク | |
| RoleNum | integer | 所持キャラ数 | |
| SoundBox | integer | (不明・現在特定中) | 音匣の数? |
| Energy | integer | 結晶波長板(スタミナ) | |
| MaxEnergy | integer | 結晶波長板最大数 | Ver.2.7時点で 240 |
| StoreEnergy | integer | 結晶波長精錬板 | |
| StoreEnergyRecoverTime | integer | 結晶波長精錬板全回復時間 | UNIX時間(1/1000) 結晶波長板回復中は 0 |
| EnergyRecoverTime | integer | 結晶波長板全回復時間 | UNIX時間(1/1000) 全回復時は 0 |
| Liveness | integer | 活躍度(デイリー) | |
| LivenessMaxCount | integer | 全報酬獲得に必要な活躍度 | Ver.2.7時点で 100 |
| LivenessUnlock | boolean | 活躍任務開放済みか | |
| ChapterId | integer | 潮汐任務の進捗 | 「とある漂泊する音の始まり・上」を 1とし、幕間を除いた通し番号 |
| WeeklyInstCount | integer | 戦歌復唱 週報酬受取可能残り回数 | |
| Boxes | object | (不明・現在特定中) | 宝箱関係? |
| Boxes.1 | integer | (不明) | |
| Boxes.2 | integer | 〃 | |
| Boxes.3 | integer | 〃 | |
| Boxes.4 | integer | 〃 | |
| BasicBoxes | object | (不明・現在特定中) | |
| BasicBoxes.1 | integer | (不明) | |
| BasicBoxes.2 | integer | 〃 | |
| BasicBoxes.3 | integer | 〃 | |
| BasicBoxes.4 | integer | 〃 | |
| PhantomBoxes | object | (不明・現在特定中) | |
| PhantomBoxes.1 | integer | (不明) | |
| PhantomBoxes.2 | integer | 〃 | |
| PhantomBoxes.3 | integer | 〃 | |
| BirthMon | integer | 誕生月 | 未設定の場合は0 |
| BirthDay | integer | 誕生日 | 未設定の場合は0 |
BattlePass
先駆ラジオ関係のデータが入っている。
| フィールド | 型 | 説明 |
|---|---|---|
| Level | integer | 現在のレベル |
| WeekExp | integer | 今週Exp獲得 |
| WeekMaxExp | integer | 今週Exp獲得上限 |
| IsUnlock | boolean | 先駆ラジオ開放済みか |
| IsOpen | boolean | 先駆ラジオ開催期間中か |
| Exp | integer | 現在のExp |
| ExpLimit | integer | Exp上限 |
おわりに
まだ一部分かってないデータもあるから、遊びながら分かったところは埋めていきたい。
あとランチャーに載ってない情報が結構多かったから、もしかしたら公式でこのAPI使って、HoYoLabみたいなアプリとか出すつもりなのかな?だとしたら楽しみ!!
0