人狼本部 予約連携 API (0.1.0)

Download OpenAPI specification:

人狼本部のサイト(WordPress)に、開催予定の村と事前予約の数を渡す API(ドラフト版)。

データの流れ

  • 5 分ごとに Google スプレッドシート「入力用シート」と Discord の予約チャンネルを読み、結果を 1 つの JSON(スナップショット)にまとめて保存する。
  • この API は保存したスナップショットを返す。リクエストのたびに Sheets や Discord を呼ばない。

共通の決まり

  • 認証は未決(下の「未決」を参照)。このドラフト版は認証なしで書いている。
  • 日時は ISO 8601 の日本時間(+09:00)で返す。「今日」の区切りも日本時間。
  • リアクションした人の ID・名前・一覧は返さない。GM 名・村の説明・投稿リンクは、サイトに出す情報として返す。
  • この契約は、どこで動かすか(Cloudflare・WordPress・Render のどれか)に関係なく同じ。変わるのは servers のアドレスだけ。

未決

  • 本番のアドレス(動かす場所とドメイン次第)。
  • 認証と CORS。サイトがこの API をサーバーで取得するか(SSR)、ブラウザで取得するかで変わる。
    • サーバーで取得する場合: API キーをサイトのサーバーにだけ置き、X-API-Key ヘッダーで認証できる(v2 と同じ形)。CORS は要らない。
    • ブラウザで取得する場合: キーはページを見た人に見えるので、認証はかけられない。Access-Control-Allow-Origin でサイトのオリジンだけを許すが、防げるのはほかのサイトのブラウザからの利用だけで、ブラウザ以外からの取得は防げない。CORS のヘッダーは、すべての応答(200・304・500・503)に付ける。JS から ETag を読むなら Access-Control-Expose-Headers: ETag も要る。If-None-Match を手で付けるなら、プリフライト(OPTIONS)への応答も要る。
  • 1 つの行に絵文字が 2 つ以上ある村(例: 2 戦行う村の 🇦・🇧)の意味。いまは絵文字ごとに別の枠として数える。
  • GM が自分の投稿にリアクションしない場合の数え方。いまは各枠から GM 分の 1 を引く。

Events

開催予定の村と事前予約

開催予定の村の一覧

今日(日本時間)以降に開催する村を返す。

  • 対象: 「入力用シート」の日付が今日以降の行。今日の村は、開始時刻を過ぎても含む。
  • 判定の時点: 「今日」と「開始日時を過ぎたか」は、スナップショットを作った時点(generatedAt)の日本時間で判定する。日付が変わった直後や開始の直後は、次の集計まで(最大 5 分)前の判定のまま返ることがある。
  • 並び順: 日付 → 開始時刻(時刻が空の行はその日の最後)→ シートの行の順。
  • 予約村(シートの「予約村」列が ○)には reservation が付く。それ以外は null。
  • シートを一度でも読めていれば、Sheets か Discord の読み取りに失敗しても 200 を返す。失敗した側のデータは、最後に読めたときの値を使う。ただし、日付と状態の判定は、その値を使って集計のたびにやり直す。どちらが失敗したかは sources で分かる。
  • クエリパラメータは無い(件数は数十件程度の見込み)。絞り込みと件数の制限はサイト側で行う。
header Parameters
If-None-Match
string
Example: "5f2a9c"

前回の応答の ETag。照合は RFC 9110 の 13.1.2 に従い、一致すれば 304 を返す。 ブラウザで取得する場合は、ブラウザのキャッシュが自動で付けるので、手で付けなくてよい(手で付けると、別オリジンからはプリフライトが要る)。

Responses

Response samples

Content type
application/json
Example
{
  • "generatedAt": "2026-10-25T16:05:00+09:00",
  • "sources": {
    },
  • "events": [
    ]
}