認証、API 呼び出し、oEmbed エンドポイントを使用して、Bluesky の「いいね!」した投稿をプログラムで取得して埋め込む方法を学びます。
私は最近Blueskyに移行しました。そこには、興味深く、役に立ち、刺激的なコンテンツがたくさんある活気のある技術コミュニティがあることをすでに確認できました。私は新しいユーザーとして幸せです! その結果、私は「Dev roundup」という月刊ニュースレターの投稿に、最もいいね! された Bluesky の投稿を埋め込むことを望んでいました。私の目標は、ソフトウェア開発者向けに特別に調整された Bluesky の投稿の厳選リストを提供することです。
幸いなことに、 Bluesky の API は完全に無料で使用でき、その中のすべてのコンテンツにプログラムでアクセスできます。このチュートリアルでは、Bluesky の API を使用して、いいねされた投稿を取得して埋め込むプロセスについて説明します。これは、個人のブログ、ポートフォリオ、またはコンテンツ集約プロジェクトに最適です。
私は、Bluesky の投稿を Markdown ブログ投稿に自動的に埋め込むことができるスクリプトを作成しました。このスクリプトで使用されている手順の一部またはすべてが、多くのユースケースで役立つと思います。
「いいね!」した投稿を埋め込むためのワークフローをまとめると、次の主要な手順に従います。
それぞれの機能とその目的を詳しく見てみましょう。
export const createSession = async (): Promise<string | null> => { try { const response = await fetch( "https://bsky.social/xrpc/com.atproto.server.createSession", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ identifier: "your-handle", password: "your-password", }), } ); const responseJson = await response.json(); return responseJson.accessJwt; } catch (e) { console.error("Failed to create session: ", e); return null; } };
重要な洞察:
accessJwt
JWT(JSON Web Token)を返します。createSession
エンドポイントを使用します。export const getBlueskyLikeUris = async (actor: string, limit: number = 40) => { const token = await createSession(); if (!token) { console.error("Failed to get token"); return; } const response = await fetch( "https://bsky.social/xrpc/app.bsky.feed.getActorLikes?actor=${actor}&limit=${limit}", { method: "GET", headers: { Authorization: `Bearer ${token}`, }, } ); const responseJson = await response.json(); const uris = responseJson.feed.map((entry: any) => entry.post.uri); return uris; };
重要な洞察:
getActorLikes
使用していいねされた投稿を取得しますexport const getBlueskyPostEmbedMarkup = async (uri: string) => { try { const response = await fetch(`https://embed.bsky.app/oembed?url=${uri}`); const responseJson = await response.json(); const formattedHTML = prettier.format(responseJson.html, { parser: "html", plugins: [require("prettier/parser-html")], htmlWhitespaceSensitivity: "ignore", printWidth: 1000, }); return formattedHTML.replace(/<script[\s\S]*?<\/script>/g, ""); } catch (e) { console.error("Failed to get Bluesky post embed markup"); return null; } };
重要な洞察:
prettier
を使用します<script>
タグを削除しますasync function embedLikedPosts() { try { // Get liked post URIs const likedPostUris = await getBlueskyLikeUris(); if (!likedPostUris) { console.error("No liked posts found"); return; } // Convert URIs to embed HTML const embedPromises = likedPostUris.map(getBlueskyPostEmbedMarkup); const embedHtmlArray = await Promise.all(embedPromises); // Filter out any failed embeds const validEmbeds = embedHtmlArray.filter(embed => embed !== null); // Return the markup for all liked posts return ` ## Some Fave Posts 🦋 ${validEmbeds.join(`\n\n`)} ` } catch (error) { console.error("Error embedding Bluesky posts:", error); } }
このソリューションは私にとっては有効です。必要なのは、静的に生成された月次ブログ投稿だけだからです。
改善点としては次のようなものが考えられます。
accessJwt
トークンを更新するためのメカニズムを作成するBluesky の投稿を埋め込むと、ソーシャル メディアでのやり取りを動的に表示できます。API ワークフローを理解し、堅牢なエラー処理を実装することで、魅力的でパーソナライズされた、厳選されたコンテンツ統合を作成できます。
楽しんで、楽しくいじってみてください! 🚀