☀️

BlueskyのAPIを使ってリンク付きポストがしたかったのに、リンクにならなかった

2024/03/05に公開

(タイトルの日本語がおかしかったので修正しました)

結論

await RichText.detectFacets(agent: AtpAgent) をすれば勝手にメンションとリンクを検出してくれるからこいつを使えばOK

import { BskyAgent, RichText } from "@atproto/api";

const agent = new BskyAgent({
    service: "https://bsky.social",
});
const message = "@xxxxxx.bsky.social こんにちは!プロフ見て → https://xxx/profile"
const rt = new RichText({ text: message });
await rt.detectFacets(agent); // ← メンション、リンクを検出してくれる便利なやつ

await agent.login({
    identifier: row.bluesky_id,
    password: blueskyPassword,
})

await agent.post({
    $type: "app.bsky.feed.post",
    text: richMessage.text,
    facets: richMessage.facets,
})

雑記

個人開発でブルースカイと連携して自動で投稿するようなツールを作っているんですが、そこで何をやってもリンクがリンクにならなかった

const rt = new RichText({ text: "https://xxx" });
await agent.post({
    $type: "app.bsky.feed.post",
    text: richMessage.text,
    facets: richMessage.facets,
})

リッチテキストにすればURLになる!という情報しか頭に入っていなかったので、結構ここで躓いてしまった
他の人の記事を参考に作成しても全然URLにならないし、なんでだ……と思っていたが、よくよく見たらどの記事でも detectFasets というのを行っていた
つまり普通に見落としていただけだった……

そもそもFacetsってなんやねん……と思ってGeminiたんに聞いてみると

オブジェクト指向プログラミング (OOP) におけるファセットは、オブジェクトの側面、性質、または振る舞いを表すインターフェースの一種です。オブジェクトの機能を細分化し、モジュール化することで、コードの再利用性と保守性を向上させることができます。

とのこと
なるほどね(わかってない)

ちなみにもう一つ答えてくれていて、情報検索においては、

情報検索におけるファセットは、メタデータを分類するためのカテゴリの一種です。
価格、カテゴリ、ブランド、色、サイズなどを指します。

ということらしい
なんとなく理解した、というか今回のリッチテキストに関してはこっちのほうが意味合いとしてはあってるのかな

Discussion