CAPTCHA в SDK и API
Автоматическая обработка одинакова для PHP, JavaScript, TypeScript и Python. Она не привязана к домену целевого сайта. Для стандартного виджета достаточно обычного запроса или открытия браузерной страницы. Поддерживаемые типы, настройки источника, срок прогона, бюджет и правила доступа продолжают действовать.
Автоматический режим и отключение
| Язык | HTTP без автоматического прохождения | Браузерная сессия без автоматического прохождения |
|---|---|---|
| PHP | $ctx->http()->get($url, autoCaptcha: false) |
$ctx->browser()->open($url, autoCaptcha: false) |
| JavaScript | await ctx.http().get(url, false) |
await ctx.browser().open(url, [], {}, false) |
| TypeScript | await ctx.http().get(url, false) |
await ctx.browser().open(url, [], {}, false) |
| Python | ctx.http().get(url, auto_captcha=False) |
ctx.browser().open(url, auto_captcha=False) |
Если аргумент не передан, автоматический режим включён. У HTTP-клиента этот параметр есть также у post, request, pool, pages, tryJson; в Python последний метод называется try_json. В post и request аргумент следует после тела запроса. Отключение HTTP действует на данный вызов; отключение при browser.open действует на всю созданную сессию, её переходы, действия и чтение HTML.
HTTP-загрузка может перейти в браузер, если это разрешено настройками источника. При отключённом автоматическом режиме такой переход не включает прохождение CAPTCHA. Для интерактивной формы используйте браузер и закрывайте страницу в finally.
Признак успешного результата
PHP:
$page = $ctx->browser()->open($url, [], ['success_selector' => '.product-card']);
try {
$page->waitFor('.product-card', 15000);
$html = $page->content();
} finally {
$page->close();
}
JavaScript и TypeScript:
const page = await ctx.browser().open(url, [], { success_selector: '.product-card' });
try {
await page.waitFor('.product-card', 15000);
const html = await page.content();
} finally {
await page.close();
}
Python:
page = ctx.browser().open(url, captcha_hints={"success_selector": ".product-card"})
try:
page.wait_for(".product-card", 15000)
html = page.content()
finally:
page.close()
Используйте селектор результата именно вашей операции. Он не должен постоянно присутствовать до проверки. Для обычной формы успешное заполнение CAPTCHA ещё не означает отправку формы: заполните её поля и нажмите кнопку средствами SDK. Затем проверьте ответ сервера и содержимое записей. HTTP 200 и непустое поле ответа CAPTCHA сами по себе не подтверждают успех.
Явная проверка после действия
После появления новой CAPTCHA доступен $page->solveCaptcha($hints) в PHP, await page.solveCaptcha(hints) в JavaScript/TypeScript и page.solve_captcha(hints) в Python. Метод возвращает страницу для продолжения работы, а не отчёт о допуске к данным.
Явный вызов запрашивает прохождение даже при autoCaptcha=false этой сессии. Он не отменяет отключение функции у сайта, ограничения тарифа и бюджета. Если нужно полностью исключить платные задания, отключите автоматический режим и не вызывайте этот метод.
Параметры hints
| Поле | Когда нужно |
|---|---|
kind |
Необязательный тип: smartcaptcha, yandex_image, yandex_text, turnstile, recaptcha_v2, recaptcha_v3 |
sitekey |
Открытый ключ виджета, если не определился автоматически |
action |
Действие reCAPTCHA v3 |
invisible |
Логическое значение для невидимого виджета |
callback |
Имя существующего callback, если требует интеграция сайта; не исполняемый код |
success_selector |
CSS-селектор нового результата успешной операции |
submit_selector |
CSS-селектор кнопки подтверждения, если сайт не продолжает автоматически |
image_selector |
CSS-селектор только изображения задания |
instructions_selector |
Изображение с порядком выбора объектов для yandex_image |
answer_selector |
Поле ввода ответа для yandex_text |
Передавайте hints третьим аргументом browser.open либо в явном методе проверки. В Python используется именованный captcha_hints. Секретный ключ сайта и содержимое всей страницы сюда не передаются. Новые задания обрабатываются в той же сессии до предела попыток; изменившееся задание не получает старый ответ. Не создавайте бесконечные повторы при отказе.
Настройки через REST API
Аутентификация: Bearer API-ключ пространства. Изменение сайта требует прав записи; доступ к чужому пространству не предоставляется. PATCH /api/v1/sites/{site} принимает настройки в params.captcha:
{
"params": {
"captcha": {
"enabled": true,
"hints": {"success_selector": ".product-card"}
}
}
}
Сначала прочитайте текущие params и объедините параметры клиента: PATCH верхнего уровня не означает поэлементное слияние всех вложенных объектов. Для отключения укажите enabled:false. Для агента у сайта задаются execution_target:"agent" и agent_id своего пространства.
POST /api/v1/script-versions/{version}/trial-run запускает пробную версию. Параметр params.auto_captcha действует, только если ваш исходник читает его через ctx.param и передаёт в SDK; сам по себе произвольный параметр не меняет поведение кода. Смотрите состояние через GET /api/v1/runs/{run}, сообщения через /log, результат через /preview. После проверки публикуйте версию штатным методом; это отдельное действие.
GET /api/v1/billing возвращает блок captcha: enabled, limit, used, remaining, unlimited, payg, period_end, per_run, prices, plan_limits, maximum_spending_limit. В prices находятся id, name, minimum, maximum, available, spending_limit. Денежные значения делите на unit из ответа; это стоимость одного задания. Для цены за 1 000 умножьте результат на 1 000. minimum:null означает отсутствие опубликованной нижней границы, а не бесплатное задание. Настройки стоимости меняются в приложении; отдельного публичного REST-метода прохождения CAPTCHA нет.
Ошибки, агент и проверка
Неизвестный тип, непринятый ответ, исчерпание количества или бюджета, превышение предела цены, отмена и окончание времени не должны превращаться в успешную пустую выгрузку. SDK сообщает ошибку; у прогона проверьте status и error. Готовый ответ может учитываться в расходах при отказе сайта. При неопределённом результате дождитесь сверки резерва.
На агенте используются те же методы и hints, без дополнительных ключей CAPTCHA. Связь с Akmelo должна работать. Количество попыток и расходы относятся к пространству агента.
Проверьте три ситуации: страница без CAPTCHA; форма с настоящим подтверждённым результатом; та же форма при отключении автоматического режима. Для выбора объектов дополнительно проверьте именно визуальное задание: текстовый вариант не заменяет этот тест.
Руководство пользователя · PHP · JavaScript · TypeScript · Python · Цены
spending_limit и maximum_spending_limit также выражены во внутренних денежных единицах за одно задание. Нулевой предел типа отключает платные задания; null возвращает общий предел. В приложении эти значения показаны в рублях за 1 000 заданий.
Разборы сценариев по языкам
В каждом SDK есть группа «Работа с CAPTCHA»: общий алгоритм и 12 подробных разборов с полным кодом.
PHP · JavaScript · TypeScript · Python
Явный API заданий
В SDK есть ctx.captcha() (PHP: $ctx->captcha()) для заданий, которые разработчик создаёт явно: актуальные типы, схемы, оценка цены, отправка, чтение статуса, ожидание и обратная связь. Новые типы этого каталога не определяются и не применяются браузером автоматически. Внешний ключ не нужен; вся работа учитывается в пространстве.
PHP · JavaScript · TypeScript · Python
Каталог и оценка цены не создают платное задание. Его создаёт createTask (Python: create_task). Вернувшийся taskId принадлежит Akmelo. getTaskResult читает его, waitForResult ожидает без новой отправки. Предел options.maxCost задаётся в микро₽: 1 000 000 единиц = 1 ₽. Полученный ответ сам по себе не доказывает принятие сайтом. Таймаут ожидания и остановка прогона не обещают отмену задания или возврат.