LoginSignup
0
0

Blueskyでプロフィール検索Custom feedを実装した(Skyfeed未実装機能)

Last updated at Posted at 2024-02-18

はじめに

Blueskyに移住したSuibariです。
今回、BlueskyにおけるTwitterのList的な機能であるCustom Feedを実装しました。

Custom Feedは以下公式のFeed Generator SDKを使うのが早道ですが、実装的にはFirehoseで全世界のポストをクエリでフィルタリングしてDBに取り込み、それを返すようになっています。
https://github.com/bluesky-social/feed-generator/blob/main/README.md

同じことはSkyfeedなどサードパーティクライアントでもノーコードで実現できるので、わざわざサーバを立てて実装する旨味があまりないです。

今回は差別化として「全ユーザのプロフィール欄の検索を行い、hitしたユーザの全ポストをまとめて返す」feedアルゴリズムを実装しました。
これはskyfeedにもない機能になります。

本feedを作りたかった目的として、Skyfeedの自作Custom Feedのinput feedとして設定することで、機能拡張を狙いたかったところがあります。
(しかし2024/2/18現在、input feedに自作feedは設定できないようです。作ってから気づいた…)

作ったもの

作成したCustom Feedは以下です。
https://bsky.app/profile/did:plc:uixgxpiqf4i63p6rgpu7ytmx/feed/whats-alf

サンプルとして 「baystars」または「ベイスターズ」をプロフィール文に含むユーザのポストを時系列順に表示する ようにしています。
このクエリは皆さんのサーバにデプロイさえすれば自由に変更できるので、推しの名前を設定してみるなど自由にお使いください。

必要なもの

  • 自前サーバまたはRender.comなどのPaaSクラウド
  • Blueskyアカウント

使い方

feedサーバ構築

まず、以下リポジトリを自分のリポジトリにfolkしてください。
https://github.com/suibari/feed-profile-search

cloneします。

$ git clone https://github.com/xxx/feed-profile-search.git
※xxxは自分のユーザ名

以下、仮にPaaSクラウドであるRender.comにデプロイするとします。

  1. Render.comでAppを新規作成
  2. folkして作ったリポジトリと紐づけ
  3. 以下画像の環境変数を設定。各変数の説明は以下

image.png

  • FEEDGEN_APP_PASSWORD: 自分のログインパスワードもしくはApp Password
  • FEEDGEN_HOSTNAME: サーバのホスト名。render.comならhttps://[service name].onrender.com/
  • FEEDGEN_LISTENHOST: 0.0.0.0
  • FEEDGEN_PORT: 443
  • FEEDGEN_PUBLISHER_DID: 自分のDID。調べ方
  • FEEDGEN_PUBLISHER_IDENTIFIER: 自分のハンドル名。xxx.bsky.social的なやつ
  • FEEDGEN_QUERY: 検索文字列。本セクション末尾に詳細を記載

デプロイ実行します。これでfeedサーバ側は準備完了。

Blueskyサーバへの登録

次にBlueskyサーバへのPublishを行います。

  1. cloneしたディレクトリのルートに.envを置きます。内容は上記環境変数を入れます。
  2. 登録するfeed名や説明文など変えたければ、./scripts/publishFeedGen.ts を適宜編集
  3. 以下実行
$ yarn
$ yarn publishFeed

登録は2秒くらいで終わります。

環境変数FEEDGEN_QUERYの設定方法

半角スペースで区切った単語をORで検索する仕様になっています。

FEEDGEN_QUERY="baystars ベイスターズ"
→これで"baystars"と"ベイスターズ"をOR検索

半角スペースが入る単語には対応していません。
その他細かい仕様はLucene Query構文を見てみてください。

公式ドキュメントによるとLucene Query構文に従うはずなのですが、OR検索ができないっぽかったです…。
そのためOR処理は自前で実装しています。

その他アプリケーション仕様

  • FirehoseのようなリアルタイムのStreaming通信が行えないので、10分おきの定期処理としています。./src/subscription.tsで間隔は変更できますが、自己責任でおねがいします

はまりどころ

以下、詰まりました。

  • 特定ユーザの全ポストを返すAPIがなかなか見つからなかった。Blueskyにおけるfeedの定義は相当幅広く、それさえもAuthor Feedと定義されていることに気づくのに時間がかかった
  • Typescript初めてすぎわからんちん

あとSkyfeedで現在、input feedには「個人feed」と「公式feed」が設定不可能らしいのですが、それ以外のfeedって何なんでしょう…。
詳しい方いましたら教えて下さい。
feed server側のレスポンスで対応できるなら、対応できると思うので歓喜なんですが。

終わりに

BlueskyはTwitter API触りまくってたあの頃を思い出して最高に楽しいです。
Firehoseも無料とか凄すぎる。
私も、自分が昔やってた勢い計測とか色々やっていきたいので、みんな情報共有してがんばっていきまっしょい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0