Crea un bot en TypeScript
Esta guía escribe un bot que publica en Bluesky con
@atproto/api, el SDK oficial
de TypeScript. Funciona con Node.js 20 o posterior.
1. Crea una contraseña de aplicación
Inicia sesión en Bluesky como el bot, abre Ajustes → Privacidad y seguridad → Contraseñas de aplicación y crea una. Un bot inicia sesión con una contraseña de aplicación, nunca con la contraseña principal de la cuenta: puedes revocarla en cualquier momento sin tocar la cuenta.
2. Prepara el proyecto
mkdir my-bot && cd my-bot
npm init -y
npm pkg set type=module
npm install @atproto/api
npm install --save-dev tsx typescriptMantén las credenciales fuera del código, en variables de entorno:
export BLUESKY_HANDLE="weather.bluesky.bot"
export BLUESKY_APP_PASSWORD="xxxx-xxxx-xxxx-xxxx"3. Escribe el bot
// bot.ts: publica una vez como el bot. Ejecútalo con `npx tsx bot.ts`.
import { AtpAgent, RichText } from "@atproto/api";
// La propia cuenta del bot, con sesión iniciada con una contraseña de aplicación
// (Ajustes > Privacidad y seguridad > Contraseñas de aplicación),
// nunca con su contraseña principal.
const identifier = process.env.BLUESKY_HANDLE ?? "";
const password = process.env.BLUESKY_APP_PASSWORD ?? "";
if (!identifier || !password) {
throw new Error("Set BLUESKY_HANDLE and BLUESKY_APP_PASSWORD.");
}
const agent = new AtpAgent({ service: "https://bsky.social" });
await agent.login({ identifier, password });
// RichText encuentra enlaces, menciones y hashtags para hacerlos clicables.
const text = new RichText({
text: "Today: sunny, 21°C. Forecast at https://example.com #weather",
});
await text.detectFacets(agent);
const { uri } = await agent.post({
text: text.text,
facets: text.facets,
createdAt: new Date().toISOString(),
});
console.log(`Posted ${uri}`);Qué hace:
AtpAgenthabla conhttps://bsky.social, el servidor de las cuentas alojadas por Bluesky. Si el bot vive en otro servidor (un PDS propio), usa la URL de ese servidor.loginabre una sesión con el handle y la contraseña de aplicación.RichTextydetectFacetsconvierten el enlace y#weatheren facets clicables: untextnormal los mostraría como caracteres sin más.postcrea el post y devuelve su URIat://.
4. Ejecútalo
npx tsx bot.tsErrores que conviene gestionar
- Límites de uso: Bluesky responde
429cuando una cuenta o un servidor hace demasiado. Espera y vuelve a intentarlo más tarde; consulta las Buenas prácticas. - Credenciales caducadas: una contraseña de aplicación revocada hace que
loginfalle. Crea una nueva. - Posts largos: un post admite 300 caracteres (grafemas). Recorta el texto más largo o publica un hilo.
Siguientes pasos
- Programa posts para que el bot funcione solo.
- Dale un handle de bluesky.bot.
- Más en las plantillas de bots y la guía de posts de Bluesky (en inglés).