XCRAP.CC

Le client Node

Une fine enveloppe typée au-dessus des mêmes endpoints HTTP. Rien de ce qu'il fait n'est impossible avec fetch ; il vous évite juste de réécrire les classes d'erreur, les réessais et la négociation de format.

Installation

npm install @xcrapcc/sdk

Ou, avec ce que vous utilisez vraiment :

  • pnpm add @xcrapcc/sdk
  • yarn add @xcrapcc/sdk
  • bun add @xcrapcc/sdk

Prérequis · Node 18 ou plus récent. Aucune dépendance à l'exécution : il utilise le fetch intégré.

  • Aucune clé, jamais

    Rien à quoi s'inscrire, rien à stocker dans une variable d'environnement, rien à faire tourner quand quelqu'un la commite.

  • Typé de bout en bout

    Des déclarations complètes pour chaque méthode et chaque forme de réponse : un nom de champ erroné devient un soulignement rouge, pas une surprise à l'exécution.

  • Markdown intégré

    Une option transforme n'importe quelle réponse en markdown prêt pour un prompt, avec une estimation de ce que ça coûtera à votre fenêtre de contexte.

Deux lignes pour un post

Aucune clé à passer, aucun client à configurer. On l'instancie et on l'appelle.

import { Xcrap } from '@xcrapcc/sdk';

const xcrap = new Xcrap();

const tweet = await xcrap.tweet('https://x.com/jack/status/20');
console.log(tweet.text);               // just setting up my twttr
console.log(tweet.metrics.likes);      // 308067

Du markdown, avec son coût en tokens

Chaque méthode de lecture accepte une option markdown. La réponse revient sous forme de chaîne prête pour un prompt, et le client note combien de tokens cette chaîne coûtera probablement, pour vérifier un budget avant de le dépenser.

// Markdown, ready to drop into a prompt.
const md = await xcrap.tweet('https://x.com/jack/status/20', { markdown: true });

// How many tokens that will cost, before you spend them.
console.log(xcrap.lastMeta.markdownTokens);

Fils et timelines

Un fil revient déroulé et dans l'ordre, à partir du premier post et non du dernier. Une timeline pagine via les curseurs pour que vous n'ayez pas à les garder.

const thread = await xcrap.thread(
  'https://x.com/naval/status/1002103360646823936',
);

console.log(thread.count);                      // 31
for (const post of thread.tweets) console.log(post.text);

Les erreurs sont des types, pas des codes

Chaque échec est une classe qu'on attrape par son nom. Un 404 est un post supprimé ou privé, un 429 porte le nombre de secondes avant réouverture de la fenêtre, et une panne réseau se distingue d'un refus.

import { Xcrap, XcrapNotFound, XcrapRateLimited } from '@xcrapcc/sdk';

try {
  await xcrap.tweet('https://x.com/jack/status/1');
} catch (error) {
  if (error instanceof XcrapNotFound) return null;
  if (error instanceof XcrapRateLimited) {
    // The client already knows when the window resets.
    await sleep(error.retryAfter * 1000);
  }
  throw error;
}

Toutes les méthodes

Toutes acceptent un format et une option markdown, et toutes renvoient les mêmes formes que l'API HTTP.

tweet(url, opts?)
Un post, entièrement résolu : texte, auteur, compteurs, médias, sondage et post cité éventuel.
thread(url, opts?)
Un fil entier depuis n'importe lequel de ses posts, déroulé dans l'ordre de publication.
search(query, opts?)
Les posts qui correspondent à une requête — récents, populaires, photos ou vidéos — dans une fenêtre de dates facultative.
replies(url, opts?)
Une page des réponses directes à un post, les plus aimées ou les plus récentes d'abord.
user(handle, opts?)
Un profil : bio, compteurs, date d'inscription, vérification, localisation et site web.
userTweets(handle, opts?)
Une page de posts d'un compte, avec le curseur pour la suivante.
userHistory(handle, opts?)
Jusqu'à mille posts d'un compte en un appel, du plus récent au plus ancien, dans une fenêtre de dates facultative.
followers(handle, opts?)
Une page des comptes qui suivent un compte.
following(handle, opts?)
Une page des comptes qu'un compte suit.
trends(opts?)
Ce qui est en tendance, avec le nombre de posts quand X le donne.
media(url, opts?)
Chaque fichier attaché, à tous les débits encodés par X, en liens directs.
downloadMedia(url, opts?)
Renvoie l'un de ces fichiers en flux d'octets plutôt qu'en lien.
bulk(urls, opts?)
Jusqu'à cinquante posts en une requête. Un lien mort ne fait échouer que son entrée.

Chaque paramètre, dans la référence de l'API Il existe aussi un client Python.