request間でproxyを再利用する
後続の request でも同じ proxy の出口を維持し、JavaScript のレンダリング、API 呼び出し、ページネーションされたフェッチがすべて同じ IP から行われるようにする方法を説明します。
なぜ proxy を再利用するのか
最初にターゲットにアクセスすると、FourA は機能する proxy を選択します。すべての response には使用した proxy の ID が含まれています。その ID を後続の request で渡すと、次のようになります。
- 後続のページが同じ出口を通過するため、session cookie と rate limit がターゲットに対して一貫性を保ちます。
- 国をスコープとしたフェッチが、新たに選択することなく allowlist 内に留まります。
- 安価な
POST /api/single/endpoint は、発見のために支払い済みの proxy を経由して、Proxy のコストではなく Single のコストでリプレイします。
proxy ID は不透明な base36 文字列(A1B2C3 のようなもの)です。生の IP になることはありません。
response 内の ID の位置
| Endpoint | Field | 存在する場合 |
|---|---|---|
POST /api/auto/ |
session.proxy |
returnSession が true の場合(デフォルト) |
POST /api/single/ |
proxy (トップレベル) |
request に proxy フィールドが指定された場合のみ |
POST /api/proxy/ |
proxy (トップレベル) |
常に(成功時) |
POST /api/browser/ |
proxy (トップレベル) |
request に 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が検出し、ブラウザが同じ出口からレンダリングする
ターゲットに特定の出口国を認識させる必要があり、最終的なコンテンツに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: ブロックされた出口をスキップする
以前機能していた出口がブロックやCAPTCHAを返し始めた場合は、次回の選択時にその出口を回避するようにFourAに指示してください。
{
"maxTries": 5,
"ignoreProxies": ["A1B2C3"],
"request": { "method": "GET", "url": "https://example.com/data" }
}
ignoreProxiesは以前のresponseからのproxy IDのリストを受け入れます。これは/api/proxy/と/api/auto/で機能します。このリストはすべての内部リトライで尊重されるため、ignoreProxiesを使用した1回の呼び出しで、使用済みのexitが選択されることはありません。
固定されたセッションの有効期間
exit自体は、基盤となるproxyが正常である限り存続し、通常は数分から数時間です。リプレイがチャレンジ、ブロック、または予期しないリダイレクトを返し始めた場合、exitがローテーションされたか、ターゲットがクリアランスを更新した可能性があります。
これが発生した場合の2つのオプション:
- 同じURLに対する新しい
/api/auto/の呼び出し。Autoは新しく機能するセッションを検出し、以前のIDを破棄します。 - 手動で固定を維持したい場合は、
ignoreProxies: ["<burned-id>"]を使用した新しい/api/proxy/の呼び出し。
Autoのresponseからのセッションcookieも、ターゲット独自のスケジュールで期限切れになります。クリアランスを数時間バインドするサイトもあれば、数分とするサイトもあります。セッションは永続的なtokenではなく、キャッシュとして扱ってください。
よくある間違い
- アカウント間でのproxy IDの再利用。 proxy IDはresponseごとの識別子です。あるAPIキーから別のキーへIDを渡しても、同じexitに解決されるとは限りません。
- IDのデコードの試み。 base36文字列は不透明です。解析したり、文字を削除したり、小文字にしたりしないでください。そのまま返してください。
- レート制限のあるexitを通じた固定。 ターゲットがIPごとにrate limitを行っている場合、1つのexitに多くのrequestを集中させると、ブロックが早くトリガーされます。大量のワークロードの場合は、AutoまたはProxyに多くのexitをローテーションさせ、ターゲットが本当に必要とする場合のみ固定してください。
- 後続の呼び出しでの
exitCountriesの無視。 スコープされたexitを固定し、exitCountriesなしで再度Proxyを呼び出すと、後続の呼び出しが異なる国を経由する可能性があります。それを必要とするすべての呼び出しでスコープを維持してください。
関連情報
- API Endpoints: 完全なパラメータとresponseのリファレンス
- Smart Fetch (Auto): リプレイするセッションをAutoが構築する方法
- Handling Anti-Bot Protection: 固定が役立つ場合とローテーションが適している場合
- Common Issues:
no_eligible_proxyおよびその他のproxyエラー