Что нового
Достаточно одной пропущенной буквы. Введите -contry-de в имя пользователя proxy, и опечатка останется незамеченной, выглядя в точности как рабочий параметр.
Порт proxy FourA отвечает на это кодом 400 со списком всех известных ему ключей. Это лишь небольшая деталь продукта, который вышел из бета-версии 15 сентября: proxy URL на наших выходных узлах для любого клиента, поддерживающего proxy (браузер, утилита загрузки, ваш текущий скрапер), без необходимости писать вызовы API. Вы создаете пользователя proxy в Dashboard, вставляете строку, и туннели вместе с трафиком учитываются в вашем тарифе так же, как и запросы к API.
Ниже описана полная грамматика и назначение каждого правила.
Как это работает
Порт доступен по адресу proxy.foura.ai:34004 и использует HTTP CONNECT с аутентификацией Basic для целевых хостов на портах 443 и 80. Учетные данные принадлежат пользователям proxy и намеренно отделены от вашего API key: рукопожатие proxy передается в открытом виде, а пользователю proxy можно сменить пароль, не затрагивая интеграцию с API.
Все, что идет после учетных данных, представляет собой список пар -key-value в произвольном порядке:
# Shared network, a German address, one sticky session for this job
curl -x "http://USERNAME-country-de-session-job42:PASSWORD@proxy.foura.ai:34004" \
https://example.com
# Premium network, an Android address in Germany, held 30 minutes
curl -x "http://USERNAME-network-premium-country-de-os-android-session-s1-lifetime-30:PASSWORD@proxy.foura.ai:34004" \
https://example.com
Shared представляет собой собственные выходные узлы FourA: вариант по умолчанию, включенный в ваш тариф. Premium включает домашние IP-адреса, расходуемые из доступного по тарифу premium-трафика и купленных пакетов. В сети shared параметр -fallback-premium позволяет перенаправить соединение на premium-узел, когда shared-узел не справляется. Опция отключена по умолчанию и срабатывает только при наличии остатка premium-лимита. Включение ее по умолчанию означало бы списание этого лимита без вашего явного согласия.
Параметр country можно указывать несколько раз, поэтому -country-de-country-fr задает диапазон из двух стран. Регион, город, сеть по номеру AS, тип устройства (windows, android, ios, mac) и lifetime (от 3 до 1440 минут) доступны только на premium. Запрос города в сети shared вернет 400 вместо попытки подобрать примерное совпадение. Для shared доступен таргетинг только по стране и не более, так как фильтр по городу, который чаще всего невозможно применить, хуже полного отсутствия фильтра.
-session-<name> (от 1 до 32 букв, цифр или знаков подчеркивания) делает соединения sticky: все запросы с таким именем используют общий адрес. На shared адрес удерживается в скользящем 10-минутном окне, сохраняясь до тех пор, пока вы продолжаете его использовать. На premium он удерживается в течение заданного lifetime или значения по умолчанию для сети. Если не указывать сессию, каждое соединение будет использовать новый адрес.
Также есть сохраненные настройки по умолчанию. Таргетинг, настроенный для proxy-пользователя в Dashboard, применяется ко всем его соединениям, поэтому строку подключения можно сократить до учетных данных. Значения в username по-прежнему имеют приоритет для конкретного соединения, а any сбрасывает сохраненное значение: -city-any запрашивает ключ, который помнит Munich для всей Германии. Клиенты с поддержкой заголовков в CONNECT (cURL умеет это через --proxy-header) могут передавать те же параметры как X-Foura-Country, X-Foura-Session и остальные, при этом заголовок имеет приоритет над username.
Влияние
Большинство этих изменений снимают типичные вопросы еще до их появления.
Почему запрос отклонен? Каждый отказ после проверки учетных данных содержит заголовок X-Foura-Error с однострочным описанием причины. Ошибка 400 указывает на конкретный параметр и допустимые значения. Ошибка 429 сообщает, какой именно лимит тарифа был исчерпан: одновременные туннели, новые туннели в минуту или стандартный трафик за расчетный период.
К чему привязаны лимиты? К аккаунту. Туннели и новые соединения считаются на уровне аккаунта, а не для каждого proxy-пользователя, поэтому вторые учетные данные не удваивают лимит. Байты списываются из общего трафика тарифа, а premium-байты учитываются в рамках premium-лимита внутри этого объема и не добавляются сверху. В тарифах с оплатой кредитами порт включает определенный объем гигабайтов, который пополняется на странице Billing. Если туннель не открылся, списания не происходят.
Кому принадлежат учетные данные? Теперь владельцем может быть организация, поэтому скрипты компании не перестанут работать при увольнении сотрудника. Участники используют их и видят пароль; администраторы и владельцы могут ротировать, отключать или перенастраивать таргетинг; переносить учетные данные может только владелец.
Что изменилось? Переключите селектор Product в разделах Overview, Metrics или Activity на Proxy: туннели с теми же классами результатов, что и ваши запросы API, текущее количество открытых туннелей, время установки соединения и трафик с разбивкой по пользователю proxy, целевому ресурсу, стране выхода или IP клиента. Сессия с уже назначенным адресом обычно подключается заметно быстрее, чем за секунду.
Но порт работает как обычный пайп, и в этом заключается компромисс. Ваш клиент обращается к сайту напрямую через туннель, поэтому анблокер, ваши правила validate и решение проверок на базе браузера не участвуют в этом маршруте. Учитываются и байты: страница с отказом, полученная через открытый туннель, тарифицируется как обычный трафик, тогда как в API неуспешный request не оплачивается. Передавайте обычные байты через порт, а сложные страницы с защитой направляйте в API.
Для продвинутых пользователей
Когда лимит premium исчерпан, три маршрута в эту сеть намеренно возвращают три разных результата. Соединение с явным указанием -network-premium отклоняется с ошибкой 403 с пояснением: если бы клиент молча получил ответ из другого места, он продолжал бы слать запросы, а затем искал бы в счете premium-трафик, которого нет. Резервный маршрут просто не активируется, а premium-настройка по умолчанию для пользователя proxy переключается на общую сеть, поэтому туннель все равно открывается. Ни в одном из этих случаев не было явного намерения тратить ресурсы на это соединение.
Три комбинации отклоняются сразу, а не выполняются частично: точный таргетинг в общей сети, -fallback-premium вместе с -network-premium, а также точный таргетинг при активном резервном маршруте. Порт поддерживает только CONNECT, поэтому клиент, отправляющий обычный request http:// вместо туннелирования, получает 405 (curl туннелирует его через --proxytunnel). Браузер, работающий через этот порт, всегда должен передавать имя сессии, так как загрузка одной страницы открывает десятки соединений.
Несколько воркеров, каждый со своим адресом? Задайте каждому собственное имя сессии:
import requests
TEMPLATE = "http://USERNAME-country-de-session-{name}:PASSWORD@proxy.foura.ai:34004"
def worker_session(name):
proxy = TEMPLATE.format(name=name)
s = requests.Session()
s.proxies = {"http": proxy, "https": proxy}
return s
workers = [worker_session(f"w{i}") for i in range(4)]
print(workers[0].get("https://example.com").status_code)
Dashboard делает то же самое в масштабе: включите Sticky, укажите количество, и вкладка Connection string выведет по одной строке на адрес, в виде URL или host:port:user:pass для proxy менеджеров. Непонятна причина отказа? Добавьте -sv к вызову curl и передайте через пайп 2>&1 | grep -i x-foura-error. Все опции описаны в справочнике proxy портов, а настройки Dashboard в Proxy Users.
Что дальше
Первый клиент, который мы построили на proxy users, это наш собственный. FourA Chrome extension направляет ваш браузер через одного из них: выберите сеть и страну, включите переключатель, и строка состояния покажет адрес, который видят сайты. Это бета-версия, ее нет в Chrome Web Store, установка выполняется через раздел Tools в Dashboard в режиме разработчика. В дальнейших планах биллинг для организаций в публичном roadmap. Это важно, так как proxy user организации тарифицируется на владельца этой организации.
Proxy URL это старейший контракт интеграции, и любой ваш инструмент уже умеет с ним работать. Сложнее всего было сделать правильно не сам туннель. Главное, что именно может означать строка перед ним, и что происходит, когда вы ошибаетесь в ее формате.