作成しているツールでRubyからBlueskyへ投稿したかったので、ShreyanJain9/bskyrb: Ruby Gem for interacting with BlueSky/AT Protocolというライブラリを使うことにした。
使用例を見ると、
とあり、一見簡単そうに見えるがBlueskyの場合はXやMastodonのAPIとは異なり、投稿するメッセージの中に、
- URLがあってもリンクは設定されない
- ハッシュタグがあってもリンクは設定されない
- URLのコンテンツにOGBタグがあってもリンクカードは表示されない
という仕様であり、なかなか面倒であることがわかった。
そんなわけで上記のドキュメントを参照しつつ、それぞれどうやれば良いのか調べてみた。
リンクの設定
メッセージ中にURLがあれば、その部分を自動的にリンク設定したかったため、Rich text facetsの例にある以下の例を参考に、
以下のようなコードでfacetを作成した。
ハッシュタグの設定
メッセージ中にハッシュタグがあれば、その部分を自動的にリンク設定したかったため、同じようなロジックでfacetを作成する。
リンクカードの表示
メッセージ中のURLにあるコンテンツにOGPタグがあれば、リンクカードを表示するため以下の流れで対応した。
- URLにあるコンテンツにOGPタグがあるかを見に行く。無ければ以降の処理はスキップ
- og:title、og:descriptionなど処理に必要なタグ情報を取得する
- og:imageのサムネイル画像をダウンロードしBlueskyへアップロードする
- 3の戻り値を使いembedを作成する
3〜4のコードはこんなイメージ