Blueskyの自分の投稿をRSSに変換する(GAS使用)

2024/2現在、「ユーザーページのURL/rss」でその人の投稿をRSS形式で取得できるようになっています。
(例) https://bsky.app/profile/nigauri.me/rss

Bluesky RSS化

Blueskyの自分の投稿をRSSで取得したい!それでIFTTTで自動連携したい!という人向け記事。GAS(Google Apps Script)を使います。

ちなみにユーザ名を入れるだけでRSSを出力してくれるカワリミ人形さんBluestream(Bluesky→RSS Feed Generator)というのが既にあるのでそれを使うのが一番簡単だけど、自分の好きなようにカスタマイズしたりAtomにしたりJSONをそのまま返したりブログパーツを作ったりと自由度が高い&なるべく第三者のサービスを噛ませたくないみたいな人はこちらをどうぞ。

以前Mastodonで似たような記事を書いたんだけど、あれは元々Atomで配信されてたフィードの改良みたいな感じだった。

今回はRSS/Atomの配信機能自体がない、かつログインしていないとフィードが見られないので、真っ当にログインしてから対象の機能にアクセスして情報を得てそれをRSSに変換する必要がある。

極端な話AT ProtocolやBluesky関係のライブラリがなくてもしかるべきURLに正しいパラメータつけてPOSTとかGETすればほぼ全機能にアクセスできるのでそれさえわかればスクラッチでもなんとかなる。新しくできた技術だからってやさしい作りになっているのでなんもむずかしくない。

注意: 開発環境として VSCode と clasp を使って TypeScript で書いているため、コードをまるまる参考にする場合はこれらおよび Node.js のインストールが必要なので各自やってください。参考までに俺はWindowsでやっております。

おまけ: GAS用の開発環境構築メモ
Google Apps Script(GAS)を使用してBlueskyの自分の投稿をRSSに変換する記事でちょっと書いた、VSCode と clasp を使って TypeScriptでGASのコードを書くための開発環境の構築メモ。

ログイン

未ログインで見られるものは限られているのでまずはログイン処理を行う。

現時点ではOAuthとかそういった機能がなくてユーザ名とパスワードを用いた昔ながらのログインしかできない。セキュリティ的にはアレだけど技術的にはシンプルで簡単なので練習としては助かるね。パスワードはアプリパスワードの使用を推奨。

https://bsky.social/xrpc/com.atproto.server.createSessionidentifier (ハンドル名)と password のパラメータをつけてPOSTするとJSONが帰ってくる。その中の accessJwt が認証情報として必要なので保存しておく。

identifier には 「xxxx.bsky.social」または独自ドメインを設定する。以下のサンプルでは俺のハンドル名nigauri.meを設定してる。

自分のPost一覧を取得する

https://bsky.social/xrpc/app.bsky.feed.getAuthorFeedactor (ハンドル名)、 limit (取得件数。省略可) をつけてGETするとJSONが帰ってくる。アクセスの際ヘッダーに認証情報をいれとくこと。

JSONの内容をRSSに変換する

あとは取得した内容を見てRSSに変えて出すだけ。

投稿した画像は response.feed.post.embedの中に入っているのでそこから取得してdescriptionの末尾に足すなどする。

画像なし、引用なしのPostはresponse.feed.post.embedが無い。またQuote Post(引用RT)の場合の引用元がembedに入ってくるのでembedはあるけどembed.imagesがない場合もある。

Webサービス化する

doGet() を作ってさっきのXMLをレスポンスとして返す。

できたらclasp pushでGASにアップロードし、clasp openで編集画面を開いたらテストする。

問題なさそうなら「デプロイ」→「新しいデプロイ」→「種類の選択」でウェブアプリを選択→「デプロイ」で公開する。

その際に出てくる「https://script.google.com/macros/s/xxx/exec」みたいなURLをブラウザで開いたりRSSリーダーに読み込ませたりしてちゃんと動いてれば成功。

おつかれさまでした。