{
"path": "/posts/bluesky-labeler-memo",
"site": "at://did:plc:rgdcflm4ylsl6udghmtblydc/site.standard.publication/blog",
"tags": [
"Bluesky"
],
"$type": "site.standard.document",
"title": "Blueskyのカスタムラベラー備忘録",
"updatedAt": "2026-02-22T10:06:53.464Z",
"description": "カスタムラベラーの挙動にハマったので、メモを残します。",
"publishedAt": "2024-04-28T00:00:00.000Z",
"textContent": "## はじめに\n\nカスタムラベラーの挙動にハマったので、メモを残します。\n\n## 調査結果\n\nカスタムラベラーのラベルが付与された状態の投稿を取得する際は、検索APIは下記のように呼び出す。\n\n```abap\ncurl -L -X GET 'https://api.bsky.app/xrpc/app.bsky.feed.getPosts?uris=at://did:plc:rgdcflm4ylsl6udghmtblydc/app.bsky.feed.post/3kr6zteuket2k' \\\n-H 'Accept: application/json' -H 'atproto-accept-labelers:did:plc:fcikraffwejtuqffifeykcml,did:plc:ar7c4by46qjdydhdevvrndac'\n```\n\nカスタムラベラーのdidをatproto-accept-labelersヘッダにカンマ区切りで突っ込むことで、戻り値にdid:plc:fcikraffwejtuqffifeykcmlのラベルが投稿やユーザーに付与された状態で返却される。\n\n```xml\n{\n \"posts\": [\n {\n \"uri\": \"at://did:plc:fcikraffwejtuqffifeykcml/app.bsky.feed.post/3kr752tg7ju2j\",\n \"cid\": \"bafyreia7xyopr4dp4unlku7r5ccjet6zbd6tt4z7jttbwjcxhu22r7fdl4\",\n \"author\": {\n \"did\": \"did:plc:fcikraffwejtuqffifeykcml\",\n \"handle\": \"ff14labeler.bsky.social\",\n \"displayName\": \"FF14非公式ラベリング\",\n \"avatar\": \"https://cdn.bsky.app/img/avatar/plain/did:plc:fcikraffwejtuqffifeykcml/bafkreie4kemqc5wdcrdy6bgoqqbtdbewypykcf2lvh3mmtnyyqda2irfz4@jpeg\",\n \"associated\": {\n \"labeler\": true\n },\n \"labels\": []\n },\n \"record\": {\n \"$type\": \"app.bsky.feed.post\",\n \"createdAt\": \"2024-04-28T14:14:33.969Z\",\n \"embed\": {\n \"$type\": \"app.bsky.embed.images\",\n \"images\": [\n {\n \"alt\": \"\",\n \"aspectRatio\": {\n \"height\": 500,\n \"width\": 500\n },\n \"image\": {\n \"$type\": \"blob\",\n \"ref\": {\n \"$link\": \"bafkreidki3bjru36oheztcqrvn4ujwmbi3xbgs2way3kv37bp46jpfdzaa\"\n },\n \"mimeType\": \"image/jpeg\",\n \"size\": 178951\n }\n }\n ]\n },\n \"labels\": {\n \"$type\": \"com.atproto.label.defs#selfLabels\",\n \"values\": [\n {\n \"val\": \"nudity\"\n }\n ]\n },\n \"langs\": [\n \"ja\"\n ],\n \"reply\": {\n \"parent\": {\n \"cid\": \"bafyreid7qkyhobqy2udgvrwwapfrcadgpk4s7p7lxc5p525ai7my35m7om\",\n \"uri\": \"at://did:plc:fcikraffwejtuqffifeykcml/app.bsky.feed.post/3kpjtrrdfic2h\"\n },\n \"root\": {\n \"cid\": \"bafyreid7qkyhobqy2udgvrwwapfrcadgpk4s7p7lxc5p525ai7my35m7om\",\n \"uri\": \"at://did:plc:fcikraffwejtuqffifeykcml/app.bsky.feed.post/3kpjtrrdfic2h\"\n }\n },\n \"text\": \"申し訳ありません。少しテストさせてください。\"\n },\n \"embed\": {\n \"$type\": \"app.bsky.embed.images#view\",\n \"images\": [\n {\n \"thumb\": \"https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:fcikraffwejtuqffifeykcml/bafkreidki3bjru36oheztcqrvn4ujwmbi3xbgs2way3kv37bp46jpfdzaa@jpeg\",\n \"fullsize\": \"https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:fcikraffwejtuqffifeykcml/bafkreidki3bjru36oheztcqrvn4ujwmbi3xbgs2way3kv37bp46jpfdzaa@jpeg\",\n \"alt\": \"\",\n \"aspectRatio\": {\n \"height\": 500,\n \"width\": 500\n }\n }\n ]\n },\n \"replyCount\": 0,\n \"repostCount\": 0,\n \"likeCount\": 0,\n \"indexedAt\": \"2024-04-28T14:14:33.969Z\",\n \"labels\": [\n {\n \"cid\": \"bafyreia7xyopr4dp4unlku7r5ccjet6zbd6tt4z7jttbwjcxhu22r7fdl4\",\n \"cts\": \"2024-04-28T14:20:14.779Z\",\n \"src\": \"did:plc:fcikraffwejtuqffifeykcml\",\n \"uri\": \"at://did:plc:fcikraffwejtuqffifeykcml/app.bsky.feed.post/3kr752tg7ju2j\",\n \"val\": \"label-test\",\n \"ver\": 1\n },\n {\n \"src\": \"did:plc:fcikraffwejtuqffifeykcml\",\n \"uri\": \"at://did:plc:fcikraffwejtuqffifeykcml/app.bsky.feed.post/3kr752tg7ju2j\",\n \"cid\": \"bafyreia7xyopr4dp4unlku7r5ccjet6zbd6tt4z7jttbwjcxhu22r7fdl4\",\n \"val\": \"nudity\",\n \"cts\": \"2024-04-28T14:14:33.969Z\"\n }\n ]\n }\n ]\n}\n```\n\nラベルで抜粋すると、下記となる。\n\n```xml\n\"labels\": [\n {\n \"cid\": \"bafyreia7xyopr4dp4unlku7r5ccjet6zbd6tt4z7jttbwjcxhu22r7fdl4\",\n \"cts\": \"2024-04-28T14:20:14.779Z\",\n \"src\": \"did:plc:fcikraffwejtuqffifeykcml\",\n \"uri\": \"at://did:plc:fcikraffwejtuqffifeykcml/app.bsky.feed.post/3kr752tg7ju2j\",\n \"val\": \"label-test\",\n \"ver\": 1\n },\n {\n \"src\": \"did:plc:fcikraffwejtuqffifeykcml\",\n \"uri\": \"at://did:plc:fcikraffwejtuqffifeykcml/app.bsky.feed.post/3kr752tg7ju2j\",\n \"cid\": \"bafyreia7xyopr4dp4unlku7r5ccjet6zbd6tt4z7jttbwjcxhu22r7fdl4\",\n \"val\": \"nudity\",\n \"cts\": \"2024-04-28T14:14:33.969Z\"\n }\n ]\n```\n\n\n\n配列の1個目のsrcは「did:plc:fcikraffwejtuqffifeykcml」であり、これは私のラベラーによって付与されたラベル(TOKIMEKI用語の生ラベル「label-test」)が付与されていることがわかる。\n\n配列の2つ目のsrcは\"did:plc:fcikraffwejtuqffifeykcmlはラベラーアカウント自身が、「nudity」のラベルを投稿時に付与した。\n\n投稿時に手動で付与されたラベルと、後付けラベルを判断するには、ver要素が存在しているかどうかで判断する模様。まとめると下記となる。\n\n- ver要素がある:後付けラベル\n- ver要素がない:投稿時手動ラベル\n公式モデレーションサービスのdidだけをヘッダに指定した場合は\n\n```xml\ncurl -L -X GET 'https://api.bsky.app/xrpc/app.bsky.feed.getPosts?uris=at://did:plc:rgdcflm4ylsl6udghmtblydc/app.bsky.feed.post/3kr6zteuket2k' \\\n-H 'Accept: application/json' -H 'atproto-accept-labelers:did:plc:ar7c4by46qjdydhdevvrndac'\n```\n\n当然、カスタムラベラーによって付与されたラベルは見れない\n\n```xml\n \"labels\": [\n {\n \"src\": \"did:plc:fcikraffwejtuqffifeykcml\",\n \"uri\": \"at://did:plc:fcikraffwejtuqffifeykcml/app.bsky.feed.post/3kr752tg7ju2j\",\n \"cid\": \"bafyreia7xyopr4dp4unlku7r5ccjet6zbd6tt4z7jttbwjcxhu22r7fdl4\",\n \"val\": \"nudity\",\n \"cts\": \"2024-04-28T14:14:33.969Z\"\n }\n ]\n```\n\nBlueskyのアプリの使用上、公式モデレーションサービスであるdid:plc:ar7c4by46qjdydhdevvrndacを除外することが出来ないため、常にdid:plc:ar7c4by46qjdydhdevvrndacの後付けラベルが付与された状態でのラベルが参照されることになる。\n\n## atproto/apiを使う場合\n\nagentにメソッドがある。string[]で最大十個です。\n\n```typescript\nagent.configureLabelersHeader(labelerDid)\n```\n\n間違っても、addLabelerを使ってはならない。こればログインユーザーのラベラーの購読を直接イジるメソッド。\n\n\n\n"
}