Defensas antibot
Cuando un objetivo ejecuta una comprobación de bots en el camino a la página que solicitaste, FourA te avisa. Cada request que encuentra una vuelve con un campo que nombra el sistema, si la comprobación fue superada y (en caso de superarla) la autorización que puedes repetir para que la siguiente llamada la omita.
Esta página es la referencia para esos campos. Para la estrategia, consulta Manejo de protección anti-bots.
Dónde vive el campo
| Endpoint | Campo | Presente cuando |
|---|---|---|
POST /api/single/ |
defense (objeto) |
Se reconoció una comprobación de bots en el response |
POST /api/proxy/ |
defense (objeto) |
Igual, reportado por el intento que respondió |
POST /api/browser/ |
defenseSolved (booleano) y defenses (objeto) |
Se reconoció una comprobación de bots durante la carga de la página |
POST /api/auto/ |
meta.solved (booleano) |
Siempre. true cuando se superó una comprobación en algún lugar de la escalera. |
Su ausencia significa que no se reconoció nada. No interpretes un defense faltante como un fallo.
El reporte necesita unblocker, que está activado por defecto. Con unblocker: false pediste la página exactamente como llegó, así que Single devuelve el desafío intacto y Browser lo renderiza sin resolver.
defense en Single y 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>"
}
}
| Campo | Tipo | Descripción |
|---|---|---|
vendor |
string | El sistema del que trata este registro: el que se resolvió o el principal que se encontró. Consulta la lista de proveedores a continuación. |
solved |
boolean | true significa que la comprobación se resolvió y data es la página real. false significa que data puede ser la página del desafío. |
present |
string[] | Todos los sistemas reconocidos en esta response. Puede contener más nombres que vendor, y puede contener nombres que todavía nadie resuelve. |
ms |
number | Milisegundos empleados en resolver la comprobación. Solo en una resolución. |
hashes |
number | Cuánto trabajo computacional solicitó el desafío. Solo en una resolución. |
complexity |
number | La dificultad que declaró el desafío. Solo en una resolución, y solo donde el desafío informa una. |
answers |
number | Cuántas respuestas aceptadas se suministraron, para desafíos que requieren varias en lugar de una. Solo en una resolución. |
cookie |
string | La autorización que obtuvo la resolución, lista para reproducirse. Solo en una resolución. |
solved: false es el caso en el que vale la pena bifurcar. FourA nunca presenta un desafío sin resolver como contenido, por lo que la bandera es tu señal de que el cuerpo necesita escalarse en lugar de analizarse.
defenses en el navegador
{
"status": 200,
"body": "<!doctype html>...",
"userAgent": "Mozilla/5.0...",
"defenseSolved": true,
"defenses": {
"present": ["cloudflare"],
"cleared": ["cloudflare"]
}
}
| Campo | Tipo | Descripción |
|---|---|---|
defenseSolved |
boolean | true cuando se encontró un sistema durante la carga y su autorización se mantiene en la página final. Esta es la bandera que decide si la llamada cuesta 15 o 30 créditos. |
defenses.present |
string[] | Cada sistema reconocido en cualquier punto durante la carga de la página, no solo en la respuesta final. Una comprobación es algo que sucedió, y para cuando llega la página real, la respuesta al desafío hace tiempo que desapareció. |
defenses.cleared |
string[] | Los sistemas cuya autorización contiene la página final. |
Un nombre en present que nunca llega a cleared es un sistema que FourA puede reconocer pero aún no puede superar. Estos nunca aumentan el precio de una llamada.
Proveedores
Valor de vendor |
El sistema |
|---|---|
cloudflare |
Desafíos de Cloudflare y gestión de bots |
sgcaptcha |
Comprobación de sitio de SiteGround |
datadome |
DataDome |
perimeterx |
PerimeterX |
akamai |
Akamai Bot Manager |
incapsula |
Imperva Incapsula |
awswaf |
Desafío de AWS WAF |
ebay-splashui |
Desafío propio de eBay |
hcaptcha |
hCaptcha |
recaptcha |
reCAPTCHA |
Qué se supera hoy
| Endpoint | Supera |
|---|---|
| Single, Proxy | sgcaptcha, ebay-splashui. Ambos son computacionales en lugar de visuales, por lo que no interviene un navegador. |
| Browser | cloudflare, sgcaptcha |
Todo lo demás en la lista se reconoce e informa, y nada más. Esa división cambia a medida que FourA aprende a superar más de ellos, así que lee solved en lugar de asumir a partir de esta tabla.
Dos notas sobre casos extremos:
hcaptchayrecaptchatambién son widgets de formulario comunes. Solo se informan cuando la respuesta realmente te bloqueó (403, 429 o 503), por lo que una página de pago con un campo CAPTCHA en un formulario no informa de una defensa.- Estar detrás de Cloudflare no es una defensa.
cloudflareaparece cuando hay un desafío real o un artefacto de gestión de bots en la respuesta, no porque un sitio use Cloudflare.
Reproducir una autorización
defense.cookie es el propósito principal del campo. Una autorización está vinculada a la salida que la obtuvo y al User-Agent que la obtuvo, por lo que si la reproduces a través del mismo par, la comprobación no se vuelve a ejecutar.
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"])
La primera llamada asume el costo del desbloqueo. Cada repetición es una request normal al precio normal.
Tres cosas rompen una repetición:
- Una salida diferente. Fija el ID del proxy que devolvió la respuesta de desbloqueo. Consulta Reutilizar un proxy en varias solicitudes.
- Un User-Agent diferente. Las respuestas de Browser devuelven el
userAgentque usaron. Envíalo de vuelta con la cookie. - Caducidad. Los desbloqueos tienen sus propios tiempos de vida, establecidos por el objetivo. El de SiteGround dura alrededor de 30 días para todo el sitio; un desbloqueo de Cloudflare suele ser mucho más corto. Trata un desbloqueo como una caché: cuando las repeticiones empiecen a devolver desafíos de nuevo, ejecuta una nueva llamada y toma el nuevo.
Cuánto cuesta
Un desafío desbloqueado cambia el precio solo en Browser:
| Motor | Base | Defensa desbloqueada |
|---|---|---|
| Single | 1 (2 con unblocker) |
Sin cambios |
| Proxy | 5 (10 con unblocker) |
Sin cambios |
| Browser | 15 | 30 |
Browser cobra 30 solo cuando el solver estaba activado y un sistema fue genuinamente desbloqueado. Un sistema que fue reconocido y no desbloqueado cuesta 15, lo mismo que una página sin ningún desafío.
Combínalo con validate
defense te dice que se encontró un desafío. validate le dice a FourA cómo se ve la página real, que es lo que permite que una request falle en lugar de entregarte un intersticial que casualmente tiene HTTP 200.
{
"method": "GET",
"url": "https://example.com/product/42",
"validate": {
"data": {"accept": ["Add to cart"], "fail": ["Just a moment"]}
}
}
En POST /api/auto/, validate es lo que evita que la escalera acepte una página de desafío y dé el proceso por terminado.
Relacionado
- Manejar la protección contra bots: Qué motor utilizar en cada nivel de protección
- Endpoints de la API: Referencia de request y response para los cuatro endpoints
- Reutilizar un proxy en múltiples requests: Fijar la salida a la que se vincula una autorización
- Smart Fetch (Auto): Cómo encaja
meta.solveden la escalera - Headers de response: Dónde aparece el coste en créditos de una llamada