コンテンツにスキップ

オープンプラットフォーム

Haneoka アカウントは、ツールがそのアカウントのデータを読み書きするためのトークンを発行できます。編成計算はサーバーでは行いません。コードがカードを読み込んだあと、Haneoka の編成ツールと同じエンジンを呼び出し側の端末で実行します。

スコープできること
team:readボックス、アカウントボーナス、保存した編成
team:writeボックスと保存した編成の変更
gacha:readクラウドのガチャ履歴
games:read連携したゲームアカウントとその概要
profile:readUID、表示名、ハンドル、自己紹介

トークンではコミュニティへの投稿、ログイン情報の変更、アカウント削除、他のトークンの管理はできません。

手順実行場所
トークンを作成Haneoka のアカウント設定
カードとボーナスを読むGET /api/v1/team-data/{server}
編成を計算呼び出し側ブラウザの Web Worker
  1. haneoka.org にログインし、アカウント → ログインとセキュリティを開きます。
  2. API トークンで名前を入力し、30 日・90 日・1 年から選び、ツールに必要な権限だけにチェックを入れます。
  3. 値をコピーします。hnk_ で始まり、一度だけ表示されます。

1 アカウントにつき有効なトークンは 10 個までです。一覧から取り消すとすぐに無効になり、アカウントが制限・削除された場合も無効になります。

トークンはパスワードと同じように扱ってください。各ユーザーが自分のトークンをツールに貼り付けて端末内に保存し、コミットや URL には入れないでください。

Terminal window
curl -H "Authorization: Bearer $HANEOKA_TOKEN" https://haneoka.org/api/v1/open/me
{
"token": { "name": "My tool", "expiresAt": 1801176000000, "scopes": ["team:read", "profile:read"] },
"profile": { "uid": 1024, "displayName": "Player", "handle": "player", "bio": null }
}

profile:read がない場合、profile は null です。

Terminal window
curl -H "Authorization: Bearer $HANEOKA_TOKEN" \
https://haneoka.org/api/v1/team-data/intl

server はカタログサーバー(jp または intl)です。どのオリジンからも呼び出せます。Cookie は無視され、トークンだけが認証情報です。

{
"server": "intl",
"revision": 42,
"members": [
{ "key": "m1", "cardId": 1, "level": 60, "awake": 2, "rank": 3,
"liveSkillLevel": 5, "gekisoSkillLevel": null }
],
"snaps": [{ "key": "s1", "cardId": 1, "level": 40, "rank": 2 }],
"player": {
"characterRanks": { "1": 20 }, "characterTotalRank": null,
"bandItems": { "1": 3 }, "vipRank": null,
"characterMemory": {}, "musicMemory": {}
}
}
項目意味
revisionボックスのバージョン。0 はこのサーバーにボックスがないことを示します
members、snapsユーザーが参加にしたカード(エンジン入力形式)
playerアカウント全体のボーナス
teams保存した編成
育成値が null未記録。unknownPolicy が補い方を決めます

fetchTeamData がデータを読み、createTeamBuilder がエンジンを読み込みます。読み込み後の処理はすべて端末内で行われます。

import { createTeamBuilder, fetchTeamData } from "https://haneoka.org/tools/team-builder.js";
const server = "intl";
const { members, snaps, player } = await fetchTeamData({ server, token });
const engine = await createTeamBuilder({ server, maxWorkers: navigator.hardwareConcurrency });
try {
const result = await engine.run({
members, snaps, player,
unknownPolicy: "min",
goal: { kind: "power", song: null, challengeEventId: null },
constraints: { requiredMembers: [], excludedMembers: [], requiredSnaps: [],
excludedSnaps: [], leader: null, bindings: [], noSnaps: false, minBonusPercent: null },
k: 5, timeLimitMs: 10000,
});
console.log(result.overall, result.stopReason);
} finally {
engine.dispose();
}

目標・条件・結果の項目は端末で計算するを参照してください。

team:write で一度に 4000 件まで変更を送れます。null はキーを消します。Web サイトは次の同期で変更を受け取ります。

Terminal window
curl -X POST -H "Authorization: Bearer $HANEOKA_TOKEN" \
-H "Content-Type: application/json" \
-d '{"changes":[{"key":"m.1.own","value":true},{"key":"m.1.lvl","value":60}]}' \
https://haneoka.org/api/v1/team-data/intl
{ "revision": 43, "changed": 2 }
キー値
m.<card>.own、s.<card>.ownメンバー・スナップの所持
m.<card>.use、s.<card>.use検索に参加するか
m.<card>.lvl、awk、rnk、sk、gskレベル、特訓、覚醒、ライブスキル、撃奏スキル
s.<card>.lvl、rnkスナップのレベルと限界突破
cr.<character>、cm.<character>、mm.<song>、bi.<item>キャラクターランク、キャラクターメモリー、楽曲メモリー、バンドアイテム
p.vipVIP ランク

ゲームアカウントとガチャ履歴

Section titled “ゲームアカウントとガチャ履歴”
GET /api/v1/open/game-accounts
GET /api/v1/open/gacha-history
GET /api/v1/open/gacha-history/{accountKey}

一覧はゲームアカウントごとに accountKey を返し、詳細には histories が加わります。

ステータスコード対処
401invalid_tokenトークンがない・取り消し済み・期限切れです。作り直してください
403account_restrictedアカウントが制限または削除されています
403insufficient_scope必要な権限を付けたトークンを作ってください
404server_not_foundjp か intl を使ってください
413box_too_largeボックスの上限に達しました
422invalid_changesキーと値を確認してください
429rate_limit_exceeded時間をおいて再試行してください

ツール内に Haneoka のクレジットを表示してください。createTeamBuilder の戻り値の attribution に文言とリンクがあります。