Blueskyのポストをサイトに表示する

作成:

Blueskyの外部公開

Blueskyの公開用webインターフェースが実装されログインしなくても投稿やプロフィールページを見ることがで きるようになった。

ubanis(Bluesky) (@ubanis.com)
futanari artist R18 絵を描きます サイト ubanis.com 各種リンク https://linkat.blue/ubanis.com Blueskyにアップした絵 bsky.app/profile/did:plc:lmftezsq52hi53taz762s7pc/feed/aaalx2yzi3h5u
ubanis(Bluesky) (@ubanis.com) favicon
ubanis(Bluesky) (@ubanis.com) favicon
https://bsky.app/profile/ubanis.com
ubanis(Bluesky) (@ubanis.com)
ubanis(Bluesky) (@ubanis.com)

それに加えてポストのRSSが配信されるようになったので、それを取得してサイトで表示するようにした。

RSSのURLは profile/ユーザーのDID/rss のアドレスになっている。

bsky.app
bsky.app favicon
bsky.app favicon
https://bsky.app/profile/did:plc:lmftezsq52hi53taz762s7pc/rss

RSSを読み込む

最初はRSSからjsonへの変換をrss-to-jsonで行おうとしたものの変換はできるものの表示できないので外部API を利用することにした。

GitHub - nasa8x/rss-to-json: RSS and Atom feed generator for Node.js
RSS and Atom feed generator for Node.js. Contribute to nasa8x/rss-to-json development by creating an account on GitHub.
GitHub - nasa8x/rss-to-json: RSS and Atom feed generator for Node.js favicon
GitHub - nasa8x/rss-to-json: RSS and Atom feed generator for Node.js favicon
https://github.com/nasa8x/rss-to-json
GitHub - nasa8x/rss-to-json: RSS and Atom feed generator for Node.js
GitHub - nasa8x/rss-to-json: RSS and Atom feed generator for Node.js

rss-to-jsonはfetchではなくaxiosを使っているのが原因かもしれない(よくわかってないので詳しい方教えて下 さい)

move from axios to fetch · Issue #65 · nasa8x/rss-to-json
Currently, fetch is available in Node.js natively. From other side axios doesn't work at serverless env (Cloudflare workers as an example) It would be nice to move from axios to builtin fetch
move from axios to fetch · Issue #65 · nasa8x/rss-to-json favicon
move from axios to fetch · Issue #65 · nasa8x/rss-to-json favicon
https://github.com/nasa8x/rss-to-json/issues/65
move from axios to fetch · Issue #65 · nasa8x/rss-to-json
move from axios to fetch · Issue #65 · nasa8x/rss-to-json

RSSからjsonへの変換はrss2json.comを利用する。無料版では1時間に1回RSSが更新される。

RSS to JSON Converter online - rss2json.com
Free online API to convert RSS to JSON
RSS to JSON Converter online - rss2json.com favicon
RSS to JSON Converter online - rss2json.com favicon
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の構造上ブログ用スタイルシートがコンポーネントに適用 されてレイアウトがおかしいのはご了承ください。正しい表示なのはプロフィールページにあります。)

プロフィール
へび右曲がりはubanisによるふたなりサイトです
プロフィール favicon
プロフィール favicon
https://ubanis.com/profile
プロフィール
プロフィール

Bluesky

読み込み中...