Skip to content

Instantly share code, notes, and snippets.

@TundraShark
Created December 1, 2024 22:05
Show Gist options
  • Save TundraShark/c1c1043672b0be13b0905c84d908a30d to your computer and use it in GitHub Desktop.
Save TundraShark/c1c1043672b0be13b0905c84d908a30d to your computer and use it in GitHub Desktop.
Blocking and unblocking users using the Bluesky API
import "dotenv/config";
import { AtpAgent, AtUri } from "@atproto/api";
import { OAuthClient } from "@atproto/oauth-client";
import { Response } from "@atproto/api/dist/client/types/com/atproto/server/createSession";
const BSKY_HANDLE = process.env.BSKY_HANDLE ?? (() => { throw new Error("Missing BSKY_HANDLE in environment variable"); })();
const BSKY_API_KEY = process.env.BSKY_API_KEY ?? (() => { throw new Error("Missing BSKY_API_KEY in environment variable"); })();
async function Authenticate (): Promise<AtpAgent> {
const agent = new AtpAgent({ service: "https://bsky.social" });
await agent.login({ identifier: BSKY_HANDLE, password: BSKY_API_KEY });
return agent;
}
async function ResolveHandleToDid(agent: AtpAgent, handle: string): Promise<string> {
const response = await agent.resolveHandle({ handle });
if (!response || typeof response !== "object" || !response.data || !response.data.did) {
throw new Error(`Failed to resolve handle to DID: Unexpected response structure for handle ${handle}`);
}
const userDid = response.data.did;
console.log(`Resolved handle ${handle} to DID: ${userDid}`);
return userDid;
}
async function BlockUser(agent: AtpAgent, userDid: string) {
const { uri } = await agent.app.bsky.graph.block.create(
{ repo: agent.session?.did },
{
subject: userDid,
createdAt: new Date().toISOString(),
}
);
console.log(`Blocked user with DID: ${userDid}`);
}
async function GetBlockRecordKey(agent: AtpAgent, userDid: string): Promise<string | null> {
const blocks = await agent.app.bsky.graph.block.list({
repo: agent.session!.did,
});
const blockRecord = blocks.records.find(record => record.value.subject === userDid);
if (blockRecord) {
return blockRecord.uri;
} else {
console.log(`No block record found for user: ${userDid}`);
return null;
}
}
async function UnblockUser(agent: AtpAgent, userDid: string) {
const blockUri = await GetBlockRecordKey(agent, userDid);
if (!blockUri) return;
// Get the record key by parsing the URI
const { rkey } = new AtUri(blockUri);
// Delete the block record
await agent.app.bsky.graph.block.delete({
repo: agent.session?.did,
rkey,
});
}
async function Main () {
const agent = await Authenticate();
const userHandle = "tundrashark.com";
const userDid = await ResolveHandleToDid(agent, userHandle);
await BlockUser(agent, userDid);
// await UnblockUser(agent, userDid);
}
Main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment