メインコンテンツへスキップ

🧩 BookStackでタイトルのみのページを一括作成する(API利用)

🧭 はじめに

この手順書は、BookStack上に「タイトルのみの空ページ」をまとめて作成するための実務向けガイドである。 天文学史ノートのように、先に構造(ページ枠)を一気に用意し、内容は後から埋める運用を前提としている。


🎯 この手順でできること

  • 指定したChapter配下に 「意味だけを持つタイトル」のページを一括生成
  • ページ順はBookStackのUIで自由に並び替え可能
  • 本文は後から編集(最初は空に近い状態)
  • BookStackの履歴・権限・URL構造を正しく維持

構造を壊さず、将来の挿入・削除に強いノート基盤を一気に用意できる。


🧱 前提条件

🔑 必須条件

  • BookStackがAPI対応バージョン(v0.27以降)

  • 管理者権限ユーザー

  • 対象の

    • Bookshelf
    • Book
    • Chapter が事前に作成済み

ページは必ずChapter配下に作成する。
Book直下に作ると、後から構造整理が煩雑になる。


📐 タイトル設計の原則(重要)

🚫 数値プレフィックスを付けない

  • Chapter / Page は本の中で自由にソート可能

  • タイトルに番号を含めると:

    • 挿入・削除時に欠番や重複が発生
    • 分割時にタイトルが不自然になる

章・記事タイトルに番号を入れてはいけない。
それは将来の編集コストを確実に増やす。


✅ 正しい役割分担

  • 順序管理:BookStackのUI(ドラッグ&ドロップ)
  • 意味表現:タイトル文字列そのもの

順序はUI、意味はタイトル。


🔐 APIトークンの準備(初回のみ)

手順

  1. BookStack管理画面にログイン

  2. Users → 自分のユーザー

  3. API Tokens セクションで新規トークン作成

  4. 以下を控える:

    • Token ID
    • Token Secret

Token Secretは二度と表示されない。
必ず安全な場所に保存する。


🧠 実装方針(なぜAPIを使うか)

BookStackは以下を内部で連動管理している:

  • pages
  • revisions
  • permissions
  • activity_log

DBを直接書き換えてはいけない。
履歴破損・権限不整合・アップデート不能の原因になる。

公式APIを使うのが唯一の安全ルート


🛠️ 実装手順(bash + curl)

① Chapter IDを確認する

  • BookStackにログインした状態で、F12で開発ツールを開く
  • Consoleタブを開き、プロンプトに下記のJavaScriptを貼り付ける
fetch('/api/chapters', {
  headers: {
    'Accept': 'application/json'
  }
}).then(r => r.json()).then(console.log)
  • JSONが下記のように出力されるので当該ChapterのIDをメモしておく
[
    {
        "id": 1,
        "slug": "aws-lightsailbookstack",
        "name": "AWS LightsailにBookStackをセットアップする",
        "description": "",
        "priority": 2,
        "book_id": 2,
        "created_at": "2025-05-11T08:56:49.000000Z",
        "updated_at": "2025-05-11T08:56:49.000000Z",
        "owned_by": 6,
        "book_slug": "fc221",
        "created_by": 6,
        "updated_by": 6
    },
    :

  {
  "data": [
       {
       :
       },
       {
          "id": 35,
          "slug": "74071",
          "name": "時系列",
          "description": "",
          "priority": 3,
          "book_id": 109,
          "created_at": "2025-12-30T06:45:35.000000Z",
          "updated_at": "2025-12-30T06:45:35.000000Z",
          "owned_by": 6,
          "book_slug": "061",
          "created_by": 6,
          "updated_by": 6
      }
   ]
}

② 作成するページタイトル一覧を定義(番号なし)

titles=(
"天文学とは何か"
"天文学史をどう見るか"
"先史・古代文明の天文学"
"メソポタミア・エジプト天文学"
"ギリシャ天文学"
"中国天文学"
"インド・イスラーム天文学"
"中世ヨーロッパの宇宙観"
"観測精度の限界と停滞"
"地動説の登場"
"観測革命"
"物理法則の導入"
"万有引力と宇宙"
"望遠鏡の進化"
"分光学と恒星の正体"
"恒星の進化と分類"
"銀河の発見"
"相対論と宇宙"
"ビッグバン宇宙論"
"現代の観測技術"
"系外惑星と生命探査"
)

タイトルは内容の意味のみを表し、順序は持たせない。


③ API接続情報とバッチ処理をまとめて定義する

この手順では、BookStack APIに接続し、ページを一括作成するための実行用スクリプトを1つ作成する。 API接続情報は環境ファイルではなく、このスクリプト内で完結させる。


📁 作業用スクリプトを作成する

まず、任意の作業ディレクトリでスクリプトファイルを作成する。

touch create_pages.sh

このファイルが「設定」と「処理」の両方を持つ。
.env のような環境ファイルではない。


✍️ スクリプトを編集する

vim create_pages.sh

🔧 スクリプト全文を記述する

以下をそのままファイルに貼り付け、 必要な値だけ自分の環境に合わせて修正する。

#!/bin/bash

# ===== BookStack API 接続情報 =====
API_URL="https://your-bookstack.example.com/api/pages"
TOKEN_ID="xxxxx"
TOKEN_SECRET="yyyyy"
CHAPTER_ID=123

# ===== 作成するページタイトル一覧 =====
titles=(
"天文学とは何か"
"天文学史をどう見るか"
"先史・古代文明の天文学"
"メソポタミア・エジプト天文学"
"ギリシャ天文学"
"中国天文学"
"インド・イスラーム天文学"
"中世ヨーロッパの宇宙観"
"観測精度の限界と停滞"
"地動説の登場"
"観測革命"
"物理法則の導入"
"万有引力と宇宙"
"望遠鏡の進化"
"分光学と恒星の正体"
"恒星の進化と分類"
"銀河の発見"
"相対論と宇宙"
"ビッグバン宇宙論"
"現代の観測技術"
"系外惑星と生命探査"
)

# ===== ページ一括作成処理 =====
for title in "${titles[@]}"; do
  curl -s -X POST "$API_URL" \
    -H "Authorization: Token $TOKEN_ID:$TOKEN_SECRET" \
    -H "Content-Type: application/json" \
    -d "{
      \"name\": \"$title\",
      \"html\": \"<p></p>\",
      \"chapter_id\": $CHAPTER_ID
    }"
done

📌 各設定項目の意味

API_URL
  • BookStackのページ作成API
  • /api/pages は固定
  • ドメイン部分のみ自分の環境に合わせる

末尾にスラッシュは付けない。


TOKEN_ID / TOKEN_SECRET
  • BookStack管理画面で発行したAPIトークン
  • Authorizationヘッダで使用される

このスクリプトをGit管理してはいけない。
Token Secretが漏洩するとBookStack全体が操作可能になる。


CHAPTER_ID
  • ページを作成する親Chapterの数値ID

確認方法: ① Chapter IDを確認する を参照

Chapter名では指定できない。


▶️ スクリプトを実行する

実行権限を付与してから起動する。

chmod +x create_pages.sh
./create_pages.sh

実行後、Chapterを再読み込みするとタイトルのみのページが作成されている。


⚠️ 注意点(重要)

html フィールドは空にできない。
<p></p> のような最小ダミーを必ず指定する。


✅ 実行後の確認

  • Chapter配下に、タイトルのみのページが作成されている
  • ページ順はUI上で自由に並び替え可能
  • 各ページは通常どおり編集・分割・移動できる

この時点で「書くための器」だけが完成している状態。


🧠 運用上のベストプラクティス

  • 初期本文は以下でも可:

    <p><em>TODO</em></p>
    
  • 中身は1ページずつ順不同で書き始めてよい

  • 後からページを分割・統合してもURLは壊れない

BookStackは「後から並び替える」ことを前提にした設計。