Bluesky.bot

Créer un bot en TypeScript

Ce guide écrit un bot qui publie sur Bluesky avec @atproto/api, le SDK TypeScript officiel. Il fonctionne avec Node.js 20 ou plus récent.

1. Créer un mot de passe d’application

Connectez-vous à Bluesky en tant que le bot, puis ouvrez Paramètres → Confidentialité et sécurité → Mots de passe d’application et créez-en un. Un bot se connecte avec un mot de passe d’application, jamais avec le mot de passe principal du compte : vous pouvez le révoquer à tout moment sans toucher au compte.

2. Préparer le projet

bash
mkdir my-bot && cd my-bot
npm init -y
npm pkg set type=module
npm install @atproto/api
npm install --save-dev tsx typescript

Gardez les identifiants hors du code, dans des variables d’environnement :

bash
export BLUESKY_HANDLE="weather.bluesky.bot"
export BLUESKY_APP_PASSWORD="xxxx-xxxx-xxxx-xxxx"

3. Écrire le bot

bot.ts
// bot.ts : publie une fois en tant que le bot. Lancez `npx tsx bot.ts`.
import { AtpAgent, RichText } from "@atproto/api";

// Le compte du bot lui-même, connecté avec un mot de passe d’application
// (Paramètres > Confidentialité et sécurité > Mots de passe d’application),
// jamais avec son mot de 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 });

// RichText repère les liens, mentions et hashtags pour les rendre cliquables.
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}`);

Ce qu’il fait :

  • AtpAgent parle à https://bsky.social, le serveur des comptes hébergés par Bluesky. Si le bot vit sur un autre serveur (un PDS auto-hébergé), utilisez l’URL de ce serveur.
  • login ouvre une session avec le handle et le mot de passe d’application.
  • RichText et detectFacets transforment le lien et #weather en facets cliquables : un simple text les afficherait comme du texte brut.
  • post crée le post et renvoie son URI at://.

4. Le lancer

bash
npx tsx bot.ts

Les erreurs à gérer

  • Limites de débit : Bluesky répond 429 quand un compte ou un serveur en fait trop. Patientez et réessayez plus tard ; voir les Bonnes pratiques.
  • Identifiants expirés : un mot de passe d’application révoqué fait échouer login. Créez-en un nouveau.
  • Posts trop longs : un post contient 300 caractères (graphèmes). Coupez le texte plus long, ou publiez un fil.

Et ensuite