Tutorials

Résoudre les CAPTCHA avec Sidekiq en Ruby

Périmètre sûr : Ce guide vise vos propres applications et vos environnements de QA, préproduction ou production, ou des systèmes pour lesquels vous détenez une autorisation écrite. Il ne décrit ni l'automatisation de sites tiers, ni le contournement de protections, ni l'évasion d'anti-bot.

Sidekiq traite vos jobs Ruby en arrière-plan, et c'est là que la résolution de CAPTCHA doit vivre : dans le worker, jamais dans le thread web qui répond à l'utilisateur. Placez l'appel à CaptchaAI dans un job Sidekiq, mesurez sa durée, et laissez la file absorber les pics. Ce guide le structure pour qu'il tienne en production, pas seulement au premier essai.

Pourquoi confier la résolution à un worker Sidekiq

Un appel de résolution prend plusieurs secondes : le laisser dans une requête HTTP synchrone bloque un thread web et alourdit vos temps de réponse. Un worker Sidekiq isole cette latence, offre des retries natifs et rend chaque solve observable — sur reCAPTCHA v2 et v3, Cloudflare Turnstile ou GeeTest v3, via une seule API facturée au thread.

Préparer l'environnement et la clé API

Avant d'écrire le worker, vérifiez trois points : l'environnement de QA est isolé de la production, la clé CaptchaAI vit dans un secret CI ou un coffre (Rails credentials, Vault) plutôt qu'en dur dans le dépôt, et Redis — le backend de Sidekiq — est joignable depuis le worker.

Encapsuler l'appel dans un job réutilisable

Isolez l'appel à CaptchaAI dans une fonction unique qui prend la sitekey et l'URL de votre propre page et renvoie un token. Le worker n'a plus qu'à l'invoquer. L'exemple ci-dessous, en Node.js, illustre le contrat createTask ; la même logique se transpose dans un worker Ruby.

import fetch from 'node-fetch';

const API_KEY = process.env.CAPTCHAAI_KEY;

export async function createTurnstileTask(siteKey, pageUrl) {
  const res = await fetch('https://api.captchaai.com/createTask', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      clientKey: API_KEY,
      task: {
        type: 'TurnstileTaskProxyless',
        websiteURL: pageUrl,
        websiteKey: siteKey,
      },
    }),
  });
  const data = await res.json();
  return data.taskId;
}

Dans la méthode perform, appelez cette abstraction, attendez le token, puis poursuivez le flux métier. Gardez le job idempotent : rejoué par Sidekiq, il ne doit ni double-facturer ni corrompre l'état.

Vérifier le token côté backend

Le token renvoyé doit être validé par votre backend avant toute opération métier. Appliquez-le dans la session qui a déclenché le défi — mêmes cookies : une session dépareillée est la première cause de rejet après résolution.

Aligner la concurrence Sidekiq sur vos threads CaptchaAI

CaptchaAI facture au thread concurrent, pas au solve : BASIC ($15/mois, 5 threads) autorise cinq résolutions simultanées, STANDARD ($30/mois, 15 threads) en autorise quinze. Réglez la concurrence de votre file de solve sur ce plafond ; au-delà, les jobs excédentaires attendent sans gain de débit. Hébergés chez OVHcloud ou Scaleway (eu-west-3, Paris), vos workers dédient une file Sidekiq à la résolution, plafonnée au forfait.

Signaux à instrumenter

Instrumentez chaque appel et corrélez les journaux à votre traçage distribué (OpenTelemetry). Côté RGPD, un identifiant de tâche et un horodatage suffisent au diagnostic, sans consigner le contenu des formulaires.

Signal Ce qu'il révèle
Durée d'obtention du token La latence réelle du solve, hors retries
Code retour HTTP Les erreurs API à corréler à vos alertes
Taux d'acceptation en aval Le token est validé dans la bonne session
Taille de la file Sidekiq La saturation face à votre allocation de threads

Dépannage des incidents fréquents

Symptôme Cause probable Correctif
ERROR_ZERO_BALANCE Solde sous le minimum par tâche Rechargez et ajoutez une alerte de solde
Token refusé après le solve Session dépareillée Rejouez le solve dans la session d'origine
Jobs qui s'empilent Concurrence supérieure au nombre de threads Alignez la file sur le plafond du forfait

FAQ

Comment appeler CaptchaAI depuis un worker Sidekiq ?

Placez l'abstraction dans la méthode perform : le job soumet la tâche, attend le token, puis le transmet à l'étape suivante. Gardez la méthode courte et idempotente pour qu'un rejeu ne relance aucun effet de bord.

Faut-il aligner la concurrence Sidekiq sur le nombre de threads ?

Oui, pour la file dédiée à la résolution. Régler la concurrence au-dessus de votre allocation de threads ne fait qu'empiler les jobs en attente. Dimensionnez-la sur le plafond du forfait et isolez-la des autres files.

Comment gérer les retries automatiques de Sidekiq ?

Sidekiq réessaie les jobs échoués par défaut ; bornez ce comportement pour les erreurs transitoires : trois tentatives, backoff exponentiel plafonné à 30 secondes. Pour une erreur définitive (clé invalide, solde nul), échouez vite.

Comment rester conforme au RGPD dans les journaux ?

Minimisez les données personnelles collectées : journalisez l'identifiant de tâche, la durée et le code retour, pas le contenu des champs. Fixez une durée de rétention et vérifiez vos obligations RGPD.

Guides connexes

Structurez vos workers CAPTCHA de façon méthodique et reproductible. – Obtenez votre clé CaptchaAI.

Les commentaires sont désactivés pour cet article.