Verificações do site
Quando um destino executa uma verificação de bot no caminho para a página solicitada, o FourA avisa você. Cada request que encontra uma verificação retorna com um campo indicando o sistema, se a verificação foi superada e (em caso de sucesso) a autorização de clearance que você pode reutilizar para que a próxima chamada a ignore.
Esta página é a referência para esses campos. Para estratégia, consulte Protected sites.
Onde o campo fica
| Endpoint | Field | Present when |
|---|---|---|
POST /api/single/ |
defense (object) |
Uma verificação de bot foi reconhecida na resposta |
POST /api/proxy/ |
defense (object) |
O mesmo, reportado pela tentativa que respondeu |
POST /api/browser/ |
defenseSolved (boolean) e defenses (object) |
Sempre, em uma página que carregou. defenseSolved é false e defenses fica vazio quando nada foi reconhecido. |
POST /api/auto/ |
meta.solved (boolean) |
Em todas as respostas assim que o ladder iniciar. true quando uma verificação for superada em algum ponto do ladder. Um corpo que falha na validação ou um host que não resolve é respondido antes do ladder, sem meta. |
A ausência significa que nada foi reconhecido. Não interprete a falta de defense como uma falha.
No Single e Proxy, o relatório precisa de unblocker, que está ativado por padrão. Com unblocker: false você solicitou a página exatamente como ela veio, portanto o Single entrega o challenge intacto e o Browser o renderiza sem resolver.
defense no Single e 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 | Descrição |
|---|---|---|
vendor |
string | O sistema a que este registro se refere: aquele que foi superado ou o principal encontrado. Veja a lista de fornecedores abaixo. |
solved |
boolean | true significa que a verificação foi superada e data é a página real. false significa que data pode ser a página de desafio. |
present |
string[] | Todos os sistemas reconhecidos nesta resposta. Pode conter mais nomes do que vendor e pode conter nomes que ninguém supera ainda. |
ms |
number | Milissegundos gastos para superar a verificação. Apenas em caso de sucesso. |
hashes |
number | Quanto trabalho computacional o desafio exigiu. Apenas em caso de sucesso. |
complexity |
number | A dificuldade declarada pelo desafio. Apenas em caso de sucesso e onde o desafio informar uma. |
answers |
number | Quantas respostas aceitas foram fornecidas, para desafios que exigem várias em vez de uma. Apenas em caso de sucesso. |
retry |
string | Presente quando o corpo veio de uma nova tentativa em vez de uma liberação direta. Hoje, o único valor é refusal-cookies. Veja abaixo. |
cookie |
string | O jar a ser reutilizado: a autorização obtida em um sucesso ou a sessão fornecida em uma recusa. |
solved: false é o caso que vale a pena tratar em ramificações. O FourA nunca apresenta uma página de desafio como conteúdo, portanto a flag é o seu sinal de que o corpo precisa de escalonamento em vez de análise.
retry: "refusal-cookies"
Alguns sites não executam um quebra-cabeça. Eles recusam a primeira request, definem cookies na recusa e entregam a página real a qualquer um que reenviar esses cookies. As páginas de itens do eBay são o caso de referência.
Quando isso acontece, o FourA os reenvia para você e entrega a página. A response então inclui retry: "refusal-cookies":
{
"status": 200,
"data": "<!doctype html>...",
"defense": {
"vendor": "akamai",
"solved": false,
"present": ["akamai"],
"retry": "refusal-cookies",
"cookie": "bm_sv=...; dp1=..."
}
}
Leia da seguinte forma:
solvedpermanecefalse. Responder a um handshake não é liberar um challenge e nunca altera o custo da chamada. Você é cobrado pela request feita.dataé conteúdo real, não uma página de challenge. Este é o único caso em quesolved: falsenão significa que o body precisa de escalonamento, e é por isso que o campo existe.cookieé a sessão fornecida pelo site. Faça o replay da mesma forma que faria o replay de uma liberação e as páginas seguintes ignoram a recusa.- Um retry e um clear podem acontecer na mesma request. Se a resposta do retry acabou sendo um challenge que a FourA consegue liberar, você recebe
solved: truecom os campos do próprio fornecedor eretry: "refusal-cookies"ao lado deles.
vendor exibe unknown quando um retry gerou o conteúdo e nenhum sistema foi reconhecido no caminho. present será então um array vazio.
defenses no Browser
{
"status": 200,
"body": "<!doctype html>...",
"userAgent": "Mozilla/5.0...",
"defenseSolved": true,
"defenses": {
"present": ["cloudflare"],
"cleared": ["cloudflare"]
}
}
| Campo | Tipo | Descrição |
|---|---|---|
defenseSolved |
boolean | true quando um sistema foi encontrado durante o carregamento e sua liberação é mantida na página final. Esta é a flag que decide se a chamada custa 5 ou 10 créditos. |
defenses.present |
string[] | Todos os sistemas reconhecidos em qualquer momento durante o carregamento da página, não apenas na resposta final. Uma verificação é algo que aconteceu, e no momento em que a página real chega, a resposta do desafio já passou há muito tempo. |
defenses.cleared |
string[] | Os sistemas cuja liberação a página final mantém. |
Um nome em present que nunca chega a cleared é um sistema que o FourA consegue reconhecer, mas ainda não consegue concluir. Esses nunca aumentam o preço de uma chamada.
Fornecedores
Valor de vendor |
O sistema |
|---|---|
cloudflare |
Desafios e gerenciamento de bots da Cloudflare |
sgcaptcha |
Verificação de site do SiteGround |
datadome |
DataDome |
perimeterx |
PerimeterX |
akamai |
Akamai Bot Manager |
incapsula |
Imperva Incapsula |
awswaf |
Desafio do AWS WAF |
ebay-splashui |
Desafio próprio do eBay |
reddit |
Páginas próprias de verificação e recusa do Reddit |
amazon |
Verificação de robôs da Amazon |
google |
Verificação de JavaScript da Pesquisa Google |
hcaptcha |
hCaptcha |
recaptcha |
reCAPTCHA |
unknown |
Nenhum sistema foi reconhecido. Aparece apenas junto de retry, onde o registro existe para relatar a nova tentativa em vez de um fornecedor. |
O Que É Liberado Hoje
| Endpoint | Liberações |
|---|---|
| Single, Proxy | sgcaptcha, ebay-splashui. Ambos são computacionais e não visuais, portanto nenhum navegador é envolvido. |
| Browser | cloudflare, sgcaptcha |
Todo o resto na lista é apenas reconhecido e relatado, nada mais. Essa divisão muda conforme o FourA aprende a liberar mais deles, então leia solved em vez de assumir a partir desta tabela.
Duas observações sobre casos específicos:
hcaptchaerecaptchatambém são widgets normais de formulário. Eles só são relatados quando a resposta realmente bloqueou você (403, 429 ou 503), portanto uma página de checkout com um widget de verificação em um formulário não relata uma defesa.- Estar atrás da Cloudflare não é uma defesa.
cloudflareaparece quando há um desafio real ou artefato de gerenciamento de bots na resposta, não apenas porque um site usa Cloudflare.
Reproduzindo uma Liberação
defense.cookie é o objetivo principal do campo. Uma liberação é vinculada à saída que a obteve e ao User-Agent que a obteve, portanto reproduza-a pelo mesmo par e a verificação não será executada novamente.
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"])
A primeira chamada arca com o custo da liberação. Cada repetição é uma request comum pelo preço comum.
Três coisas invalidam uma repetição:
- Uma saída diferente. Fixe o ID do proxy retornado pela response de liberação. Veja Reutilizar um Proxy Entre Requests.
- Um User-Agent diferente. As responses do Browser retornam o
userAgentutilizado. Envie-o de volta com o cookie. - Expiração. As liberações têm tempos de vida próprios, definidos pelo destino. A do SiteGround dura cerca de 30 dias para o site inteiro; uma liberação da Cloudflare costuma ser muito mais curta. Trate uma liberação como cache: quando as repetições começarem a retornar desafios novamente, execute uma nova chamada e obtenha a nova liberação.
Quanto custa
Uma verificação liberada altera o preço apenas no Browser:
| Engine | Base | Defesa liberada |
|---|---|---|
| Single | 1 (2 com unblocker) |
Sem alteração |
| Proxy | 2 (4 com unblocker) |
Sem alteração |
| Browser | 5 | 10 |
O Browser cobra 10 apenas quando o solver estava ativo e um sistema foi realmente liberado. Um sistema que foi reconhecido e não liberado custa 5, o mesmo que uma página sem nenhuma verificação.
Uma página de verificação reconhecida pelo FourA retornada com HTTP 200 (por exemplo, a verificação de robôs da Amazon, a página de verificação do Reddit ou a verificação de JavaScript da Busca do Google) não é cobrada em nenhum endpoint; a response a identifica em X-FourA-Check-Page.
Combine com validate
defense informa que uma verificação foi encontrada. validate informa ao FourA como é a página real, permitindo que uma request falhe em vez de entregar um interstitial que por acaso retorne HTTP 200.
{
"method": "GET",
"url": "https://example.com/product/42",
"validate": {
"data": {"accept": ["Add to cart"], "fail": ["Just a moment"]}
}
}
No POST /api/auto/, o validate é o que impede a sequência de aceitar uma página de desafio e considerá-la concluída.
Relacionados
- Sites protegidos: Qual engine utilizar em cada nível de proteção
- Endpoints da API: Referência de request e response para todos os quatro endpoints
- Reutilizar um Proxy Entre Requests: Fixe a saída à qual uma liberação está vinculada
- Smart Fetch (Auto): Como o
meta.solvedse encaixa na sequência - Response Headers: Onde o custo em créditos de uma chamada é exibido