Blueskyのカスタムフィードの仕組みを一から自分で考える #01

usounds
·

SkyFeedも便利だけど、7日間の制限やタイムラグなどの制限を突破してみたい・・・と考えた私が、ようやく理解するに至った経緯をつらつらと書きます。

こちらのサンプルソース、概ね 4つの機能で成り立っています

  1. Blueskyのサーバーから「投稿」のイベントを受け取って、メモリかSQLiteにその投稿をひたすら書き込む

  2. カスタムフィードのサーバーとして最低限の認証情報を返す

  3. カスタムフィードが呼び出された時に、メモリかSQLiteにある投稿を返す

  4. カスタムフィードそのものをBlueskyのサーバに登録し、解決できるようにする

この機能の中で、単なるカスタムフィードを成立させるのであれば、2と3だけあればOKなのです。

2は下記のようにエンドポイントが書いてあるJSONを返します。.well-known自体はBluesky固有ではなく、インターネットの世界でよく使われます。単純にサーバー名返せばOKなので、物理的なファイルを配置しても良いです。

3は下記のようなJSONを返却します

JSONを見ると下記のようなcursorとpostの羅列です。postの配列はat://did:plc:oznd7j2sgw5yaokcuj23kbs7/app.bsky.feed.post/3kgxttdfgvb2gといういわゆる投稿をユニークに特定するキー(DID)になっています。すなわち、「表示したい投稿のDIDをpostの配列とそれっぽいcoursorをつけて返せば良い」ことになります。coursorを返すかは任意なので、極論、固定のJSONを返す実装をすれば良いのです。

{"cursor":"1702737520220::bafyreignf2tpupmnv4hv3juiyd3jxzk3f7sh4yruab7cgxqjjssvnfdfeu","feed":[{"post":"at://did:plc:oznd7j2sgw5yaokcuj23kbs7/app.bsky.feed.post/3kgxttdfgvb2g"},{"post":"at://did:plc:oznd7j2sgw5yaokcuj23kbs7/app.bsky.feed.post/3kgxqhxnrs326"}}

4は相当に特殊です。2,3はカスタムフィードを表示するときに毎回呼ばれる処理、であることは理解できるかと思います。4はBlueskyに登録するだけの機能です。「https://feedgenerator.usounds.work/xrpc/app.bsky.feed.getFeedSkeleton?feed=at://did:plc:rgdcflm4ylsl6udghmtblydc/app.bsky.feed.generator/aaajpyz7pnyko」をBlueskyの世界に登録する、と言うことを行います。

登録を行う際のリクエストは下記のようになります。

36行目のdid:plc:rgdcflm4ylsl6udghmtblydcは私のBlueskyのアカウントのDIDです。

37行目のrkeyは私のDIDに「aaajpyz7pnyko」(スクショだと別の文字になっています)という名前のFeedGeneratorを登録します。

41行目はその登録するFeed Generatorの実際のサーバーは「did:web:feedgenerator.usounds.work"」(スクショだと別のサーバーになっています)です。それ以降はカスタムフィードの名前やら画像やらが登録されています。

すなわち、この登録を行うことで

https://bsky.app/profile/did:plc:rgdcflm4ylsl6udghmtblydc/feed/aaajpyz7pnyko

のカスタムフィードにアクセスがあると、Bluesakyのサーバーは、/alfの実態サーバーはfeedgenerator.usounds.workであることがわかっている。よって、実際のデータは

https://feedgenerator.usounds.work/xrpc/app.bsky.feed.getFeedSkeleton?feed=at://did:plc:rgdcflm4ylsl6udghmtblydc/app.bsky.feed.generator/aaajpyz7pnyko

からとってくる

という処理になります。DNSの名前解決みたいですね。一度登録すれば、aaajpyz7pnykofeedgenerator.usounds.workサーバーにある、という紐付きを変えない限り登録しっぱなしになります。カスタムフィードの条件をかえても、都度Publishする必要はありません。画像や説明文を変えたいときだけ使います。(SkyFeedは毎回Publishするじゃないかはその通りで、SkyFeedのPublishボタンはSkyFeedの検索ロジックの保存と、BlueskyへのPublishの2つの機能を持っています。)

また、Publishするサーバーは、どこでもよいです。私は作業用PCから登録してます。

現状、一度Publishするとキャンセル出来ないようです。