{
"path": "/posts/feed-02",
"site": "at://did:plc:rgdcflm4ylsl6udghmtblydc/site.standard.publication/blog",
"tags": [
"Bluesky"
],
"$type": "site.standard.document",
"title": "Blueskyのカスタムフィードの仕組みを一から自分で考える #02",
"updatedAt": "2026-02-22T10:06:59.721Z",
"publishedAt": "2023-12-27T00:00:00.000Z",
"textContent": "## カスタムフィードの目的\n\n動かす仕組みが理解できたので、さて何に手を出そうと思っていたところ、別SNSで何かか起こったようでBlueskyのユーザーさんが増えて投稿量が増加。その結果、今までのカスタムフィードでは投稿量が多く用途別に細分化さえる流れになりました。\n\n元々Blueskyのカスタムフィードそのものを検索する仕組みに乏しく、草の根活動でどうにかしていて。誰かに紹介するにも大変、作るのもあれ似たようなやつあったっけ?を探すのも大変でした。外部サイトさんでカスタムフィードのまとめを作られている方もいますが、外部サイトさんではFF14用のカテゴリを作っていただくわけにもいかない。でも、個別の案内サイトを作る規模でもない。\n\nもしかして、フィードを紹介するフィードを作れば良いのでは?しかも自動で。ということでやりたいことは下記となりました。\n\n1. フィードを紹介する投稿からフィードを自動生成したい\n1. 自動生成を取り逃がした投稿も追加できるようにしたい\n1. このフィードへの掲載を望まない作成者の意図を汲みたい\n1. フィードの作成者のみが、このフィードへの追加・削除ができるようにしたい\n1. これらをBlueskyの仕組みだけで実現したい\n## アーキテクチャの検討\n\n2はFirehoseの仕組み上、サーバー止まっている間のものを俎上処理ができないので、必須要件。これはBlueskyで最も有名なチャットBOTである「どのきのこに属するの?」の仕組みで簡単にできるはず。\n\nチャットボット的な機能も欲しいし明らかにDBレス(Contrailsとか)では無理なので、今回は素直に公式のサンプルのアーキテクチャをそのまま流用しすればよい。\n\nカスタムフィードを表示するところにロジックを埋めるのは厳しそうなので、素直にデータベースには諸々の処理結果のみを書き込むようにします。Firehoseは全世界の投稿、リポスト、いいね、投稿削除のイベントが飛んできます。意外とイベントを受け取るのは負荷低めなものの、それをDBに書き込むのは別の話。IO発生するし、なにより溜め込んだものを使うのも大変。絞り込んだモノを保存するようにします。\n\nsubscription.tsの「async handleEvent(evt: RepoEvent)」がPDSからイベントを受信したrelayから連携イベントを受け取った時に呼ばれるメソッド。\n\n「ops.posts.creates」に連携された投稿そのものが入っているので、1件ずつバラして、投稿の本文から「フィードを紹介する投稿」を判別するように出来ますね。(できそうだと言っておきながら、公式のサンプルで「alf」の文字列に引っ掛けているのでそこに手を入れる)\n\n"
}