Criar um bot em TypeScript
Este guia escreve um bot que publica no Bluesky com
@atproto/api, o SDK oficial
de TypeScript. Funciona com Node.js 20 ou superior.
1. Criar uma palavra-passe de aplicação
Entre no Bluesky como o bot, abra Definições → Privacidade e segurança → Palavras-passe de aplicação e crie uma. Um bot entra com uma palavra-passe de aplicação, nunca com a palavra-passe principal da conta: pode revogá-la a qualquer momento sem mexer na conta.
2. Preparar o projeto
mkdir my-bot && cd my-bot
npm init -y
npm pkg set type=module
npm install @atproto/api
npm install --save-dev tsx typescriptMantenha as credenciais fora do código, em variáveis de ambiente:
export BLUESKY_HANDLE="weather.bluesky.bot"
export BLUESKY_APP_PASSWORD="xxxx-xxxx-xxxx-xxxx"3. Escrever o bot
// bot.ts: publica uma vez como o bot. Execute com `npx tsx bot.ts`.
import { AtpAgent, RichText } from "@atproto/api";
// A própria conta do bot, com sessão iniciada com uma palavra-passe de aplicação
// (Definições > Privacidade e segurança > Palavras-passe de aplicação),
// nunca com a palavra-passe 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 });
// O RichText encontra ligações, menções e hashtags para as tornar clicáveis.
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}`);O que faz:
AtpAgentfala comhttps://bsky.social, o servidor das contas alojadas pelo Bluesky. Se o bot estiver noutro servidor (um PDS próprio), use o URL desse servidor.loginabre uma sessão com o handle e a palavra-passe de aplicação.RichTextedetectFacetstransformam a ligação e#weatherem facets clicáveis: umtextsimples mostrá-los-ia como caracteres normais.postcria a publicação e devolve o seu URIat://.
4. Executá-lo
npx tsx bot.tsErros que vale a pena tratar
- Limites de utilização: o Bluesky responde
429quando uma conta ou um servidor faz demasiado. Espere e tente mais tarde; veja as Boas práticas. - Credenciais expiradas: uma palavra-passe de aplicação revogada faz
falhar o
login. Crie uma nova. - Publicações longas: uma publicação leva 300 caracteres (grafemas). Corte o texto mais longo, ou publique uma sequência.
A seguir
- Agende publicações para o bot funcionar sozinho.
- Dê-lhe um handle bluesky.bot.
- Mais nos modelos de bots e no guia de publicações do próprio Bluesky (em inglês).