超分かりやすい Bluesky ラベラーの解説

2026年1月時点の話です。簡単なものからレベル付けしてみました。

レベル1. ラベラーはユーザーアカウントの一種である

  • ラベラーを探すには、ユーザーを見つけるのと同じ検索の仕方で探す
    • 名前空間・UI を分けてもいいとは思うけど…
  • ラベラーはアカウントの一種なので、フォロー・フォロー解除やいいね、リポストもできる
  • ラベラーアカウントは普通に投稿もできる
    • ラベラーを運用してる人は、何かトラブルがあったときに、ユーザーをスイッチしてラベラーアカウントで運用アナウンスしたりもする

レベル2. ラベラーアカウントはユーザーアカウントが成るものである

  • ラベラーになると、通常のフォロー・フォロー解除の部分に『ラベラーを登録する』ボタンが現れる
  • 要するに、公式クライアントでは UI がちょっと変わる
  • 購読ボタンの代わりにフォローボタンは消えて、メニューの奥まったところにフォローのメニューが現れる

レベル3. Bluesky の初期状態で、みんなデフォルトラベラーを購読している状態である

  • 設定 > モデレーション にある購読中のラベラー一覧にすでに含まれている
  • Bluesky Moderation Service というデフォルトラベラーは購読を外すことができない
    • https://bsky.app/profile/moderation.bsky.app
    • 例: えっちな投稿に「これはえっちだ」とラベルを貼る
    • 例: スパム投稿気味なアカウントに「この人はスパマーだ」とラベルを貼る

レベル4. ラベラーは、購読している・していないに関わらず、誰にでもラベルを貼ることができる

  • 購読してない人に対しても、ラベルを貼ることができる
    • 例: 一部のユーザーに都合の悪い投稿・あるいは投稿者に対してラベルを貼る
    • 例: どこかに所属していることを示すために、申請しつつ自身にラベルを貼る

レベル5. ラベラーを購読すると、ラベルそれぞれについて、見る見ないが選べる

  • 見るもの、見ないものは自身で決められる
  • オフ を選ぶと、ラベルが表示されなくなる
  • 非表示 を選ぶと、ラベルの付与されたユーザー自体が表示されなくなる
  • 分かりづらい… 🥺

レベル6. ラベラー側からは、誰が購読してるかは確認できない

  • 直感と異なり、ラベラーの購読情報は秘密情報
    • 分かりづらい… 🥺
  • ラベラー自身からも分からない
  • ラベラーがラベルを貼るユーザーは、購読とは別の方法で特定できていないといけない
    • リアルタイムに投稿を監視する(無差別)
    • ユーザー自身にアクションしてもらう(フォローやいいねなど)

レベル7. ラベラーアカウントは、ほぼ全てボットアカウントである

  • ラベラーはただラベル定義するだけじゃなく、常にラベルを貼ったり剥がしたりしないと価値がない
  • 常時ラベル貼りのことを考えないといけないので、人力で運用はほぼ不可能
  • いつどれに(どの投稿に)どういうラベルを付与するか?は自分でラベラー用のサーバーを立てて提供する必要がある

レベル8. ラベラーはAPIを叩いてラベラー定義をすればラベラーとして認識される

  • API 経由でラベル定義を投稿すると、ラベラーになる
  • いつもの投稿とは違うスペースに投稿すると、ラベル定義が投稿できて、ラベル定義があるとラベラーとして認識される
    • 通常の投稿は app.bsky.feed.post という場所(コレクション)に保存される
    • ラベル定義は app.bsky.labeler.service という場所(コレクション)に保存される
  • ラベラー定義は常に最新上書きなので、空のラベラー定義を投稿すれば変身が解ける
  • ラベラーは多言語対応が可能、言語ごとに設定すれば適切なものを使ってくれる

ちなみに、おみくじラベラーではこんなデータを追加しています。

{
    repo: bot.profile.did,
    collection: "app.bsky.labeler.service",
    rkey: "self",
    record: {
        $type: "app.bsky.labeler.service",
        createdAt: new Date().toISOString(),
        policies: {
            labelValues: [
                "daikichi",
                "kichi",
                "chukichi",
                "shokichi",
                "suekichi",
                "kyo",
                "daikyo",
            ],
            labelValueDefinitions: [
                {
                    identifier: "daikichi",
                    severity: "inform",
                    blurs: "none",
                    defaultSetting: "warn",
                    locales: [
                        { lang: "ja", name: "大吉", description: "今日の運勢は大吉!最高の一日があなたを待ってる!" },
                    ],
                },
                // 以下略

レベル9. ラベラーのラベル貼りには自身でサーバーを立てる必要がある

  • サーバーを立てないとラベル貼りは無理
    • ここがエンジニアリングしないと難しいところ
  • カスタムフィードはサーバーを立ててくれている方に乗っかる形でフィード作成することができるが、ラベラーはアカウントが成るものなので、なかなかサービス化して他の人にラベラー作成してもらうのも難しい

レベル10. ラベル貼りの情報をラベラーサーバーから提供するには WebSocket で繋ぐ必要がある

  • @skyware/labeler を使うと楽、必須エンドポイントを提供してくれる
  • Skyware ライブラリを使わずにやるなら、自前で WebSocket を繋ぐ必要がある

以上です! 有識者の方、間違いがあれば指摘してください!

おまけ: おみくじラベラーでの話

  • さっきの話の通り、購読だけだとラベラーからもユーザーがわからないので、フォローしてもらう
  • フォロー・フォロー解除をDBに記録し、日付をまたいだタイミングでラベルの貼り替え、ラベル剥がしを行う
  • 日本時刻の0時にまとめて動かすので、日本語のみに限定している
    • タイムゾーン情報が拾えない、欲しい!
Tags: #Bluesky #SNS