Dowiedz się, jak programowo pobierać i osadzać polubione posty Bluesky, korzystając z uwierzytelniania, wywołań API i punktów końcowych oEmbed.
Niedawno przeszedłem na Bluesky . Mogę już potwierdzić, że istnieje tam prężnie działająca społeczność technologiczna z mnóstwem interesujących, przydatnych i inspirujących treści. Jestem szczęśliwym nowym użytkownikiem! W rezultacie chciałem osadzić moje najbardziej lubiane posty Bluesky w moich miesięcznych postach w biuletynie „Dev Roundup”. Moim celem jest dostarczenie wyselekcjonowanej listy postów Bluesky, która jest specjalnie dostosowana do programistów oprogramowania.
Na szczęście API Bluesky jest całkowicie darmowe, co pozwala na programowy dostęp do całej zawartości. Ten samouczek przeprowadzi Cię przez proces pobierania i osadzania polubionych postów Bluesky za pomocą ich API, co jest idealne dla osobistych blogów, portfolio lub projektów agregacji treści.
Zbudowałem skrypt, który pozwala mi automatycznie osadzać moje posty Bluesky w poście blogowym w formacie Markdown. Myślę, że wszystkie lub niektóre kroki użyte w tym skrypcie są cenne w wielu przypadkach użycia.
Podsumowując mój obieg pracy związany z osadzaniem polubionych postów, postępujemy zgodnie z poniższymi kluczowymi krokami:
Przyjrzyjmy się bliżej każdej funkcji i jej celowi:
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; } };
Najważniejsze informacje:
accessJwt
JWT (JSON Web Token) dla kolejnych wywołań APIcreateSession
z protokołu ATP (Authenticated Transfer Protocol) firmy Bluesky 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; };
Najważniejsze informacje:
getActorLikes
do pobierania polubionych postów 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; } };
Najważniejsze informacje:
prettier
, aby spójnie sformatować kod HTML<script>
w celu zapewnienia bezpieczeństwa i czystego osadzania 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); } }
To rozwiązanie sprawdza się w moim przypadku, ponieważ wszystko, czego potrzebuję, to statycznie generowany, miesięczny wpis na blogu.
Niektóre usprawnienia mogą obejmować:
accessJwt
, jeśli jest używany w długotrwałych procesachOsadzanie postów Bluesky zapewnia dynamiczny sposób prezentowania interakcji w mediach społecznościowych. Dzięki zrozumieniu przepływu pracy API i wdrożeniu solidnej obsługi błędów możesz tworzyć angażujące, spersonalizowane i starannie dobrane integracje treści.
Miłej zabawy i udanego majsterkowania! 🚀