pixivFANBOXをマークダウン記法で書きたい
はてなブログのサードパーティーツールみたいに、マークダウンで書いて CLI からリポジトリと同期みたいなことがしたい!
自分は最近、一部の情報発信を pixivFANBOX(以降「FANBOX」という)で行っている
FANBOX の WYSIWYG はシンプルで、それはそれでいい
ただ自分はマークダウンで書きたい!
リポジトリの状態を FANBOX に反映する形にしたい
Git で管理したい、差分を確認したい
CI/CD できたら最高
textlint などでチェック
main にマージしたら FANBOX にデプロイ
特にツールとか作ってる人いないし、リハビリがてらツールを作ってみるか
怒られたらやめる
既存の実装
FANBOX 用のツールでそれらしいのは公式でもサードパーティーでもまだ無さそう
blogsync が理想形
https://github.com/x-motemen/blogsync
はてなブログ用のツール
はてなブログには AtomPub 実装があり、これを使っている
はてなブログAtomPub | Hatena Developer Center
どう sync しているのか
blogsync pull で記事を手元に持ってくる
以降 pull すると新しいエントリのみがダウンロードされるらしい
例えばウェブブラウザで何か記事を編集しても、その変更は手元には pull できないってこと?
blogsync push <path> で記事を更新する
blogsync post <blog> < <body> で記事を投稿する
sync コマンドを叩いたら、ローカルのファイルをもとにすべて記事を投稿・更新・削除とかしたら楽かなと思ったけど、実装大変そうだし...通信も無駄に多そう
blogsync の形式でいこう
書き始めた。
https://github.com/defaultcf/fanboxsync
通信を眺める
一覧取得
GET https://api.fanbox.cc/post.listCreator?creatorId=xxx&maxPublishedDatetime=yyy-MM-dd+hh%3Amm%3Ass&maxId=xxx&limit=10
GET https://api.fanbox.cc/post.listManaged
投稿取得
GET https://api.fanbox.cc/post.info?postId=xxx
GET https://api.fanbox.cc/post.getEditable?postId=xxx
投稿・更新
POST https://api.fanbox.cc/post.create
リクエスト { "type": "article" }
レスポンス { "postId": "\d+ で構成される string" }
タイトルや本文が空の記事が作成される
POST https://api.fanbox.cc/post.update
リクエストは JSON でも application/x-www-form-urlencoded でもなく、multipart/form-data
書式設定
type: bold
offset: 何文字以降から適用されるか
length: そこから何文字適用されるか
思ったより結構シンプルだし、実装できそうな気がする
認証
cookie
FANBOXSESSID のキーの中にセッション ID が入っている
X-CSRF-Token
ウェブブラウザでログインした後、JSON.parse(document.querySelector("#metadata").content).csrfToken で得られる値をセットする必要がありそう
しばらくこの値は使いまわせそうな感じがする
というわけで、FANBOX の API を眺めて、OpenAPI に書き起こしてみた
https://github.com/defaultcf/fanbox-specification
https://default.cf/fanbox-specification/
そこから golang のクライアントを自動生成してみた
https://github.com/defaultcf/fanbox-go
それを fanboxsync で使うようにする
だいたい書いて、投稿の作成、取得、更新ができるようになった
code:2024-07-28-8月号.md
---
id: 1234567
title: 8月号だよ
status: draft
---
こんにちは。これはテスト投稿です。
ファイル名には ID は載せず、あくまで一覧性のための命名にしたい...
けど fanbox 独自の画像やリンクは(今のところ)FANBOX のエディタ上じゃないと作れないし、ファイル取得時の上書きが難しくなりそう...
一度全てのファイルを舐めて、ファイルのポインタと id のリストを作れば解決するかも
そろそろユーザー側のワークフローを考える
GitHub のプライベートリポジトリに投稿を管理するリポジトリを作る
既に FANBOX に投稿がある場合、それを手元で markdown 化して push する
fanboxsync pull
GitHub Actions を使って、投稿に変更があればその変更を FANBOX に適用する
session id や csrf token は Secrets でやり取り
session id と csrf token の寿命は一緒なんだろうか...
もし csrf token の方が短命なら、session id から csrf token を生成するのを自動化したいかも