Все статьи

Представляем Auto: один endpoint для любой цели

Endpoint Auto выбирает Single, Proxy Finder или Browser для каждого запроса, обрабатывает anti-bot проверки и возвращает сессию, которую можно переиспользовать при следующем вызове.

Что нового

Эндпоинт /api/auto теперь самый короткий путь к рабочему response для любого URL. Укажите целевой адрес. Auto сам выбирает, как выполнить request: через Single, Proxy Finder или Browser, проходит anti-bot проверки при их появлении и возвращает session для повторного использования в следующем вызове.

Один endpoint. Любая цель. Никакого переключения режимов с вашей стороны.

В этом вся суть. Ниже описано, как это работает, сколько стоит и какие есть нюансы.

Как это работает

В основе Auto лежит цепочка уровней (от дешевых к дорогим). При каждом request Auto идет вверх по цепочке, пока один из уровней не вернет response, подходящий под ваши правила validate.

Уровни по порядку:

  1. Cached session. Если у Auto есть готовая session для этого хоста от предыдущего вызова, запрос сначала идет через нее. Самый дешевый путь.
  2. Proxy Finder. Запрос через ротируемый proxy. Подходит для сайтов с защитой на базе репутации IP.
  3. Browser. Полный рендеринг: выполняет JavaScript, решает anti-bot проверки и собирает выданные сайтом cookie.

Как только уровень срабатывает, Auto сохраняет найденную session: использованный proxy id, выданные сайтом cookie и User-Agent. При следующем вызове к тому же хосту Auto сначала пробует эту session. Если она работает, вы платите по тарифу дешевого уровня, а не дорогого.

Минимальный вызов:

curl -X POST "https://api.foura.ai/api/auto" \
  -H "X-API-Key: pk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/data",
    "validate": { "status": { "accept": [200] } }
  }'

Сокращенный response:

{
  "status": 200,
  "data": "...",
  "headers": [...],
  "meta": {
    "rung": "cache",
    "solved": false,
    "attempts": 1,
    "credits": 2
  },
  "session": {
    "proxy": "CLN1B8",
    "cookies": [{ "name": "cf_clearance", "value": "..." }],
    "userAgent": "..."
  }
}

Для дальнейшей интеграции важны два поля. meta.rung сообщает, какой путь сработал. session содержит тройку параметров, которую можно передать в вызов /api/single, чтобы повторить тот же exit самостоятельно. Поле proxy представляет собой непрозрачный base36 ID (без сырых IP), безопасный для логирования и передачи между сервисами.

Эффект

Здесь имеют значение две цифры.

Первый вызов к защищенному сайту запускает уровень Browser: рендеринг, решение проверок, сбор cookies, возврат страницы. Это стоит около 10 кредитов. Как только Auto кэширует рабочую сессию для этого хоста, последующие вызовы переиспользуют ее: через Single за 2 кредита или через Proxy Finder за 4, если cookies сессии работают с любого адреса. Таким образом, второй вызов до 5 раз дешевле первого, и каждый последующий тарифицируется по низкому тарифу, пока сессия валидна. Мы измерили это на проде во время релиза: exit без cookies (после обнаружения) повторяются ровно по 2 кредита за вызов вместо 10, которые списывались ранее, когда каждый request шел через Proxy Finder.

Вторая цифра: неудачные уровни не тарифицируются. Если Auto пробует три proxy и каждый выдает 403, пока четвертый не вернет результат, списываются кредиты только за четвертый. Вы платите за доставленный контент, а не за попытки поиска.

В этом основная ценность. Дорогой уровень выполняется один раз, дешевый уровень работает все последующее время, и вам не нужно писать логику кэширования самостоятельно.

Стоит отметить еще два механизма, решающих практические проблемы в проде:

Геоблокируемые цели перестают тратить рабочие exit. Когда сайт возвращает 451 (или заглушку с юридическим предупреждением) для большинства exit, Auto запоминает, какие страны реально отдают контент. При следующем вызове сервис в первую очередь берет свежие exit из этих стран и распределяет конкурентную нагрузку между ними. Так один удачный exit не перегружается запросами и не попадает под rate limit.

Validate запускается на каждом уровне. Страница с некорректным содержимым (геоблокировка с кодом 200 и юридическим текстом в теле ответа) никогда не засчитывается как успешный ответ. Если ваш validate.data.fail содержит "legal reasons", Auto продолжит перебор, пока один из уровней не пройдет валидацию. Не кэшированный уровень. Никакой из уровней. Если ни один не прошел, вы получите честную ошибку с реальной причиной.

Для продвинутых пользователей

Несколько параметров, полезных при высоких нагрузках через Auto.

timeout_ms задает общий бюджет времени на всю операцию, а не на отдельный уровень. Значение по умолчанию составляет 120 секунд. Auto распределяет его: каждый подзапрос получает min(свой естественный timeout, оставшийся бюджет), а цепочка перестает запускать новые уровни, когда времени остается слишком мало. Установите 20000 для задач с интерактивной задержкой. Оставьте значение по умолчанию для пакетного сбора данных с допустимым длинным хвостом задержек.

forceProxy включен по умолчанию. Auto никогда не обращается к цели с исходного IP сервиса FourA, если не указан forceProxy: false. Одно уточнение: некоторые сайты (интерактивный Cloudflare с проверкой репутации IP) работают лучше с чистого IP дата-центра, чем с резидентского exit с низким уровнем доверия. Поэтому forceProxy: false может упростить доступ к определенным целям, а не усложнить его. Если на конкретном хосте постоянно возникают проверки, стоит попробовать отключить этот параметр.

ignoreProxies представляет собой клиентский список исключений. Передайте идентификаторы proxy, которые уже скомпрометированы (из предыдущего session.proxy, где с вашей стороны сработал rate limit), и Auto пропустит их везде: при повторном использовании прогретых сессий, поиске exit node и во вложенном вызове Proxy Finder. Таким образом Auto не выберет повторно тот же exit, который вы только что указали избегать.

meta также позволяет строить собственные дашборды: какие хосты сегодня перешли на уровень браузера, среднее число попыток на доставку, соотношение запросов с решенным challenge к чистым. Если для определенного хоста расход внезапно вырастает с 2 до 10 кредитов, это сигнал деградации сессии, на который можно отреагировать до того, как вырастут расходы.

Пример, объединяющий все четыре механизма:

import requests

r = requests.post(
    "https://api.foura.ai/api/auto",
    headers={"X-API-Key": "pk_live_..."},
    json={
        "url": "https://example.com/product/9876",
        "timeout_ms": 30000,
        "forceProxy": True,
        "ignoreProxies": ["CLN1B8", "K7X9AB"],
        "validate": {
            "status": {"accept": [200]},
            "data":   {"accept": ['"price":'], "fail": ["captcha", "legal reasons"]}
        }
    }
).json()

# If Auto delivered, keep the session for the next call to this host
if r.get("status") == 200 and "session" in r:
    session = r["session"]                              # {proxy, cookies, userAgent}
    print(r["meta"]["rung"], r["meta"]["credits"], r["meta"]["attempts"])

О самой схеме validate читайте в предыдущем обзоре Validate Rules Now Decide What Counts as Success.

Что дальше

Сейчас в роадмапе для Auto две вещи.

Инспекция сессий скоро появится в Dashboard. Сейчас сессии, которые Auto сохраняет для каждого хоста, находятся внутри сервиса, и их невозможно просмотреть при отладке списаний с вашей стороны. Мы делаем просмотр сессий по хостам: можно будет увидеть кешированные сессии, их возраст, оставшееся время жизни и историю переходов по уровням для каждой. Также добавим кнопку для сброса сессии вручную, когда таргет меняется и вы знаете, что кеш невалиден.

Затем появится более строгий контроль расходов. Жесткий лимит кредитов на request (никогда не тратить больше X на этот вызов, возвращать честную ошибку при превышении) и режим "single-only" для команд, чьим таргетам никогда не нужен уровень браузера. Обе функции сейчас находятся под флагами.

Смысл Auto в том, чтобы не думать, какой именно продукт вызывать. Но это не значит, что вы не можете проверить, что произошло. Каждый response содержит уровень, который был использован, и созданную сессию. Проверьте эти два поля, и вы точно поймете, почему вызовы стоили именно столько.