やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

BlueSkyのCARファイルをgoskyコマンドで展開した

 自分の投稿データをバックアップしたくて。

前回まで

BlueSky CARファイル 展開方法

  1. 自分の投稿CARファイルをDLする
  2. CAR展開ツールgoskyをビルドする
  3. 2でファイルを展開するとJSONファイル入手
  4. 出力ファイル確認

1. 自分の投稿CARファイルをDLする

  1. BlueSkyにアクセス&ログインする
  2. 設定→アカウント→私のデータをエクスポートする
  3. CARファイルをダウンロード

2. CAR展開ツールをビルドする

git clone https://github.com/bluesky-social/indigo
cd indigo
go build ./cmd/gosky/ 
cd /tmp/work/indigo
go build ./cmd/gosky
./gosky --help
./gosky car --help

3. 2でファイルを展開するとJSONファイル入手

$ ./gosky car unpack --out-dir /tmp/work /tmp/repo.car
SetupSlog
time=2025-08-02T21:48:54.447+09:00 level=INFO source=:0 msg="INFO writing output system=gosky topDir=/tmp/work"

4. 出力ファイル確認

4-1. post

 投稿内容は...post/ディレクトリ直下にあるjsonファイル内にあった。

 jsonファイルは投稿数だけ存在する。とりあえず以下に一つだけ抽出してみた。

did:plc:ffttrlkbljhdeoypveptm4sj/app.bsky.feed.post/3luwd6sosum2q.json

{
  "$type": "app.bsky.feed.post",
  "createdAt": "2025-07-27T05:17:11.088Z",
  "embed": {
    "$type": "app.bsky.embed.external",
    "external": {
      "description": "",
      "thumb": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreib43dnkzsbr3vkmpd5gkspuqijhsgvlyqjebwazqo4nxulok6wd6e"
        },
        "mimeType": "image/jpeg",
        "size": 229402
      },
      "title": "Bluesky - Wikipedia",
      "uri": "https://ja.wikipedia.org/wiki/Bluesky"
    }
  },
  "facets": [
    {
      "features": [
        {
          "$type": "app.bsky.richtext.facet#link",
          "uri": "https://ja.wikipedia.org/wiki/Bluesky"
        }
      ],
      "index": {
        "byteEnd": 207,
        "byteStart": 178
      }
    }
  ],
  "langs": [
    "ja"
  ],
  "text": "BlueSkyのアカウントを作ってみた。\nツイッターの分散型版らしい。安心して使えそう。\n300字まで書けるっぽい。詳しくはウィキで。\nja.wikipedia.org/wiki/Bluesky\nしばらくは使い方を覚えるため投稿してみようかな。"
}

 私が投稿した内容は一番下のtextキーの値。それ以外はサムネイル画像やメタデータっぽい。

4-2. プロフィール画像

 プロフィールなど画像の取得が一筋縄ではいかなそう。

 profileの画像ファイルを示した"$link"キーの値ってどう使えばいいの?
 短いからBase64というわけでもなさそう。
 この値をキーにして別のHTTPSリスクエストをせねばならないのでは?

 画像データの取得は構造を理解しないとできなそう。
 資料を探そう。

did:plc:ffttrlkbljhdeoypveptm4sj/app.bsky.actor.profile/self.json

{
  "$type": "app.bsky.actor.profile",
  "avatar": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreihhi6plfofevmb3fdm63conhnkxbfybirn4rljhokeyv3htf4qiqm"
    },
    "mimeType": "image/png",
    "size": 3442
  },
  "banner": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreico52tvtalxvfk2t2jusiiejchy3nkkiyeqtvj4tl7n2ld35wftki"
    },
    "mimeType": "image/jpeg",
    "size": 555640
  },
  "createdAt": "2025-07-27T05:06:09.685Z",
  "description": "趣味プログラマ。",
  "displayName": "ytyaru"
}