사이트 검사
요청한 페이지로 가는 도중 대상 사이트가 봇 탐지를 실행하면 FourA가 이를 알려줍니다. 탐지를 마주친 모든 request는 탐지 시스템의 이름, 검증 통과 여부, 그리고 (통과 시) 다음 호출에서 이를 건너뛸 수 있도록 재사용 가능한 clearance 정보를 포함한 필드를 반환합니다.
이 페이지는 해당 필드들에 대한 레퍼런스입니다. 전략에 대한 자세한 내용은 보호된 사이트를 참고하세요.
필드 위치
| Endpoint | Field | Present when |
|---|---|---|
POST /api/single/ |
defense (object) |
response에서 봇 탐지가 감지되었을 때 |
POST /api/proxy/ |
defense (object) |
동일함, 응답한 시도(attempt)에서 보고됨 |
POST /api/browser/ |
defenseSolved (boolean) 및 defenses (object) |
항상 포함됨 (로드가 완료된 페이지 기준). 감지된 항목이 없으면 defenseSolved은 false이고 defenses는 비어 있습니다. |
POST /api/auto/ |
meta.solved (boolean) |
ladder가 시작된 후의 모든 응답에 포함됨. ladder 어딘가에서 검증이 통과되면 true입니다. 유효성 검사에 실패한 body나 확인되지 않는 host는 ladder 시작 전에 응답되므로 meta가 포함되지 않습니다. |
필드가 없다는 것은 감지된 항목이 없음을 의미합니다. 누락된 defense을 실패로 해석하지 마세요.
Single 및 Proxy에서 보고 기능을 사용하려면 기본적으로 활성화되어 있는 unblocker가 필요합니다. unblocker: false를 설정하면 수신된 그대로의 페이지를 요청한 것이므로, Single은 챌린지를 변경 없이 그대로 반환하고 Browser는 문제를 해결하지 않은 채 렌더링합니다.
Single 및 Proxy에서의 defense
{
"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>"
}
}
| 필드 | 타입 | 설명 |
|---|---|---|
vendor |
string | 이 레코드가 다루는 시스템입니다. 통과된 시스템이거나 감지된 주요 시스템입니다. 아래 벤더 목록을 참조하십시오. |
solved |
boolean | true는 확인을 통과했으며 data가 실제 페이지임을 의미합니다. false는 data가 챌린지 페이지일 수 있음을 나타냅니다. |
present |
string[] | 이 response에서 인식된 모든 시스템입니다. vendor보다 더 많은 이름을 포함할 수 있으며, 아직 아무도 통과하지 못한 이름도 포함될 수 있습니다. |
ms |
number | 확인을 통과하는 데 소요된 시간(밀리초)입니다. 통과 시에만 제공됩니다. |
hashes |
number | 챌린지에서 요구한 연산 작업량입니다. 통과 시에만 제공됩니다. |
complexity |
number | 챌린지가 명시한 난이도입니다. 통과 시 및 챌린지가 난이도를 보고하는 경우에만 제공됩니다. |
answers |
number | 단일 답변 대신 여러 답변을 요구하는 챌린지의 경우 제공된 승인 답변 수입니다. 통과 시에만 제공됩니다. |
retry |
string | 통과가 아닌 재시도에서 body가 반환되었을 때 존재합니다. 현재 유일한 값은 refusal-cookies입니다. 아래를 참조하십시오. |
cookie |
string | 재생(replay)할 jar입니다. 통과를 통해 획득한 clearance이거나 거부 시 발급된 세션입니다. |
solved: false는 분기 처리를 고려해야 하는 케이스입니다. FourA는 챌린지 페이지를 절대 콘텐츠로 제공하지 않으므로, 이 플래그는 body를 파싱하는 대신 에스컬레이션해야 한다는 신호입니다.
retry: "refusal-cookies"
일부 사이트는 퍼즐을 실행하지 않습니다. 첫 번째 request를 거부하고, 거부 response에 cookie를 설정한 다음, 해당 cookie를 다시 보내는 사용자에게 실제 페이지를 제공합니다. eBay의 아이템 페이지가 대표적인 사례입니다.
이러한 경우 FourA가 대신 cookie를 다시 전송하여 페이지를 전달합니다. 이때 response에는 retry: "refusal-cookies"가 포함됩니다.
{
"status": 200,
"data": "<!doctype html>...",
"defense": {
"vendor": "akamai",
"solved": false,
"present": ["akamai"],
"retry": "refusal-cookies",
"cookie": "bm_sv=...; dp1=..."
}
}
다음과 같이 해석합니다:
solved상태는false(으)로 유지됩니다. 핸드셰이크에 응답하는 것은 챌린지를 통과하는 것이 아니며, 호출 비용은 변경되지 않습니다. 사용자가 전송한 request 기준으로 요금이 청구됩니다.data은(는) 실제 콘텐츠이며 챌린지 페이지가 아닙니다. 이는solved: false이(가) body 단계 에스컬레이션을 필요로 하지 않는 유일한 경우이며, 이 필드가 존재하는 이유이기도 합니다.cookie은(는) 사이트에서 발급한 세션입니다. clearance를 재사용하는 것과 같은 방식으로 재생하면 후속 페이지에서 거부를 건너뛸 수 있습니다.- 단일 request에서 재시도와 clear가 모두 발생할 수 있습니다. 재시도 응답이 FourA에서 통과 가능한 챌린지로 판명되면 벤더 자체 필드가 포함된
solved: true및 그 옆에retry: "refusal-cookies"이(가) 반환됩니다.
재시도를 통해 콘텐츠가 생성되었고 그 과정에서 인식된 시스템이 없는 경우 vendor은(는) unknown(으)로 표시됩니다. 이 경우 present은(는) 빈 배열이 됩니다.
Browser에서의 defenses
{
"status": 200,
"body": "<!doctype html>...",
"userAgent": "Mozilla/5.0...",
"defenseSolved": true,
"defenses": {
"present": ["cloudflare"],
"cleared": ["cloudflare"]
}
}
| 필드 | 타입 | 설명 |
|---|---|---|
defenseSolved |
boolean | 로드 중에 시스템이 감지되었고 최종 페이지에서 해당 통과 권한(clearance)이 유지될 때 true입니다. 호출 비용이 5크레딧인지 10크레딧인지 결정하는 플래그입니다. |
defenses.present |
string[] | 최종 응답뿐만 아니라 페이지 로드 중 어느 시점에서든 감지된 모든 시스템입니다. 확인은 이미 발생한 동작이며, 실제 페이지가 도착할 때쯤에는 챌린지 응답이 사라진 지 오래입니다. |
defenses.cleared |
string[] | 최종 페이지에 통과 권한이 유지된 시스템입니다. |
present에는 있지만 cleared에 도달하지 않는 이름은 FourA가 인식할 수는 있지만 아직 통과 처리를 완료할 수 없는 시스템입니다. 이러한 시스템은 호출 비용을 증가시키지 않습니다.
벤더
vendor 값 |
시스템 |
|---|---|
cloudflare |
Cloudflare 챌린지 및 봇 관리 |
sgcaptcha |
SiteGround 사이트 검사 |
datadome |
DataDome |
perimeterx |
PerimeterX |
akamai |
Akamai Bot Manager |
incapsula |
Imperva Incapsula |
awswaf |
AWS WAF 챌린지 |
ebay-splashui |
eBay 자체 챌린지 |
reddit |
Reddit 자체 검사 및 거부 페이지 |
amazon |
Amazon 로봇 검사 |
google |
Google 검색 JavaScript 검사 |
hcaptcha |
hCaptcha |
recaptcha |
reCAPTCHA |
unknown |
인식된 시스템이 없습니다. 벤더가 아닌 재시도 보고를 위해 레코드가 존재하는 retry와 함께만 나타납니다. |
현재 통과 지원 대상
| 엔드포인트 | 통과 지원 |
|---|---|
| Single, Proxy | sgcaptcha, ebay-splashui. 시각적 방식이 아닌 연산 방식이므로 브라우저가 관여하지 않습니다. |
| Browser | cloudflare, sgcaptcha |
목록의 다른 모든 항목은 인식 및 보고만 수행됩니다. FourA가 더 많은 시스템의 통과를 처리할 수 있게 됨에 따라 이 분류는 변경되므로, 이 표를 기반으로 추정하지 말고 solved를 확인하세요.
특이 사항 두 가지:
hcaptcha및recaptcha는 일반적인 폼 위젯이기도 합니다. 응답이 실제로 차단된 경우(403, 429 또는 503)에만 보고되므로, 폼에 인증 위젯이 포함된 체크아웃 페이지는 방어 시스템으로 보고되지 않습니다.- Cloudflare 뒤에 있다는 것 자체가 방어 시스템은 아닙니다.
cloudflare는 사이트가 Cloudflare를 사용하기 때문이 아니라 응답에 실제 챌린지나 봇 관리 아티팩트가 있을 때 나타납니다.
통과 권한 재생(Replaying)
defense.cookie가 이 필드의 핵심 목적입니다. 통과 권한은 이를 획득한 출구 및 User-Agent에 바인딩되므로, 동일한 쌍을 통해 재생하면 검사가 다시 실행되지 않습니다.
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"])
첫 번째 호출에는 우회 비용이 부과됩니다. 이후의 모든 재생(replay)은 일반 요금이 적용되는 일반 request입니다.
재생을 실패하게 만드는 세 가지 요인은 다음과 같습니다.
- 다른 출구 IP 사용. 우회 response가 반환한 proxy ID를 고정하십시오. Reuse a Proxy Across Requests를 참조하십시오.
- 다른 User-Agent 사용. Browser response는 사용된
userAgent를 반환합니다. 이를 cookie와 함께 다시 전송하십시오. - 만료. 우회 세션에는 타깃 사이트가 설정한 자체 유효 기간이 있습니다. SiteGround는 사이트 전체에 대해 약 30일 동안 유지되며, Cloudflare 우회는 대개 훨씬 짧습니다. 우회 정보를 캐시처럼 취급하십시오. 재생 시 다시 챌린지가 반환되기 시작하면 새 호출을 한 번 실행하여 새 정보를 가져오십시오.
요금 안내
보안 검사를 우회해도 Browser 요금만 변경됩니다.
| Engine | Base | Cleared defense |
|---|---|---|
| Single | 1 (unblocker 사용 시 2) |
변경 없음 |
| Proxy | 2 (unblocker 사용 시 4) |
변경 없음 |
| Browser | 5 | 10 |
Browser는 해결기(solver)가 켜져 있고 보안 시스템을 실제로 우회한 경우에만 10을 청구합니다. 인식되었으나 우회되지 않은 시스템은 검사가 전혀 없는 페이지와 동일하게 5가 청구됩니다.
FourA가 인식한 검사 페이지가 HTTP 200으로 제공되는 경우(예: Amazon의 로봇 검사, Reddit의 인증 페이지, Google Search의 JavaScript 검사), 어떤 endpoint에서도 비용이 청구되지 않으며 response의 X-FourA-Check-Page에 해당 내용이 명시됩니다.
validate와 함께 사용
defense은 검사가 발생했음을 알려줍니다. validate는 FourA에 실제 페이지가 어떤 형태인지 알려주어, HTTP 200을 반환하는 중간 페이지(interstitial)를 그대로 전달하는 대신 request를 실패 처리할 수 있도록 합니다.
{
"method": "GET",
"url": "https://example.com/product/42",
"validate": {
"data": {"accept": ["Add to cart"], "fail": ["Just a moment"]}
}
}
POST /api/auto/에서 validate은(는) 래더가 챌린지 페이지를 완료된 것으로 처리하지 않도록 방지합니다.
관련 항목
- 보호된 사이트: 각 보호 수준별 사용할 엔진
- API Endpoint: 4개 endpoint 전체에 대한 request 및 response 참조
- 여러 Request 간 Proxy 재사용: clearance가 바인딩된 exit 고정
- Smart Fetch (Auto):
meta.solved이 래더에 적용되는 방식 - Response Header: 호출 시 credit 비용이 표시되는 위치