API — Пул портов
Открывайте пулы портов и управляйте ими — это партии портов, открываемых из списка прокси для крупных параллельных задач, — а затем экспортируйте результаты.
Открытие пула
/api/v1/scraper/tasksТребуется авторизацияОткрывает пул портов из списка прокси.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
name | string | Да | Имя пула. |
source | object | Да | Откуда берётся список прокси: kind — "file", "url" или "inline"; location — путь или ссылка; content несёт сам список для "inline". Необязательный refresh_interval перечитывает источник и задаётся целым числом НАНОСЕКУНД: 10 минут — это 600000000000, минута — 60000000000, 30 секунд — 30000000000. По умолчанию 10 мин; всё, что меньше 30 с, молча поднимается до 30 с и в ответе никак не отмечается — присланное 600 означает 600 наносекунд, и источник, в том числе внешний URL, будет перечитываться каждые 30 секунд. Поле default_scheme применяется к записям вида host:port без схемы (по умолчанию socks5). |
target | int | Да | Сколько портов должен открыть пул. |
port_lo | int | Нет | Нижняя граница диапазона локальных портов, которым пул может пользоваться. |
port_hi | int | Нет | Верхняя граница диапазона. |
protocol | string | Нет | Протокол портов пула: "socks5" (по умолчанию) или "http". |
up_policy | object | Нет | Как часто порт меняет выходящий прокси. mode — "requests" (каждые n соединений), "minutes" (каждые n минут) или "on_error" (держать прокси, пока клиенту не будет отдана ошибка). По умолчанию — на каждом запросе. 🔴 При js_solver: true расписание НЕ ДЕЙСТВУЕТ: и up_policy, и fp_policy принудительно заменяются на «без частоты». Порт берёт выходящий прокси на первом соединении и держит его вместе с личностью всё время жизни порта; смена выхода происходит только внеочередно, после ошибки соединения (личность при этом не меняется). Единственное исключение — mode: on_error: он принуждение переживает и работает как описано. |
fp_policy | object | Нет | Как часто порт меняет личность — тот же вид и те же три режима. По умолчанию — каждые 10 запросов. 🔴 То же принуждение при js_solver: true, см. up_policy выше: личность порта не меняется по расписанию совсем — кроме режима on_error. |
device | string | Нет | Семейство браузера для личностей пула, например "chrome". Список — в GET /api/v1/scraper/device_matrix. |
device_os | string | Нет | Операционная система для личностей пула, например "windows". |
profile_source | string | Нет | Откуда берутся личности: "auto" генерирует их на лету, "db" берёт из выверенной базы. |
auto_ua | bool | Нет | Выбирать личность по User-Agent запроса, а не по настройке пула. |
spoof_headers | bool | Нет | Переписывать исходящие заголовки под текущий браузер. Рекомендуется для скраперов, включено по умолчанию. |
connect_timeout_seconds | int | Нет | Потолок одной попытки набора для каждого порта пула, в секундах. По умолчанию 5. |
request_timeout_seconds | int | Нет | Бюджет молчания для каждого порта пула, в секундах: фаза набора вместе с повторами, затем ожидание первого байта. По умолчанию 30, значение 0 снимает ограничение. |
idle_timeout_sec | int | Нет | Таймаут простоя соединения на порте пула, в секундах: соединение закрывается, если столько времени в нём нет байтов. По умолчанию 60. Не путать с idle_seconds — тот закрывает сам порт. Прежнее имя request_timeout_sec по-прежнему принимается при чтении пула, сохранённого более ранней версией. |
idle_seconds | int | Нет | Время жизни порта, в секундах. Пул по умолчанию держит свои порты открытыми (0). |
curl -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"tiktok-pool","target":100,"port_lo":20000,"port_hi":30000,
"protocol":"socks5",
"source":{"kind":"file","location":"C:/proxies.txt"},
"up_policy":{"mode":"requests","n":1},
"fp_policy":{"mode":"requests","n":10},
"connect_timeout_seconds":5,"request_timeout_seconds":30}' \
http://127.0.0.1:8891/api/v1/scraper/tasks{
"id": "pool-7f3a",
"export_token": "3b91c0d4e5f6",
"warnings": null
}
🔴 id и export_token берутся ОТСЮДА: id подставляется в /scraper/tasks/{id}/…, а export_token — в адрес выгрузки /export/{token}/proxies.txt. Другого места, где их видно, нет — кроме GET /api/v1/scraper/tasks. warnings несёт РОВНО ОДНО замечание — «opened N of M ports (range LO-HI too small or ports busy)», если удалось открыть меньше портов, чем просили в target; если открылись все, поле приходит как null. Про источник прокси warnings не сообщает НИЧЕГО: ни сколько записей не разобралось, ни того, что источник вовсе не прочитался (404 или таймаут по URL, отсутствующий файл). В этом случае пул всё равно поднимается — с пустым списком выходов — и отвечает 200, а узнать о беде можно только по отказам трафика. Проверять источник надо ЗАРАНЕЕ, отдельной ручкой POST /api/v1/scraper/probe: она возвращает total (пригодных записей) и bad (битых).
403 «the scraper port pool requires a Pro license (single-thread Lite cannot open a port pool)» на тарифе Lite; 503 «scraper manager not configured», если пул в этой сборке не поднят; 400 с объяснением, если конфигурация не сходится: port_lo больше port_hi, target меньше 1, неизвестное значение profile_source, up_policy.mode, fp_policy.mode или vdns_mode, неизвестная либо несовместимая пара device и device_os. 🔴 Диапазон, которого не хватает на target, отказом НЕ является: пул открывает столько портов, сколько поместилось — в том числе НИ ОДНОГО, если все они заняты, — отвечает 200 и кладёт в warnings строку вида «opened 11 of 100 ports (range 20000-20010 too small or ports busy)». Поэтому проверяйте warnings, а не только код ответа.
Два умолчания ставятся на СОЗДАНИИ, а не хранятся в конфигурации: protocol, если он не задан, становится socks5 (чтобы работали UDP и HTTP/3), а vdns_mode — forced, то есть имя цели резолвится на стороне выхода и не утекает в DNS вашей сети. Явное "off" остаётся выключением.
Продвинутые настройки портов пула
Пул открывает свои порты сам, поэтому настройка, не доехавшая до него, останется умолчанием — а форма при этом будет выглядеть применённой. Поля ниже кладутся на каждый порт пула.
| Поле | Тип | Что делает |
|---|---|---|
js_solver | bool | Challenge Breaker на каждом порте пула: запросы, упёршиеся в проверку, уходят в пул решателя. Требует вскрытия TLS — несовместим с tls_passthrough. 🔴 Делает порт липким: up_policy и fp_policy пула перестают действовать по расписанию — один выходящий IP и одна личность на порт на всё время его жизни (исключения: режим on_error и внеочередная смена выхода после ошибки соединения). Так задумано: сессия, добытая разбором защиты, привязана к паре «выход + отпечаток», и смена любого из них посреди сессии её выбрасывает. Разнообразие выходов даёт ЧИСЛО портов пула, а не частота ротации — увеличивайте target и диапазон портов. Заметить подмену по API нельзя: GET /api/v1/scraper/tasks/{id}/config вернёт исходные up_policy и fp_policy, потому что принуждение применяется к работающему порту, а не к сохранённой конфигурации. |
captcha_action | string | Что делать, когда попалась капча, а не проверка без участия человека: rotate_retry (по умолчанию) — сменить личность и повторить; return_to_script — отдать челлендж вашему коду. |
captcha_max_attempts | int | Сколько раз повторять со сменой личности при rotate_retry. По умолчанию 3. |
keep_sessions | bool | Каждый порт пула держит свою банку кук по доменам: впитывает Set-Cookie, подставляет куки и идёт по перенаправлениям. От js_solver не зависит. |
cache_mode | string | Режим кэша на портах пула: normal, hard, hard-media или hard-autowarm. |
cache_ignore_no_cache | bool | Кэшировать вопреки заголовку no-cache. |
vdns_mode | string | Виртуальный DNS: off, on_leak или forced. 🔴 У НОВОГО пула, если поле не задано, ставится forced — имя цели резолвится на стороне выхода и не утекает в DNS вашей сети. |
leak_guard | string | Предстартовая проверка утечек для портов пула: off, warn или enforce. |
force_ipv4 | bool | Выходить только по IPv4. |
tls_passthrough | bool | Пропускать TLS насквозь. Тогда ни кэш, ни журнал, ни Challenge Breaker на портах пула не работают: содержимое не читается. |
tls_mirror | bool | Повторять наружу снятый отпечаток самого клиента вместо профиля. |
h2_spoofing | bool | Подменять параметры HTTP/2 под профиль браузера. |
spoof_user_agent | bool | Подменять User-Agent. Выключено — заголовок вашего клиента идёт байт в байт. |
enable_http3 | bool | Переоткрывать соединение по HTTP/3 там, где сайт предлагает h3. |
upstream_tls_insecure | bool | Снять проверку сертификата у https-прокси. Только для своего прокси с самоподписанным сертификатом. |
allow_mitm_upstream | bool | Разрешить выход, который сам вскрывает TLS. По умолчанию запрещено: такой выход стирает отпечаток. |
max_concurrent | int | Предел одновременных запросов на КАЖДОМ порте пула; 0 — без предела. |
sem_timeout | int | Сколько секунд запрос ждёт места в этом пределе. |
skip_retry | bool | Не повторять запрос после сетевой ошибки. |
retry_delay_ms | int | Пауза между повторами, миллисекунды. |
Список и остановка пулов
/api/v1/scraper/tasksТребуется авторизацияСнимок всех пулов: сколько портов открыто, какие именно и в каком диапазоне они выданы.
curl -H "X-API-Key: YOUR_API_KEY" \
http://127.0.0.1:8891/api/v1/scraper/tasks[
{
"id": "pool-7f3a",
"name": "catalogue-pool",
"target": 100,
"ports_up": 98,
"ports": [20000, 20001, 20002],
"export_token": "3b91c0d4e5f6",
"port_lo": 20000,
"port_hi": 30000
}
]- Пустой массив означает, что ни одного пула сейчас нет — это не ошибка. 503 «scraper manager not configured», если пул в этой сборке не поднят.
- Числа прокси в источнике и состояния ротации в ответе НЕТ: сколько записей в источнике — отвечает POST /api/v1/scraper/probe (поле total), а какая ротация настроена — GET /api/v1/scraper/tasks/{id}/config (up_policy и fp_policy). Поле ports_up — счётчик поднятых портов, а ports — их номера.
/api/v1/scraper/tasks/{id}Требуется авторизацияОстанавливает пул и закрывает все его порты. Трафик, идущий через них, обрывается.
curl -X DELETE -H "X-API-Key: YOUR_API_KEY" \
http://127.0.0.1:8891/api/v1/scraper/tasks/pool-7f3a{
"ok": true
}- 404 с текстом менеджера, если пула с таким идентификатором нет.
/api/v1/scraper/tasks/{id}/testТребуется авторизацияПрогоняет полную проверку порта пула — ту же, что POST /api/v1/port/{port}/test, — на одном из живых портов и возвращает, какой порт проверялся.
curl -X POST -H "X-API-Key: YOUR_API_KEY" \
http://127.0.0.1:8891/api/v1/scraper/tasks/pool-7f3a/test{
"port": 20134,
"report": { "leak": { "…": "…" }, "fingerprint": { "match": true },
"udp": { "supported": true }, "ok": true }
}- 409 «scraper task has no open ports yet», пока пул не поднял ни одного порта, и 409 «scraper task ports are not live», если порты уже не работают. 404, если пула нет.
/api/v1/scraper/tasks/{id}/configТребуется авторизацияВозвращает сохранённую конфигурацию пула в том самом виде, который принимает POST /api/v1/scraper/tasks: правку делают остановкой и повторным запуском.
curl -H "X-API-Key: YOUR_API_KEY" \
http://127.0.0.1:8891/api/v1/scraper/tasks/pool-7f3a/config{
"id": "pool-7f3a",
"name": "catalogue-pool",
"port_lo": 20000,
"port_hi": 30000,
"target": 100,
"protocol": "socks5",
"source": { "kind": "file", "location": "C:/proxies.txt" },
"up_policy": { "mode": "requests", "n": 1 },
"fp_policy": { "mode": "requests", "n": 10 },
"vdns_mode": "forced",
"export_token": "3b91c0d4e5f6"
}- 404 «task not found». Конфигурация несёт и продвинутые поля, которых нет в таблице открытия: cache_mode, leak_guard, js_solver, keep_sessions, captcha_action и три тайм-аута порта.
/api/v1/scraper/device_matrixТребуется авторизацияПеречисляет сочетания браузера и операционной системы, из которых можно собрать пул.
curl -H "X-API-Key: YOUR_API_KEY" \
http://127.0.0.1:8891/api/v1/scraper/device_matrix{
"chrome": ["windows", "macos", "linux", "android", "ios"],
"edge": ["windows", "macos", "linux", "android", "ios"],
"firefox": ["windows", "macos", "linux", "android", "ios"],
"safari": ["macos", "ios"]
}- Значения отсюда кладут в поля device и device_os при открытии пула.
- Единственное, чего не бывает, — Safari вне техники Apple. Таблица описывает, что примет проверка при ЯВНОМ выборе; device: random тянет более узкий набор — без iOS у Chrome, Firefox и Edge и без Android у Firefox и Edge, — на такие пары попадают только явным указанием.
/api/v1/scraper/probeТребуется авторизацияСкачивает и разбирает источник прокси, НЕ запуская пул: сколько записей пригодно, сколько битых, какие схемы встречаются и случайная выборка для собственной проверки связности.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
source | object | Да | Тот же объект источника, что у открытия пула: kind (file, url или inline), location и content. |
{ "source": { "kind": "url", "location": "https://example.com/proxies.txt" } }curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"source":{"kind":"url","location":"https://example.com/proxies.txt"}}' \
http://127.0.0.1:8891/api/v1/scraper/probe{
"total": 13045,
"bad": 210,
"by_scheme": { "socks5": 12835, "http": 210 },
"sample": ["socks5://203.0.113.10:1080", "socks5://203.0.113.11:1080"]
}- 400 с объяснением, если источник не скачался или не разобрался. Тело ограничено 32 МиБ — столько весит список, вставленный целиком; проверка ограничена 35 секундами.
- 403 при неактивной лицензии: ручка за лицензией, как и остальные проверки выхода.
Экспорт результатов
/export/{token}/proxies.txtБез авторизацииСкачивает порты пула в виде списка прокси в текстовом формате. Доступ предоставляется по токену в URL, поэтому API-ключ не требуется.
curl http://127.0.0.1:8891/export/TASK_TOKEN/proxies.txt