import { Client, simpleFetchHandler } from "@atcute/client"; import { AppBskyFeedPost } from "@atcute/bluesky"; import { parseResourceUri } from "@atcute/lexicons"; import fs from "fs"; import "dotenv/config"; const client = new Client({ handler: simpleFetchHandler({ service: "https://public.api.bsky.app" }), }); async function getLikedPosts( cursor: string | undefined = undefined, posts: AppBskyFeedPost.Main[] = [], ): Promise { const response = await client.get("app.bsky.feed.getAuthorFeed", { params: { actor: process.env.DID, filter: "posts_no_replies", cursor, }, }); if (!response.ok) { console.log(response); return []; } for (const feedItem of response.data.feed) { if (feedItem.post.author.did != process.env.DID) continue; posts.push(feedItem); } if (response.data.cursor) { return getLikedPosts(response.data.cursor, posts); } return posts; } async function main() { const posts = await getLikedPosts(); posts.sort((a, b) => b.post.likeCount - a.post.likeCount); fs.writeFileSync("dist/toplikes.md", "Post | likes"); fs.appendFileSync("dist/toplikes.md", "\n-----|------"); for (const post of posts) { const uri = parseResourceUri(post.post.uri); if (!uri.ok) continue; fs.appendFileSync( "dist/toplikes.md", `\nhttps://bsky.app/profile/${uri.value.repo}/post/${uri.value.rkey} | ${post.post.likeCount}`, ); } } main();