詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Scrapboxのコマンドラインクライアントを作った

ちょっとした手元の自動化を行おうとしたときに、Scrapbox のページ一覧を取得したり、プロジェクトの情報を取得したりしたくなる。Scrapbox ではとにかくほぼすべてが わかりやすい JSON API 経由で行われているわけなので、これをしてくれるコマンドラインツールがほしいわけです。

GitHub - motemen/sbx: An unofficial Scrapbox client

ちなみに完全に野良だし、API も内部 API とされていて安定はしていないはず。そういうものです。

使い方

API の薄いラッパーなので基本的に JSON を返す。--jq オプションで結果を gojq で編集できる。

% sbx page list help-jp --limit 5 --jq 'map(.title)'
[
  "Scrapboxの使い方",
  "ブラケティング",
  "ページをリンクする",
  "セキュリティポリシー",
  "Googleアカウント以外でのログイン"
]
% sbx api --session s:... api/projects --jq '.projects[] | select(.plan == null) | {displayName, name}'
{
  "displayName": "Googleの広告設定を共有してメンバー間でつながるプロジェクト",
  "name": "adsettings-google-com"
}
{
  "displayName": "Saijiki",
  "name": "saijiki"
}

設定

非公開のプロジェクトから情報を得るには、リクエストにセッション(connect.sid) クッキーを食わせてやる必要がある。--session コマンドライン引数でも与えられるけど、~/.config/sbx/config.json に設定を書いておくと、自動的にそこから値を取ってくる。

固定値を書くのであれば "value" に、コマンドから取りたいなら "command" に設定するとよい(たとえば "command": "envchain scrapbox sh -c '/bin/echo -n $SCRAPBOX_SESSION'" とか)。

{
  "projects": {
    "<project>": {
      "session": {
        "command": "<command to print session>", // or
        "value": "<constant value>"
      }
    }
  },

  // default value
  "default": {
    "session": ...
  }
}

JSON権の保障

巷にはこの手の野良ツールがたくさんあるようだけど、どれも(そりゃそうなのだが)作者のニーズを満たすために作られているので、自分のような他人が使おうとすると帯に短したすきに長し……ということが多い。CLI に限らず API クライアントを作る際には、ツールの方はあまり賢くしすぎず、できるだけ加工しないデータをそのまま渡し、JSON の色付けのようなことはユーザに任せる、とするのがいいと自分では思っている。

コマンドラインツールを作る文脈では、近年では itchyny/gojq の存在によりこの提供がグッとしやすくなっていて、プログラム自身に jq を埋め込めるので OS 標準でもない jq が手元にインストールされていることを強要するような居心地の悪さと決別できるようになっている。gh がこれをやってくれたおかげで心理的にもやりやすくなった感がある。

ちなみに内部では Goで知らないフィールドのあるJSONを取り扱う - 詩と創作・思索のひろば で書いたパターンを利用してます。

はてなで一緒に働きませんか?