Bluesky の外部公開
Bluesky の公開用 web インターフェースが実装されログインしなくても投稿やプロフィールページを見ることができるようになった。
https://bsky.app/profile/ubanis.com
それに加えてポストの RSS が配信されるようになったので、それを取得してサイトで表示するようにした。
RSS の URL は profile/ユーザーのDID/rss のアドレスになっている。
https://bsky.app/profile/did:plc:lmftezsq52hi53taz762s7pc/rss
最初は RSS から json への変換を rss-to-json で行おうとしたものの変換はできるものの表示できないので外部 API を利用することにした。
https://github.com/nasa8x/rss-to-json
rss-to-json は fetch ではなく axios を使っているのが原因かもしれない(よくわかってないので詳しい方教えて下さい)
https://github.com/nasa8x/rss-to-json/issues/65
RSS から json への変換は rss2json.com を利用する。無料版では1時間に1回 RSS が更新される。
https://rss2json.com
Svelte のコード
以下は svelte のコード。
<script> import { onMount } from "svelte"; import { fade, slide } from "svelte/transition"; let promise = new Promise(() => {}); onMount(() => { promise = (async () => { const res = await fetch("rss2jsonのapi URL"); const data = res.json(); return data; })(); });</script><div class="break-all rounded-xl bg-(color:--bg-base-color) pb-4"> <h2 class="rounded-t-xl bg-blue-500 p-2 text-lg font-bold leading-8 text-white">Bluesky</h2> {#await promise} <p transition:slide on:introstart={() => (visible = false)} on:outroend={() => (visible = true)} > 読み込み中... </p> {:then data} <div class="loaded" in:fade> <h3 class="bg-slate-300 p-2 text-base text-black underline"> <a href={data.feed.link}>{data.feed.title}</a> </h3> {#each data.items as item} <p class="border-b border-dotted border-(color:--border-color) px-3 py-3 text-base"> {item.description} <time class="pt-2 text-sm block">{item.pubDate} + 9h</time> <a class="hover:text-(color:--text-linkhover-color) text-(color:--text-link-color) text-sm pt-2" href={item.link} target="_blank">[ポスト元]</a > </p> {/each} </div> {:catch error} <p>ERROR {error.message}</p> {/await}</div>
完成品
実際に動作しているものは以下のようになる。(Astro の構造上ブログ用スタイルシートがコンポーネントに適用されてレイアウトがおかしいのはご了承ください。正しい表示なのはプロフィールページにあります。)
もう設置して動いていない