Défenses anti-bots

Lorsqu'une cible exécute une vérification de bot en chemin vers la page que vous avez demandée, FourA vous en informe. Chaque request qui en rencontre une revient avec un champ nommant le système, indiquant si la vérification a été passée, et (en cas de succès) l'autorisation que vous pouvez rejouer pour que le prochain appel l'ignore.

Cette page est la référence pour ces champs. Pour la stratégie, voir Gestion de la protection anti-bot.

Où se trouve le champ

Endpoint Champ Présent lorsque
POST /api/single/ defense (objet) Une vérification de bot a été reconnue sur la response
POST /api/proxy/ defense (objet) Idem, signalé par la tentative qui a répondu
POST /api/browser/ defenseSolved (booléen) et defenses (objet) Une vérification de bot a été reconnue pendant le chargement de la page
POST /api/auto/ meta.solved (booléen) Toujours. true lorsqu'une vérification a été passée quelque part dans la chaîne.

L'absence signifie que rien n'a été reconnu. Ne lisez pas un defense manquant comme un échec.

Le signalement nécessite unblocker, qui est activé par défaut. Avec unblocker: false, vous avez demandé la page exactement comme elle est venue, donc Single renvoie le défi intact et Browser le rend sans le résoudre.

defense sur Single et Proxy

{
  "status": 200,
  "data": "<!doctype html>...",
  "total_time": 3.61,
  "defense": {
    "vendor": "sgcaptcha",
    "solved": true,
    "present": ["sgcaptcha"],
    "ms": 3412,
    "hashes": 1048576,
    "complexity": 20,
    "cookie": "_I_=<clearance>"
  }
}
Champ Type Description
vendor string Le système concerné par cet enregistrement : celui qui a été résolu, ou le principal rencontré. Voir la liste des fournisseurs ci-dessous.
solved boolean true signifie que la vérification a été résolue et que data est la page réelle. false signifie que data peut être la page du défi.
present string[] Chaque système reconnu sur cette response. Peut contenir plus de noms que vendor, et peut contenir des noms que personne ne résout encore.
ms number Millisecondes passées à résoudre la vérification. Uniquement lors d'une résolution.
hashes number La quantité de travail de calcul demandée par le défi. Uniquement lors d'une résolution.
complexity number La difficulté déclarée par le défi. Uniquement lors d'une résolution, et seulement si le défi en signale une.
answers number Le nombre de réponses acceptées fournies, pour les défis qui en requièrent plusieurs plutôt qu'une seule. Uniquement lors d'une résolution.
cookie string L'autorisation obtenue par la résolution, prête à être rejouée. Uniquement lors d'une résolution.

solved: false est le cas justifiant un branchement conditionnel. FourA ne présente jamais un défi non résolu comme contenu, cet indicateur est donc votre signal que le body nécessite une escalade plutôt qu'une analyse.

defenses sur le navigateur

{
  "status": 200,
  "body": "<!doctype html>...",
  "userAgent": "Mozilla/5.0...",
  "defenseSolved": true,
  "defenses": {
    "present": ["cloudflare"],
    "cleared": ["cloudflare"]
  }
}
Champ Type Description
defenseSolved boolean true lorsqu'un système a été rencontré lors du chargement et que sa validation est conservée sur la page finale. Il s'agit de l'indicateur qui détermine si l'appel coûte 15 ou 30 crédits.
defenses.present string[] Tous les systèmes reconnus à tout moment lors du chargement de la page, pas seulement sur la réponse finale. Une vérification est un événement passé, et au moment où la vraie page arrive, la réponse au défi a disparu depuis longtemps.
defenses.cleared string[] Les systèmes dont la page finale contient la validation.

Un nom dans present qui n'atteint jamais cleared est un système que FourA peut reconnaître mais pas encore franchir. Ceux-ci n'augmentent jamais le prix d'un appel.

Fournisseurs

Valeur de vendor Le système
cloudflare Défis Cloudflare et gestion des bots
sgcaptcha Vérification de site de SiteGround
datadome DataDome
perimeterx PerimeterX
akamai Akamai Bot Manager
incapsula Imperva Incapsula
awswaf Défi AWS WAF
ebay-splashui Défi propre à eBay
hcaptcha hCaptcha
recaptcha reCAPTCHA

Ce qui est validé aujourd'hui

Endpoint Valide
Single, Proxy sgcaptcha, ebay-splashui. Les deux sont calculatoires plutôt que visuels, donc aucun navigateur n'est impliqué.
Browser cloudflare, sgcaptcha

Tout le reste de la liste est reconnu et signalé, sans plus. Cette répartition évolue à mesure que FourA apprend à en franchir davantage, lisez donc solved au lieu de faire des suppositions à partir de ce tableau.

Deux remarques sur les cas particuliers :

  • hcaptcha et recaptcha sont également des widgets de formulaire ordinaires. Ils ne sont signalés que lorsque la réponse vous a réellement bloqué (403, 429 ou 503), de sorte qu'une page de paiement avec un champ CAPTCHA dans un formulaire ne signale pas de défense.
  • Être derrière Cloudflare n'est pas une défense. cloudflare apparaît lorsqu'il y a un véritable défi ou un artefact de gestion de bots sur la réponse, et non parce qu'un site utilise Cloudflare.

Rejouer une validation

defense.cookie est tout l'intérêt du champ. Une validation est liée à la sortie qui l'a obtenue et au User-Agent qui l'a obtenue, donc rejouez-la via la même paire et la vérification ne s'exécutera pas à nouveau.

import requests

API = "https://eu.api.foura.ai"
H = {"X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json"}

# 1) First call pays for the clear.
first = requests.post(f"{API}/api/proxy/", headers=H, json={
    "maxTries": 5,
    "request": {"method": "GET", "url": "https://example.com/catalog"},
}).json()

defense = first.get("defense", {})
if defense.get("solved"):
    clearance = defense["cookie"]
    exit_id = first["proxy"]

    # 2) Follow-up pages skip the check: same exit, same clearance.
    for page in range(2, 6):
        r = requests.post(f"{API}/api/single/", headers=H, json={
            "method": "GET",
            "url": f"https://example.com/catalog?page={page}",
            "proxy": exit_id,
            "headers": [["Cookie", clearance]],
        }).json()
        print(page, r["status"])

Le premier appel supporte le coût du déblocage. Chaque rejeu est une request ordinaire au prix ordinaire.

Trois choses cassent un rejeu :

  1. Une sortie différente. Épinglez l'ID du proxy que la response de déblocage a renvoyé. Voir Réutiliser un proxy entre les requests.
  2. Un User-Agent différent. Les responses du navigateur renvoient le userAgent qu'ils ont utilisé. Renvoyez-le avec le cookie.
  3. Expiration. Les déblocages ont leur propre durée de vie, définie par la cible. Celle de SiteGround dure environ 30 jours pour tout le site, un déblocage Cloudflare est généralement beaucoup plus court. Traitez un déblocage comme un cache : lorsque les rejeux commencent à renvoyer de nouveaux défis, exécutez un nouvel appel et prenez le nouveau.

Ce que cela coûte

Une vérification débloquée modifie le prix sur le navigateur uniquement :

Moteur Base Défense débloquée
Unique 1 (2 avec unblocker) Aucun changement
Proxy 5 (10 avec unblocker) Aucun changement
Navigateur 15 30

Le navigateur facture 30 uniquement lorsque le solveur était activé et qu'un système a été véritablement débloqué. Un système qui a été reconnu et non débloqué coûte 15, soit la même chose qu'une page sans aucune vérification.

Associez-le avec validate

defense vous indique qu'une vérification a été rencontrée. validate indique à FourA à quoi ressemble la vraie page, ce qui permet à une request d'échouer plutôt que de vous donner une page interstitielle qui porte par hasard le code HTTP 200.

{
  "method": "GET",
  "url": "https://example.com/product/42",
  "validate": {
    "data": {"accept": ["Add to cart"], "fail": ["Just a moment"]}
  }
}

Sur POST /api/auto/, validate est ce qui empêche l'échelle d'accepter une page de défi et de la considérer comme terminée.

Articles liés

Mis à jour : 12 août 2026