【鳴潮】プレイヤーデータ取得APIの仕様を調べる

はじめに

前回の記事で、鳴潮のプレイヤーデータ取得APIにリクエストし、データが取得できたことを確認した。

そのデータには、ランチャーに表示されている結晶波長板(スタミナ)や先駆ラジオ(バトルパス)だけでなく、他にも様々な情報が見えたので、この記事で情報整理しておきたいなと。

情報は全て推測で書いてるので、間違ってるところあるかも。

API仕様

非公開APIにつき、予告なく仕様変更される可能性がある(記事は2025/10/17時点)。
あと大量アクセスは控えること。

リクエスト

URL

パラメータ
MethodPOST
URLhttps://pc-launcher-sdk-api.kurogame.net/game/queryRole

クエリパラメータ

パラメータ必須説明
_tNostringUNIX時間

また、リクエストに次のJSONデータを含める必要がある。

JSONデータ

キー必須説明
oauthCodeYesstringプレイヤーに固有の認証コード
playerIdYesstirngユーザID
(※適当な値を入れても通る)
regionYesstringサーバ地域(America / Asia / Europe / HMT / SEA)

oauthCodeから取得できるデータには誕生日などの個人情報が入っており外部に漏洩すると危険なので、管理は厳重に行うこと。
環境変数で管理することを強く推奨(→参考)。

Pythonでのリクエスト例
Bash
pip install requests
Python
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
}

フィールド説明
codeintegerステータスコード
messagestringステータスメッセージ
dataobjectサーバ地域オブジェクト
data.{region}string<object>プレイヤーデータ
timestampintegerタイムスタンプ(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"
}

フィールド説明
codeintegerステータスコード
messagestringエラーメッセージ
dataobjectサーバ地域オブジェクト
nullで固定
timestampintegerタイムスタンプ(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
    }
}

フィールド説明
Baseobjectプレイヤー情報
BattlePassobject先駆ラジオ情報

Base

プレイヤー情報を格納する。

フィールド説明備考
Namestringプレイヤー名
IdintegerユーザID
CreatTimeintegerアカウント作成時刻UNIX時間(1/1000)
ActiveDaysinteger累計ログイン日数
Levelintegerユニオンレベル
WorldLevelintegerソラランク
RoleNuminteger所持キャラ数
SoundBoxinteger(不明・現在特定中)音匣の数?
Energyinteger結晶波長板(スタミナ)
MaxEnergyinteger結晶波長板最大数Ver.2.7時点で 240
StoreEnergyinteger結晶波長精錬板
StoreEnergyRecoverTimeinteger結晶波長精錬板全回復時間UNIX時間(1/1000)
結晶波長板回復中は 0
EnergyRecoverTimeinteger結晶波長板全回復時間UNIX時間(1/1000)
全回復時は 0
Livenessinteger活躍度(デイリー)
LivenessMaxCountinteger全報酬獲得に必要な活躍度Ver.2.7時点で 100
LivenessUnlockboolean活躍任務開放済みか
ChapterIdinteger潮汐任務の進捗「とある漂泊する音の始まり・上」を 1とし、幕間を除いた通し番号
WeeklyInstCountinteger戦歌復唱
週報酬受取可能残り回数
Boxesobject(不明・現在特定中)宝箱関係?
Boxes.1integer(不明)
Boxes.2integer
Boxes.3integer
Boxes.4integer
BasicBoxesobject(不明・現在特定中)
BasicBoxes.1integer(不明)
BasicBoxes.2integer
BasicBoxes.3integer
BasicBoxes.4integer
PhantomBoxesobject(不明・現在特定中)
PhantomBoxes.1integer(不明)
PhantomBoxes.2integer
PhantomBoxes.3integer
BirthMoninteger誕生月未設定の場合は0
BirthDayinteger誕生日未設定の場合は0

BattlePass

先駆ラジオ関係のデータが入っている。

フィールド説明
Levelinteger現在のレベル
WeekExpinteger今週Exp獲得
WeekMaxExpinteger今週Exp獲得上限
IsUnlockboolean先駆ラジオ開放済みか
IsOpenboolean先駆ラジオ開催期間中か
Expinteger現在のExp
ExpLimitintegerExp上限

おわりに

まだ一部分かってないデータもあるから、遊びながら分かったところは埋めていきたい。

あとランチャーに載ってない情報が結構多かったから、もしかしたら公式でこのAPI使って、HoYoLabみたいなアプリとか出すつもりなのかな?だとしたら楽しみ!!

もし良ければ、Like!をお願いします。記事執筆のモチベーションになります!
Like 0

投稿者 みぃるん

うさぎさんとかちっちゃいのが好き。 プログラミング勉強中~

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です