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 :
hcaptchaetrecaptchasont é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.
cloudflareapparaî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 :
- 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.
- Un User-Agent différent. Les responses du navigateur renvoient le
userAgentqu'ils ont utilisé. Renvoyez-le avec le cookie. - 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
- Gérer la protection anti-bot: Quel moteur utiliser à chaque niveau de protection
- Endpoints de l'API: Référence des requêtes et réponses pour les quatre endpoints
- Réutiliser un proxy sur plusieurs requêtes: Fixer la sortie à laquelle une autorisation est liée
- Smart Fetch (Auto): Comment
meta.solveds'intègre dans l'échelle - Headers de réponse: Où s'affiche le coût en crédits d'un appel