request間でproxyを再利用する
JavaScript のレンダリング、API 呼び出し、ページネーション取得のすべてが同一 IP から送信されるよう、後続のリクエスト間で同じ proxy 出口を維持する方法を説明します。
proxy を再利用する理由
ターゲットに初回アクセスする際、FourA は機能する proxy を自動選択します。すべてのレスポンスには使用された proxy ID が含まれます。後続のリクエストでその ID を渡すことで、以下のメリットが得られます。
- 後続ページが同じ出口を経由するため、ターゲット側でセッション cookie や rate limit の一貫性が保たれます。
- 国単位でスコープ設定された取得が、新たな再選択なしで allowlist 内に維持されます。
- 低コストの
POST /api/single/endpoint を使用し、Proxy のコストではなく Single のコストで、すでに検出コストを支払った proxy 経由でリプレイできます。
proxy ID は不透明な base36 文字列です (例: A1B2C3)。生の IP アドレスになることはありません。
レスポンス内の ID 格納場所
| Endpoint | Field | 含まれる条件 |
|---|---|---|
POST /api/auto/ |
session.proxy |
returnSession が true の場合 (デフォルト) |
POST /api/single/ |
proxy (トップレベル) |
リクエストに proxy フィールドが含まれていた場合のみ |
POST /api/proxy/ |
proxy (トップレベル) |
成功時は常に |
POST /api/browser/ |
proxy (トップレベル) |
リクエストに proxy フィールドが含まれていた場合のみ |
出口を固定せずに新規出口を取得するには、Auto または Proxy から開始します。どちらも機能する出口を検出し、その ID を返します。
パターン 1: Auto が検出し、Single がリプレイ
まだ性質が不明なターゲットに最適です。Auto がラダーを 1 回走査した後、Single が後続のすべてのページで成功したセッションを再利用します。
import requests
API = "https://eu.api.foura.ai"
H = {"X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json"}
# Step 1: discover a working exit with Auto.
r = requests.post(f"{API}/api/auto/", headers=H, json={
"url": "https://example.com/product/42",
"validate": {"data": {"accept": ["Add to cart"]}}
}).json()
session = r["session"]
proxy = session["proxy"]
user_agent = session["userAgent"]
# Step 2: paginate with Single, reusing the same exit and User-Agent.
for sku in ("43", "44", "45"):
p = requests.post(f"{API}/api/single/", headers=H, json={
"method": "GET",
"url": f"https://example.com/product/{sku}",
"proxy": proxy,
"headers": [["User-Agent", user_agent]],
}).json()
print(sku, p["status"])
Auto 呼び出しのコストは、そのラダーで消費された分となります。後続の Single 呼び出しは、それぞれ 2 クレジットを消費します (unblocker を使用したデフォルトの Single)。
パターン 2: Proxy が検出、Browser が同一出口経由でレンダリング
ターゲットに対して特定の出口国を指定する必要があり、最終コンテンツで JavaScript の実行が必要な場合に使用します。
# Step 1: pick a country-scoped exit with Proxy.
curl -X POST https://eu.api.foura.ai/api/proxy/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"maxTries": 5,
"exitCountries": ["FR", "GB"],
"request": {"method": "GET", "url": "https://example.com/pricing"}
}'
# Response includes: "proxy": "A1B2C3", "exitCountry": "FR"
# Step 2: render the JS-heavy page through THAT exit.
curl -X POST https://eu.api.foura.ai/api/browser/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/pricing",
"proxy": "A1B2C3",
"timeout_ms": 20000
}'
選択を更新するために /api/proxy/ を再度呼び出さないでください。新しい呼び出しによって別のイグジットが選択され、固定する意味が失われる可能性があります。固定されたイグジットが機能しなくなった場合は、新しい /api/proxy/ 呼び出しを実行して新しいイグジットを選択し、それを使用して処理を続行してください。
パターン 3: 失敗したイグジットのスキップ
以前は機能していたイグジットが拒否や検証ページを返し始めた場合は、次回の選択時にそれを回避するよう FourA に指示してください。
{
"maxTries": 5,
"ignoreProxies": ["A1B2C3"],
"request": { "method": "GET", "url": "https://example.com/data" }
}
ignoreProxies は以前のレスポンスからのプロキシ ID リストを受け付けます。/api/proxy/ および /api/auto/ で動作します。このリストはすべての内部リトライで適用されるため、ignoreProxies を指定した単一の呼び出しが無効化された出口を選択することはありません。
固定セッションの有効期間
出口自体は、基盤となるプロキシが正常である限り維持され、通常は数分から数時間です。リプレイ時にチャレンジ、ブロック、予期しないリダイレクトが返され始めた場合、出口がローテーションされたか、ターゲット側でクリアランスが更新された可能性があります。
その場合の2つの対処方法:
- 同一 URL に対して新しい
/api/auto/呼び出しを実行します。Auto が新しい有効なセッションを検出し、以前の ID を破棄します。 - 手動で固定を継続したい場合は、
ignoreProxies: ["<burned-id>"]を指定して新しい/api/proxy/呼び出しを実行します。
Auto レスポンスのセッション Cookie もターゲット独自のスケジュールで期限切れになります。クリアランスが数時間有効なサイトもあれば、数分のサイトもあります。セッションは永続的なトークンではなくキャッシュとして扱ってください。
ID が固定できない場合
proxy の値から返される 400 エラーには3種類あり、それぞれ意味が異なります:
| エラー | 発生事象 | 対処方法 |
|---|---|---|
Invalid proxy format |
FourA が発行した ID ではありません。未加工のプロキシアドレスを指定した場合に発生します。 | レスポンスの非透過文字列をそのまま送信してください。 |
Proxy not found |
ID はデコードされましたが、有効な出口に解決されなくなりました。 | 新しい Auto または Proxy 呼び出しから新しい出口を取得してください。 |
Managed exit: this proxy id cannot be pinned to a request |
ID がプレミアム出口ですが、今期間のプランのプレミアムトラフィックを使い果たしたか、プランにプレミアム出口が含まれていません。 | POST /api/proxy/ 経由で呼び出しを実行して自動選択された出口を使用するか、プレミアムトラフィックを追加して再度固定してください。 |
3つ目のエラーは、成功した呼び出しから返された ID でも発生する可能性があるため、リクエスト側に誤りがなくても遭遇することがあります。期限切れのセッションと同様に扱い、同じ ID をリトライするのではなく、新しい検出呼び出しにフォールバックしてください。
よくある間違い
- アカウント間でのプロキシIDの再利用。 アカウント間でIDを共有しないでください。あるアカウントで固定可能なIDが別のアカウント(例: プレミアムトラフィックを含まないプランでのプレミアム出口ノード)では拒否される場合があります。
- IDのデコードの試行。 base36文字列は不透明(opaque)です。パースしたり、文字を削除したり、小文字に変換したりしないでください。そのまま渡してください。
- レート制限された出口ノードの固定。 ターゲットがIP単位でレート制限を行っている場合、1つの出口ノードに多数のリクエストを集中させるとブロックが早期にトリガーされます。大量のワークロードでは、AutoまたはProxyに多数の出口ノードをローテーションさせ、ターゲットが真に必要な場合にのみ固定してください。
- 意図しないプレミアム出口ノードの固定。 プレミアム出口ノードが処理した呼び出しからのID(Proxyでの
exitClass: "premium")は、そのプレミアム出口ノードを固定します。それを経由するすべての再実行はプレミアムトラフィックとしてカウントされ、レスポンスにはX-FourA-Exit-Class: premiumが含まれます。 - ジオターゲティングのないプランでの
exitCountriesの送信。 国の指定はStartupプラン以上で含まれています。これを含まないプランでは、exitCountriesを送信する呼び出しは403およびX-FourA-Limit: plan_limit_featureで拒否されます。 - 後続のリクエストでの
exitCountriesの無視。 スコープ指定された出口ノードを固定した後、exitCountriesなしで再度Proxyを呼び出すと、後続リクエストが別の国を経由する可能性があります。スコープを必要とするすべての呼び出しで指定を維持してください。
関連情報
- APIエンドポイント: 完全なパラメータおよびレスポンスリファレンス
- Smart Fetch (Auto): Autoが再実行セッションを構築する仕組み
- 保護されたサイト: 固定が有効な場合とローテーションが適している場合
- 一般的な問題:
no_eligible_proxyおよびその他のプロキシエラー - Proxyリクエストが試行上限に達した理由: Proxy呼び出しが中断された場合の
attemptReportの読み取り