К содержимому

Документация

PHP SDK: Браузер: открытие страницы

Для простого получения HTML после JavaScript достаточно браузерного режима сайта и обычного HTTP-клиента. Этот объект нужен, когда надо нажимать кнопки, вводить текст и прокручивать страницу.

Общий справочник SDK

Методы

open

open(string $url, array $capture = [], array $captchaHints = [], bool $autoCaptcha = true): BrowserPage

Открыть страницу в управляемом браузере.

$page = $ctx->browser()->open($ctx->param('catalog_url'));
try { $html = $page->waitFor('.product-card')->content(); }
finally { $page->close(); }

Результат и особенности. Возвращает BrowserPage. Не более двух открытых страниц. Загрузка страницы не гарантирует появления нужных данных: добавьте waitFor.

Сетевые ответы страницы

Второй аргумент включает захват до навигации. Это важно: страница часто запрашивает JSON сразу при открытии. Захватываются XHR и fetch, совпавшие с масками полного URL. Символ * означает любые символы, включая / и параметры. Остальные символы, в том числе ?, буквальные. Например */api/products*.

Ниже учебный пример: API возвращает 200 товаров, интерфейс показывает только 20. URL и поля замените на настоящие. Запрос выполняет сама страница со своими cookies и заголовками; второй HTTP-запрос не отправляется.

<?php
function run(\Sdk\Context $ctx): void
{
    $url = (string) $ctx->param('catalog_url');
    $page = $ctx->browser()->open($url, ['*/api/products*']);
    try {
        $response = $page->waitForResponse('*/api/products*', 15000);
        if ($response === null) {
            $ctx->abort('Страница не получила ответ API за 15 секунд');
        }
        if ($response['error'] !== null || $response['truncated']) {
            $ctx->abort('Тело ответа недоступно: ' . ($response['error'] ?? 'обрезано'));
        }
        if ($response['status'] !== 200) {
            $ctx->abort('API ответил HTTP ' . $response['status']);
        }
        $data = $ctx->json($response['body']);
        $items = $data['items'] ?? [];
        foreach ($items as $item) {
            $ctx->emit(['name' => $item['name'], 'price' => $item['price']], (string) $item['id']);
        }
        $ctx->log('Прочитаны товары из ответа браузера', ['count' => count($items)]);
    } finally {
        $page->close();
    }
}

Если API тоже использует пагинацию, один ответ не содержит весь каталог. Настройте захват до клика на следующую страницу и повторяйте обработку ответов. Подробности: методы BrowserPage.

Захват наблюдает ответы, не меняет запросы и не подменяет данные сайта. Произвольные обработчики JavaScript в браузере не исполняются. Используются штатная защита сетевых адресов, прокси сайта и обычный учёт браузерной обработки в лимитах.

Автоматическое прохождение CAPTCHA

Параметр autoCaptcha необязательный, по умолчанию true. Передайте false, чтобы отключить автоматическое прохождение. При false платные задания автоматически не запускаются. Общие настройки, поддерживаемые типы проверок и квоты продолжают действовать. Выбор действует на всю браузерную сессию, включая следующие действия и чтение содержимого.

$page = $ctx->browser()->open($url, autoCaptcha: false);

CAPTCHA на своём агенте

Автоматический режим и отключение работают на агенте. Нужны браузер, связь с Akmelo и тариф с доступными агентами. Дополнительные ключи CAPTCHA настраивать не требуется. Проверки и стоимость относятся к пространству агента; локальное выполнение не делает их бесплатными.

Учебная форма Яндекс SmartCaptcha

На официальном демо можно проверить всю форму без регистрации. CAPTCHA обрабатывается автоматически; сценарий заполняет учебное имя и отправляет форму. Используйте тестовые значения.

$page = $ctx->browser()->open('https://smartcaptcha.yandexcloud.net/demo', [], ['success_selector' => '.greeting']);
try {
    $page->type('#name', 'Training example');
    $page->click('#smartcaptcha-demo-submit');
    $page->waitFor('.greeting', 15000);
    $ctx->log($ctx->dom($page->content())->text('.greeting') ?? '');
} finally { $page->close(); }

Заполненный smart-token означает готовность к отправке. Успех подтверждает только серверное приветствие с отправленным именем. Название CAPTCHA и новый пустой виджет рядом с приветствием не вызывают повторную оплату при чтении результата. Дополнительное визуальное задание обрабатывается в той же сессии до предела попыток; отмена и срок прогона останавливают цепочку. Неподдерживаемое задание или непринятый ответ остаётся ошибкой. На подключённом агенте работают те же методы SDK и hints.

Полный справочник CAPTCHA

SDK и REST API для CAPTCHA описывает все hints, значения по умолчанию, явный вызов, отключение, проверку результата, агенты, пределы и ошибки. Руководство пользователя и актуальные цены помогут настроить функцию и оплату.

Для выбора объектов используется kind: "yandex_image"; обычно тип определяется автоматически. image_selector указывает только картинку задания, instructions_selector порядок выбора, success_selector новый результат успешной операции. Список доменов целевых сайтов не нужен. Неизвестный вариант завершается ошибкой. Не запускайте бесконечные повторы при отказе.

Выбор объектов с явными селекторами

Замените примерные селекторы элементами своего источника. Оба селектора изображения должны указывать только картинки задания, а не всю страницу. Этот вариант нужен, если автоматического определения недостаточно.

$page = $ctx->browser()->open($url, [], [
    'kind' => 'yandex_image',
    'image_selector' => '.challenge-image',
    'instructions_selector' => '.challenge-order',
    'submit_selector' => '.challenge-submit',
    'success_selector' => '.result',
]);
try {
    $page->waitFor('.result', 15000);
} finally { $page->close(); }