Повторное использование proxy между запросами
Узнайте, как сохранять один и тот же выходной proxy для последующих запросов, чтобы рендеринг JavaScript, вызовы API и пагинация выполнялись с одного IP.
Зачем повторно использовать proxy
При первом обращении к цели FourA подбирает для вас рабочий proxy. Каждый response содержит ID использованного proxy. Передайте этот ID в следующих запросах, и:
- Последующие страницы будут открываться через тот же выходной узел, поэтому cookie сессии и rate limits останутся согласованными для целевого ресурса.
- Запросы с геопривязкой к стране останутся в рамках вашего allowlist без нового подбора.
- Недорогой endpoint
POST /api/single/повторяет запросы через proxy, за поиск которого вы уже заплатили, по стоимости Single вместо Proxy.
ID proxy представляет собой непрозрачную строку base36 (например, A1B2C3). Это никогда не бывает обычный IP.
Где находится ID в response
| Endpoint | Поле | Когда присутствует |
|---|---|---|
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 проходит цепочку один раз, а затем 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 стоит столько, сколько расходует его ladder. Каждый последующий вызов Single стоит 2 кредита (Single с unblocker, по умолчанию).
Pattern 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/, чтобы выбрать другой, и затем продолжайте работу с ним.
Pattern 3: Пропуск скомпрометированного выходного узла
Если ранее работавший выходной узел начинает возвращать отказы или страницы проверки, укажите FourA избегать его при следующем выборе.
{
"maxTries": 5,
"ignoreProxies": ["A1B2C3"],
"request": { "method": "GET", "url": "https://example.com/data" }
}
ignoreProxies принимает список ID proxy из предыдущих ответов. Параметр работает для /api/proxy/ и /api/auto/. Список учитывается при каждом внутреннем retry, поэтому один вызов с ignoreProxies никогда не выберет скомпрометированные exit-узлы.
Время жизни закрепленной сессии
Сам exit-узел активен до тех пор, пока базовая proxy остается рабочей, обычно от нескольких минут до нескольких часов. Если повторный запрос начинает возвращать проверки, блокировки или неожиданные редиректы, exit-узел, вероятно, был ротирован или целевой ресурс обновил параметры доступа.
Варианты действий в этом случае:
- Новый вызов
/api/auto/для того же URL. Auto найдет новую рабочую сессию; сбросьте предыдущие ID. - Новый вызов
/api/proxy/сignoreProxies: ["<burned-id>"], если вы хотите продолжить закрепление вручную.
Срок действия сессионных cookie из ответа Auto также зависит от настроек целевого ресурса. Некоторые сайты сохраняют доступ часами, другие минутами. Относитесь к сессии как к кэшу, а не как к постоянному токену.
Ошибки при закреплении ID
При использовании значения proxy могут возвращаться три ошибки 400 с разным значением:
| Ошибка | Причина | Что делать |
|---|---|---|
Invalid proxy format |
Значение не является ID, выданным FourA. Например, передан прямой адрес proxy. | Отправьте точную строку из ответа без изменений. |
Proxy not found |
ID декодирован, но больше не указывает на активный exit-узел. | Получите новый exit-узел через новый вызов Auto или Proxy. |
Managed exit: this proxy id cannot be pinned to a request |
ID относится к премиум exit-узлу, а премиум-трафик вашего тарифа на этот период исчерпан, либо тариф не включает премиум exit-узлы. | Выполните вызов через POST /api/proxy/ и используйте выбранный им exit-узел, либо пополните премиум-трафик и закрепите его снова. |
Третья ошибка может возникнуть для ID, полученного из успешного вызова, то есть без каких-либо ошибок с вашей стороны. Обрабатывайте ее так же, как истекшую сессию: выполните новый вызов обнаружения вместо повторной отправки того же ID.
Частые ошибки
- Повторное использование ID proxy между аккаунтами. Не используйте ID на разных аккаунтах: ID, который может закрепить один аккаунт, может быть отклонен для другого, например, премиум-выход на тарифе без премиум-трафика.
- Попытка декодировать ID. Строка base36 является непрозрачной. Не парсите ее, не удаляйте символы и не переводите в нижний регистр. Передавайте ее в исходном виде.
- Закрепление за выходом с ограничением частоты запросов. Если целевой ресурс применяет rate limit на уровне IP, направление множества запросов через один выход быстрее вызовет блокировку. Для высоконагруженных задач позвольте Auto или Proxy выполнять ротацию через множество выходов и используйте закрепление только тогда, когда это действительно требуется цели.
- Случайное закрепление премиум-выхода. ID из вызова, который был обслужен премиум-выходом (
exitClass: "premium"в Proxy), закрепляет этот премиум-выход. Каждый повторный запрос через него расходует ваш премиум-трафик, а ответ содержитX-FourA-Exit-Class: premium. - Отправка
exitCountriesна тарифе без геотаргетинга. Таргетинг по странам доступен начиная с тарифа Startup. На тарифе без этой функции вызов, отправляющийexitCountries, отклоняется с кодом403и ошибкойX-FourA-Limit: plan_limit_feature. - Игнорирование
exitCountriesв последующем запросе. Если вы закрепляете выход с указанием страны, а затем снова вызываете Proxy безexitCountries, последующий запрос может пройти через другую страну. Сохраняйте параметр scope в каждом вызове, где он необходим.
Related
- API Endpoints: Полный справочник параметров и ответов
- Smart Fetch (Auto): Как Auto формирует сессию, которую вы воспроизводите
- Protected sites: Когда помогает закрепление, а когда лучше ротация
- Common Issues:
no_eligible_proxyи другие ошибки proxy - Why a Proxy Request Ran Out of Tries: Чтение
attemptReportпри исчерпании попыток вызова Proxy