アンチボット対策
ターゲットが要求されたページへの途中でボットチェックを実行した場合、FourAはそれを通知します。チェックに遭遇したすべてのリクエストは、システム名、チェックがクリアされたかどうか、そして(クリアされた場合)次の呼び出しでスキップするために再利用できるクリアランス情報をフィールドで返します。
このページはこれらのフィールドのリファレンスです。戦略については、Handling Anti-Bot Protectionを参照してください。
フィールドの場所
| エンドポイント | フィールド | 存在条件 |
|---|---|---|
POST /api/single/ |
defense (object) |
レスポンスでボットチェックが認識された場合 |
POST /api/proxy/ |
defense (object) |
同上、応答した試行によって報告された場合 |
POST /api/browser/ |
defenseSolved (boolean) および defenses (object) |
ページロード中にボットチェックが認識された場合 |
POST /api/auto/ |
meta.solved (boolean) |
常に存在。階層のどこかでチェックがクリアされた場合は true。 |
存在しない場合は、何も認識されなかったことを意味します。defense の欠落を失敗と見なさないでください。
レポートには 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[] | このレスポンスで認識されたすべてのシステム。vendor よりも多くの名前を含むことができ、まだクリアできない名前を含むこともできる。 |
ms |
number | チェックのクリアに要したミリ秒数。クリア時のみ。 |
hashes |
number | チャレンジが要求した計算作業量。クリア時のみ。 |
complexity |
number | チャレンジが宣言した難易度。クリア時かつチャレンジが報告する場合のみ。 |
answers |
number | 複数の回答を求めるチャレンジに対して提供された、承認済み回答の数。クリア時のみ。 |
cookie |
string | 獲得した再利用可能なクリアランス。クリア時のみ。 |
solved: false は分岐処理を行うべきケースである。FourA が未解決のチャレンジをコンテンツとして提示することはないため、このフラグは body のパースではなくエスカレーションが必要であることを示すシグナルとなる。
Browser における defenses
{
"status": 200,
"body": "<!doctype html>...",
"userAgent": "Mozilla/5.0...",
"defenseSolved": true,
"defenses": {
"present": ["cloudflare"],
"cleared": ["cloudflare"]
}
}
| フィールド | 型 | 説明 |
|---|---|---|
defenseSolved |
boolean | 読み込み中にシステムに遭遇し、最終ページでそのクリアランスが保持されている場合にtrueになります。これは、呼び出しコストが15クレジットか30クレジットかを決定するフラグです。 |
defenses.present |
string[] | 最終的なレスポンスだけでなく、ページ読み込み中の任意の時点で認識されたすべてのシステムです。チェックはすでに発生した事象であり、実際のページが到着する頃にはチャレンジのレスポンスは消え去っています。 |
defenses.cleared |
string[] | 最終ページがクリアランスを保持しているシステムです。 |
clearedに到達しないpresentの名前は、FourAが認識できてもまだ通過できないシステムです。これらによって呼び出しの価格が上がることはありません。
ベンダー
vendor の値 |
システム |
|---|---|
cloudflare |
Cloudflareのチャレンジおよびボット管理 |
sgcaptcha |
SiteGroundのサイトチェック |
datadome |
DataDome |
perimeterx |
PerimeterX |
akamai |
Akamai Bot Manager |
incapsula |
Imperva Incapsula |
awswaf |
AWS WAFチャレンジ |
ebay-splashui |
eBay独自のチャレンジ |
hcaptcha |
hCaptcha |
recaptcha |
reCAPTCHA |
現在クリアされるもの
| Endpoint | クリア対象 |
|---|---|
| Single, Proxy | sgcaptcha, ebay-splashui. どちらも視覚的ではなく計算的なものであるため、ブラウザは関与しません。 |
| Browser | cloudflare, sgcaptcha |
リスト上の他のすべては認識および報告されるだけであり、それ以上のことはありません。FourAがより多くのシステムをクリアできるように学習するにつれてこの境界は移動するため、この表から推測するのではなくsolvedを読んでください。
エッジケースに関する2つの注意点:
hcaptchaおよびrecaptchaも通常のフォームウィジェットです。レスポンスが実際にブロックした(403、429、または503)場合にのみ報告されるため、フォームにCAPTCHAフィールドがあるチェックアウトページでは防御として報告されません。- Cloudflareの背後にあることは防御ではありません。サイトがCloudflareを使用しているからではなく、レスポンスに実際のチャレンジやボット管理のアーティファクトが存在する場合に
cloudflareが表示されます。
クリアランスのリプレイ
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"])
最初のリクエストにはクリアのコストがかかります。以降のリプレイは通常の価格での通常のリクエストとなります。
リプレイが失敗する原因として次の3つがあります:
- 異なる出口(exit)。 クリア時のレスポンスが返したproxy IDを固定します。次を参照してください: リクエスト間でのproxyの再利用。
- 異なるUser-Agent。 Browserのレスポンスは使用した
userAgentを返します。cookieと一緒にこれを送り返してください。 - 有効期限。 クリアランスにはターゲットによって設定された独自の有効期限があります。SiteGroundの場合はサイト全体で約30日ですが、Cloudflareのクリアランスは通常はるかに短くなります。クリアランスはキャッシュとして扱ってください。リプレイが再びチャレンジを返し始めたら、新規のリクエストを1回実行して新しいクリアランスを取得します。
コストについて
クリアされたチェックにより価格が変更されるのはBrowserのみです:
| Engine | Base | Cleared defense |
|---|---|---|
| Single | 1 (unblocker 付きで2) |
変更なし |
| Proxy | 5 (unblocker 付きで10) |
変更なし |
| Browser | 15 | 30 |
Browserが30を課金するのは、ソルバーがオンでシステムが実際にクリアされた場合のみです。システムが認識されたもののクリアされなかった場合のコストは15であり、チェックが全くないページと同じです。
組み合わせて使用する: validate
defenseはチェックに遭遇したことを通知します。validateは実際のページがどのようなものかをFourAに伝えます。これにより、たまたまHTTP 200を返すインタースティシャルページを渡すのではなく、リクエストを失敗させることができます。
{
"method": "GET",
"url": "https://example.com/product/42",
"validate": {
"data": {"accept": ["Add to cart"], "fail": ["Just a moment"]}
}
}
POST /api/auto/において、ラダーがチャレンジページを受け入れて処理を完了とみなすのを防ぐ役割をvalidateが担います。
関連情報
- アンチボット保護の処理: 各保護レベルで利用すべきエンジンの選択
- APIエンドポイント: 全4つのエンドポイントのリクエストとレスポンスのリファレンス
- リクエスト間でのproxyの再利用: クリアランスが関連付けられた出口の固定
- Smart Fetch (Auto): ラダーにおける
meta.solvedの組み込み方 - レスポンスヘッダー: 呼び出しのクレジットコストの表示場所