Tái sử dụng Proxy cho nhiều Request

Tìm hiểu cách duy trì cùng một proxy exit qua các request tiếp theo, để JavaScript render, các lệnh gọi API và các lượt fetch phân trang đều xuất phát từ cùng một IP.

Tại sao nên tái sử dụng Proxy

Khi bạn gửi request đầu tiên đến mục tiêu, FourA sẽ chọn một proxy hoạt động cho bạn. Mỗi response đều bao gồm proxy ID đã sử dụng. Gửi lại ID đó trong các request tiếp theo và:

  • Các trang tiếp theo sẽ đi qua cùng một exit, giúp session cookie và rate limit luôn nhất quán đối với mục tiêu.
  • Lượt fetch theo phạm vi quốc gia vẫn nằm trong allowlist của bạn mà không cần chọn lại từ đầu.
  • Endpoint POST /api/single/ tiết kiệm chi phí sẽ phát lại qua proxy mà bạn đã trả phí để tìm trước đó, với mức phí của Single thay vì Proxy.

Proxy ID là một chuỗi base36 ẩn danh (chẳng hạn như A1B2C3). Không bao giờ là một IP thô.

Vị trí của ID trong Response

Endpoint Field Khi nào xuất hiện
POST /api/auto/ session.proxy Khi returnSession là true (mặc định)
POST /api/single/ proxy (cấp cao nhất) Chỉ khi request cung cấp trường proxy
POST /api/proxy/ proxy (cấp cao nhất) Luôn xuất hiện khi thành công
POST /api/browser/ proxy (cấp cao nhất) Chỉ khi request cung cấp trường proxy

Để nhận một exit mới mà không cần ghim cố định, hãy bắt đầu với Auto hoặc Proxy. Cả hai đều tìm kiếm một exit hoạt động và trả về ID của nó cho bạn.

Mô hình 1: Auto tìm kiếm, Single phát lại

Phù hợp nhất khi bạn chưa biết rõ về mục tiêu. Auto sẽ duyệt qua các cấp độ một lần, sau đó Single sẽ tái sử dụng session thành công đó cho mọi trang tiếp theo.

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"])

Lượt gọi Auto có chi phí bằng mức thang xử lý (ladder) đã tiêu tốn. Mỗi lượt gọi Single tiếp theo tốn 2 credit (Single với unblocker, giá trị mặc định).

Pattern 2: Proxy phát hiện, Browser render thông qua cùng một IP thoát

Sử dụng mẫu này khi mục tiêu yêu cầu phải thấy một quốc gia thoát cụ thể và nội dung cuối cùng cần 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
  }'

Không gọi lại /api/proxy/ để làm mới lựa chọn. Một lệnh gọi mới có thể chọn một exit khác và làm mất tác dụng của việc ghim. Nếu exit đã ghim ngừng hoạt động, hãy chạy một lệnh gọi /api/proxy/ mới để chọn một exit khác, sau đó tiếp tục với exit đó.

Pattern 3: Bỏ qua một exit đã bị chặn

Nếu một exit từng hoạt động bắt đầu trả về từ chối hoặc các trang xác minh, hãy yêu cầu FourA tránh exit đó trong lần lựa chọn tiếp theo.

{
  "maxTries": 5,
  "ignoreProxies": ["A1B2C3"],
  "request": { "method": "GET", "url": "https://example.com/data" }
}

ignoreProxies chấp nhận danh sách proxy ID từ các response trước đó. Tính năng này hoạt động trên /api/proxy/ và /api/auto/. Danh sách này được tuân thủ trong mọi lần retry nội bộ, do đó một lệnh gọi duy nhất với ignoreProxies sẽ không bao giờ chọn các exit node đã bị chặn.

Thời Gian Một Pinned Session Duy Trì Hoạt Động

Bản thân exit node duy trì hoạt động chừng nào proxy bên dưới còn hoạt động tốt, thường từ vài phút đến vài giờ. Nếu một lượt replay bắt đầu trả về challenge, lỗi block hoặc chuyển hướng bất thường, exit node có thể đã bị xoay vòng hoặc máy chủ đích đã làm mới trạng thái xác thực.

Hai tùy chọn xử lý khi điều đó xảy ra:

  1. Thực hiện lệnh gọi /api/auto/ mới cho cùng URL đó. Auto sẽ tìm ra một session hoạt động mới; hãy bỏ các ID trước đó.
  2. Thực hiện lệnh gọi /api/proxy/ mới với ignoreProxies: ["<burned-id>"] nếu bạn muốn tiếp tục ghim thủ công.

Session cookie từ một Auto response cũng hết hạn theo thời gian quy định của trang web đích. Một số trang web duy trì trạng thái xác thực trong nhiều giờ; số khác chỉ duy trì trong vài phút. Hãy xem session như một bộ nhớ đệm (cache), không phải là một token vĩnh viễn.

Khi Một ID Không Thể Ghim

Có ba mã lỗi 400 có thể trả về từ một giá trị proxy, và chúng có ý nghĩa khác nhau:

Error What happened What to do
Invalid proxy format Giá trị không phải là ID do FourA phát hành. Địa chỉ proxy thô sẽ rơi vào trường hợp này. Gửi chuỗi opaque nguyên bản nhận được từ response.
Proxy not found ID giải mã thành công nhưng không còn trỏ đến exit node đang hoạt động. Lấy một exit node mới từ lệnh gọi Auto hoặc Proxy mới.
Managed exit: this proxy id cannot be pinned to a request ID là một premium exit node, và dung lượng premium traffic trong chu kỳ của bạn đã hết, hoặc gói cước của bạn không bao gồm premium exit node. Chạy lệnh gọi thông qua POST /api/proxy/ và sử dụng exit node được chọn, hoặc bổ sung premium traffic và ghim lại.

Lỗi thứ ba xuất phát từ một ID được trả về từ lệnh gọi thành công trước đó, vì vậy bạn có thể gặp phải lỗi này dù không làm sai điều gì. Hãy xử lý tương tự như một session đã hết hạn: chuyển sang một lệnh gọi tìm kiếm mới thay vì thử lại với cùng ID đó.

Các Lỗi Thường Gặp

  • Tái sử dụng proxy ID giữa các tài khoản. Không chia sẻ ID giữa các tài khoản: một ID mà tài khoản này ghim được có thể bị từ chối ở tài khoản khác, ví dụ như exit node premium trên một gói không có lưu lượng premium.
  • Cố gắng giải mã ID. Chuỗi base36 là dạng dữ liệu mờ đục (opaque). Không phân tích cú pháp, không cắt bớt ký tự, không chuyển thành chữ thường. Hãy truyền lại nguyên văn.
  • Ghim qua một exit node bị giới hạn tần suất (rate-limited). Nếu mục tiêu giới hạn tần suất theo từng IP, việc dồn nhiều request qua một exit node sẽ kích hoạt chặn nhanh hơn. Đối với khối lượng công việc lớn, hãy để Auto hoặc Proxy luân phiên qua nhiều exit node và chỉ ghim khi mục tiêu thực sự yêu cầu.
  • Ghim nhầm một exit node premium. Một ID từ lệnh gọi do exit node premium xử lý (exitClass: "premium" trên Proxy) sẽ ghim exit node premium đó. Mọi lượt phát lại qua đó đều tính vào lưu lượng premium của bạn, và response sẽ kèm theo X-FourA-Exit-Class: premium.
  • Gửi exitCountries trên gói không có định vị địa lý (geo targeting). Phạm vi quốc gia được bao gồm từ gói Startup trở lên. Trên gói không hỗ trợ tính năng này, lệnh gọi gửi exitCountries sẽ bị từ chối với 403 và X-FourA-Limit: plan_limit_feature.
  • Bỏ qua exitCountries trong lệnh gọi tiếp theo. Nếu bạn ghim một exit node đã chỉ định phạm vi và sau đó gọi lại Proxy mà không có exitCountries, lệnh gọi tiếp theo có thể đi qua một quốc gia khác. Hãy duy trì phạm vi trên mọi lệnh gọi cần nó.

Liên quan

Cập nhật: 27 tháng 9, 2026