Получить API ключ

Типы капч

reCAPTCHA v2#

Типы RecaptchaV2TaskProxyless и RecaptchaV2Task.

Параметр Обязательный Тип Описание
websiteURL да string Полный URL страницы, где размещена капча
websiteKey да string Значение атрибута data-sitekey виджета reCAPTCHA
isInvisible нет bool true для невидимой reCAPTCHA. По умолчанию false
recaptchaDataSValue нет string Значение параметра data-s, которое может потребоваться на сервисах Google
userAgent нет string User-Agent браузера, используемого для загрузки капчи
cookies нет string Cookies в формате name1=value1; name2=value2, если для решения важна сессия
apiDomain нет string Домен, с которого загружается reCAPTCHA: google.com или recaptcha.net. По умолчанию google.com

Только для RecaptchaV2Task (решение через ваш прокси), дополнительно:

Параметр Обязательный Тип Описание
proxyType да string http, socks4 или socks5
proxyAddress да string IP-адрес или хост прокси
proxyPort да int Порт прокси
proxyLogin нет string Логин для авторизации на прокси
proxyPassword нет string Пароль для авторизации на прокси

Примеры объекта task

// RecaptchaV2TaskProxyless
{
  "type": "RecaptchaV2TaskProxyless",
  "websiteURL": "https://example.com/login",
  "websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "isInvisible": false
}

// RecaptchaV2Task (ваш прокси)
{
  "type": "RecaptchaV2Task",
  "websiteURL": "https://example.com/login",
  "websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "proxyType": "http",
  "proxyAddress": "1.2.3.4",
  "proxyPort": 8080,
  "proxyLogin": "user",
  "proxyPassword": "password",
  "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "03AGdBq..."
  }
}

Значение solution.gRecaptchaResponse необходимо передать в виджет reCAPTCHA или в параметр g-recaptcha-response формы.

reCAPTCHA v2 Enterprise#

Типы RecaptchaV2EnterpriseTaskProxyless и RecaptchaV2EnterpriseTask.

Параметр Обязательный Тип Описание
websiteURL да string Полный URL страницы, где размещена капча
websiteKey да string Значение атрибута data-sitekey виджета reCAPTCHA Enterprise
enterprisePayload нет object Дополнительные параметры вызова grecaptcha.enterprise.render, если сайт их передаёт, например значение s
isInvisible нет bool true для невидимой reCAPTCHA. По умолчанию false
apiDomain нет string Домен, с которого загружается reCAPTCHA: google.com или recaptcha.net. По умолчанию google.com
userAgent нет string User-Agent браузера, используемого для загрузки капчи
cookies нет string Cookies в формате name1=value1; name2=value2, если для решения важна сессия

Только для RecaptchaV2EnterpriseTask (решение через ваш прокси), дополнительно:

Параметр Обязательный Тип Описание
proxyType да string http, socks4 или socks5
proxyAddress да string IP-адрес или хост прокси
proxyPort да int Порт прокси
proxyLogin нет string Логин для авторизации на прокси
proxyPassword нет string Пароль для авторизации на прокси

Примеры объекта task

// RecaptchaV2EnterpriseTaskProxyless
{
  "type": "RecaptchaV2EnterpriseTaskProxyless",
  "websiteURL": "https://example.com/login",
  "websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "isInvisible": false
}

// RecaptchaV2EnterpriseTask (ваш прокси)
{
  "type": "RecaptchaV2EnterpriseTask",
  "websiteURL": "https://example.com/login",
  "websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "isInvisible": false,
  "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...",
  "cookies": "foo=bar; baz=1",
  "proxyType": "http",
  "proxyAddress": "1.2.3.4",
  "proxyPort": 8080,
  "proxyLogin": "user",
  "proxyPassword": "password"
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "03AGdBq2kX9Lm...QpZr8vN3sT"
  }
}

Значение solution.gRecaptchaResponse передаётся так же, как токен обычной reCAPTCHA v2, в виджет или в параметр g-recaptcha-response формы.

Метод Enterprise использует API reCAPTCHA Enterprise. Если сайт передаёт дополнительные параметры через enterprisePayload, включите их в запрос.

reCAPTCHA v3#

Тип RecaptchaV3TaskProxyless. Прокси для v3 не требуется. Задачи решаются с IP-адресов сервиса.

Параметр Обязательный Тип Описание
websiteURL да string Полный URL страницы с капчей
websiteKey да string Site key виджета reCAPTCHA v3
minScore да float Требуемый score. Поддерживаются значения 0.3, 0.7 и 0.9
pageAction нет string Значение параметра action, которое сайт передаёт при вызове grecaptcha.execute()
isEnterprise нет bool true, если на сайте используется reCAPTCHA v3 Enterprise
apiDomain нет string Домен, с которого загружается скрипт reCAPTCHA: google.com или recaptcha.net. По умолчанию google.com

Пример объекта task

// RecaptchaV3TaskProxyless
{
  "type": "RecaptchaV3TaskProxyless",
  "websiteURL": "https://example.com/login",
  "websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "minScore": 0.3,
  "pageAction": "login",
  "isEnterprise": false
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "03AGdBq..."
  }
}

Полученный токен (solution.gRecaptchaResponse) используется так же, как обычный токен reCAPTCHA v3.

Поиск sitekey и callback-функции reCAPTCHA на странице#

Если на странице несколько виджетов reCAPTCHA или callback не виден напрямую в разметке, найти sitekey и функцию обратного вызова можно через объект ___grecaptcha_cfg, в котором Google хранит конфигурацию отрендеренных виджетов. Выполните следующий код в консоли разработчика или встроите его в скрипт автоматизации. Он вернёт массив найденных клиентов reCAPTCHA вместе с их sitekey, pageurl и ссылкой на callback.

function findRecaptchaClients() {
  // eslint-disable-next-line camelcase
  if (typeof (___grecaptcha_cfg) !== 'undefined') {
    // eslint-disable-next-line camelcase, no-undef
    return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
      const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' };
      const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object');

      objects.forEach(([toplevelKey, toplevel]) => {
        const found = Object.entries(toplevel).find(([_, value]) => (
          value && typeof value === 'object' && 'sitekey' in value && 'size' in value
        ));
     
        if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV') {
          data.pageurl = toplevel.baseURI;
        }
        
        if (found) {
          const [sublevelKey, sublevel] = found;

          data.sitekey = sublevel.sitekey;
          const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
          const callback = sublevel[callbackKey];

          if (!callback) {
            data.callback = null;
            data.function = null;
          } else {
            data.function = callback;
            const keys = [cid, toplevelKey, sublevelKey, callbackKey]
              .map((key) => `['${key}']`)
              .join('');

            data.callback = `___grecaptcha_cfg.clients${keys}`;
          }
        }
      });

      return data;
    });
  }

  return [];
}

Использование:

let res = findRecaptchaClients()
console.log(res)

Для каждого найденного клиента data.version указывает, используется ли v2 или v3. data.sitekey содержит значение для поля websiteKey в запросе createTask. data.callback содержит путь к функции обратного вызова, которую нужно выполнить с токеном после получения решения.

Cloudflare Turnstile#

Типы TurnstileTaskProxyless и TurnstileTask.

Параметр Обязательный Тип Описание
websiteURL да string Полный URL страницы, где расположен виджет Turnstile
websiteKey да string Значение атрибута data-sitekey виджета Turnstile
action нет* string Значение параметра action из вызова turnstile.render. Обязательно для страниц Cloudflare Challenge
data нет* string Значение параметра cData из вызова turnstile.render. Обязательно для страниц Cloudflare Challenge
pagedata нет* string Значение параметра chlPageData из вызова turnstile.render. Обязательно для страниц Cloudflare Challenge

Только для TurnstileTask (решение через ваш прокси), дополнительно:

Параметр Обязательный Тип Описание
proxyType да string http, socks4 или socks5
proxyAddress да string IP-адрес или хост прокси
proxyPort да int Порт прокси
proxyLogin нет string Логин для авторизации на прокси
proxyPassword нет string Пароль для авторизации на прокси

Примеры объекта task

// TurnstileTaskProxyless
{
  "type": "TurnstileTaskProxyless",
  "websiteURL": "https://example.com/login",
  "websiteKey": "0x4AAAAAAAxxxxxxxxxxxxxxxx"
}

// TurnstileTask (ваш прокси)
{
  "type": "TurnstileTask",
  "websiteURL": "https://example.com/login",
  "websiteKey": "0x4AAAAAAAxxxxxxxxxxxxxxxx",
  "proxyType": "http",
  "proxyAddress": "1.2.3.4",
  "proxyPort": 8080
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "token": "0.zxcv..."
  }
}

Полученный токен (solution.token) необходимо передать в callback-функцию виджета или в поле cf-turnstile-response, в зависимости от способа интеграции Turnstile на вашем сайте.

Сложный случай: Cloudflare Challenge page#

Отдельная и более сложная ситуация — страница Cloudflare Challenge. Помимо websiteKey, виджету передаются дополнительные параметры cData, chlPageData и action. В этом случае необходимо перехватить вызов turnstile.render, чтобы получить эти значения. Также необходимо перехватить определение callback-функции.

Для перехвата параметров встроите следующий JavaScript на страницу до загрузки самого виджета Cloudflare Turnstile:

const i = setInterval(() => {
  if (window.turnstile) {
    clearInterval(i)

    window.turnstile.render = (a, b) => {
      let p = {
        type: "TurnstileTaskProxyless",
        websiteKey: b.sitekey,
        websiteURL: window.location.href,
        data: b.cData,
        pagedata: b.chlPageData,
        action: b.action
      }

      console.log(JSON.stringify(p))
      window.tsCallback = b.callback

      return 'foo'
    }
  }
}, 10)

Скрипт заменяет turnstile.render собственной функцией. Она перехватывает объект конфигурации b, в котором Cloudflare передаёт sitekey, cData, chlPageData, action и callback. Скрипт выводит объект task для createTask и сохраняет ссылку на исходную callback-функцию в window.tsCallback, чтобы вызвать её позже с токеном.

Альтернативный подход — перехватить сетевой запрос к скрипту api.js и заменить его собственным скриптом. Этот скрипт возвращает необходимые параметры и делает callback-функцию глобально доступной.

Когда решение получено от getTaskResult, выполните сохранённую callback-функцию, передав токен в качестве аргумента:

window.tsCallback('ТОКЕН_ИЗ_SOLUTION');

Yandex SmartCaptcha#

Есть два способа решения Yandex SmartCaptcha: по токену и по изображению.

  • YandexSmartCaptchaTaskProxyless — решение токеном через наши прокси
  • YandexSmartCaptchaTask — решение токеном через ваши прокси
  • CoordinatesTask — решение по изображению, возвращает координаты кликов

Token-based solving#

Типы YandexSmartCaptchaTaskProxyless и YandexSmartCaptchaTask.

Параметр Обязательный Тип Описание
websiteURL да string Полный URL страницы, где загружена капча
websiteKey да string Значение sitekey из кода страницы или iframe капчи
userAgent нет string User-Agent, под которым решается капча
cookies нет string Cookies в формате name1=value1;name2=value2

Только для YandexSmartCaptchaTask (решение через ваш прокси), дополнительно:

Параметр Обязательный Тип Описание
proxyType да string http, https, socks4 или socks5
proxyAddress да string IP-адрес или хост прокси
proxyPort да int Порт прокси
proxyLogin нет string Логин для авторизации на прокси
proxyPassword нет string Пароль для авторизации на прокси

Примеры объекта task

// YandexSmartCaptchaTaskProxyless
{
  "type": "YandexSmartCaptchaTaskProxyless",
  "websiteURL": "https://example.com/login",
  "websiteKey": "Y5Lh0ti..."
}

// YandexSmartCaptchaTask (ваш прокси)
{
  "type": "YandexSmartCaptchaTask",
  "websiteURL": "https://example.com/login",
  "websiteKey": "Y5Lh0ti...",
  "proxyType": "http",
  "proxyAddress": "1.2.3.4",
  "proxyPort": 8080
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "token": "dV9xNjYyNTU3NjkxO4k9OTQuNVMuMjkuMjM9..."
  }
}

solution.token необходимо использовать в поле smart-token или передать на бэкенд вашего сайта так же, как при ручном решении капчи.

Image-based Yandex SmartCaptcha#

Картиночный вариант решается с помощью CoordinatesTask и возвращает координаты кликов.

Параметр Обязательный Тип Описание
body да string Изображение капчи в Base64. Также поддерживается формат Data URI
imgType да string Режим капчи: smart_captcha
imgInstructions нет* string Изображение-инструкция в Base64. Обязательно при imgType=smart_captcha
comment нет* string Текстовая подсказка воркеру. Рекомендуется при imgType=smart_captcha, например select objects in the order of the instruction

Пример объекта task

{
  "type": "CoordinatesTask",
  "body": "BASE64_IMAGE",
  "imgType": "smart_captcha",
  "imgInstructions": "BASE64_INSTRUCTION_IMAGE",
  "comment": "select objects in the order of the instruction"
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "coordinates": [
      { "x": 57, "y": 82 },
      { "x": 239, "y": 75 },
      { "x": 138, "y": 113 }
    ]
  }
}

Для smart_captcha передавайте imgInstructions с визуальной инструкцией. Используйте comment, чтобы при необходимости уточнить требуемое действие.

Остальные опциональные поля CoordinatesTask, такие как minClicks и maxClicks, описаны в секции Coordinates ниже.

Изображение в текст (Image to Text)#

Тип ImageToTextTask. Прокси не требуется. Изображение капчи отправляется напрямую.

Параметр Обязателен Тип Описание
body да string Изображение капчи в Base64. Также поддерживается формат Data URI
phrase нет bool true, если ответ должен содержать как минимум два слова, разделённых пробелом. По умолчанию false
case нет bool true, если результат чувствителен к регистру. По умолчанию false
numeric нет int Подсказка по набору символов: 0 — без ограничений, 1 — только цифры, 2 — только буквы, 3 — только цифры или буквы, 4 — обязательно должны присутствовать и цифры, и буквы
math нет bool true, если капча требует выполнить вычисление. По умолчанию false
minLength нет int Минимальная длина ответа. 0 означает отсутствие минимального ограничения
maxLength нет int Максимальная длина ответа. 0 означает отсутствие максимального ограничения
comment нет string Подсказка воркеру, который решает изображение
imgInstructions нет string Опциональное изображение-инструкция в Base64, которое показывается воркеру вместе с изображением капчи

Пример объекта task

{
  "type": "ImageToTextTask",
  "body": "iVBORw0KGgoAAAANSUhEUgAA...",
  "numeric": 1,
  "minLength": 4,
  "maxLength": 6
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "text": "aB3fX9"
  }
}

solution.text — распознанный текст. Передайте его в целевое поле формы так же, как ответ, введённый вручную.

Coordinates#

Тип CoordinatesTask. Прокси не требуется. Изображение капчи отправляется напрямую. Воркер определяет нужные точки на изображении, а API возвращает их координаты.

Параметр Обязателен Тип Описание
body да string Изображение капчи в Base64. Также поддерживается формат Data URI
comment нет string Подсказка воркеру, который решает изображение, например click on the green apple
imgInstructions нет string Опциональное изображение-инструкция в Base64, которое показывается воркеру вместе с изображением капчи
minClicks нет int Минимальное количество кликов по изображению. По умолчанию 1
maxClicks нет int Максимальное количество кликов по изображению

Пример объекта task

{
  "type": "CoordinatesTask",
  "body": "iVBORw0KGgoAAAANSUhEUgAA...",
  "comment": "click on the green apple"
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "coordinates": [
      {
        "x": 358,
        "y": 268
      }
    ]
  }
}

solution.coordinates — массив позиций {x, y} в пикселях. Кликните по каждой позиции в возвращённом порядке или используйте координаты в соответствии с вашей интеграцией.

CoordinatesTask также используется для картиночного варианта Yandex SmartCaptcha. См. раздел Image-based Yandex SmartCaptcha выше.

GeeTest v3#

Типы GeeTestTaskProxyless и GeeTestTask. Эти же типы используются для GeeTest v4. Версия выбирается с помощью поля version. По умолчанию используется версия 3.

Параметр Обязательный Тип Описание
websiteURL да string Полный URL страницы, где расположен виджет GeeTest
version нет int Версия GeeTest: 3 или 4. По умолчанию 3
gt да string Публичное значение gt виджета GeeTest
challenge да string Значение challenge для текущей сессии, полученное со страницы. Получайте новое значение для каждой задачи
geetestApiServerSubdomain нет string Пользовательский поддомен API-сервера GeeTest, если страница его использует
initParameters нет object Дополнительные параметры, передаваемые при инициализации GeeTest
userAgent нет string User-Agent браузера, используемого для загрузки капчи
risk_type нет string Динамическое значение risk_type, передаваемое в запросе загрузки капчи

Только для GeeTestTask (решение через ваш прокси), дополнительно:

Параметр Обязательный Тип Описание
proxyType да string http, socks4 или socks5
proxyAddress да string IP-адрес или хост прокси
proxyPort да int Порт прокси
proxyLogin нет string Логин для авторизации на прокси
proxyPassword нет string Пароль для авторизации на прокси

Примеры объекта task

// GeeTestTaskProxyless
{
  "type": "GeeTestTaskProxyless",
  "websiteURL": "https://example.com/login",
  "gt": "f2ae6cadcf7886856696c46d84d109d1",
  "challenge": "12345678abc90123d45678e90123f45g6"
}

// GeeTestTask (ваш прокси)
{
  "type": "GeeTestTask",
  "websiteURL": "https://example.com/login",
  "gt": "f2ae6cadcf7886856696c46d84d109d1",
  "challenge": "12345678abc90123d45678e90123f45g6",
  "proxyType": "http",
  "proxyAddress": "1.2.3.4",
  "proxyPort": 8080
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "challenge": "12345678abc90123d45678e90123f45g6",
    "validate": "0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p",
    "seccode": "0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p|jordan"
  }
}

Передайте solution.validate и solution.seccode в callback GeeTest на странице в соответствии с интеграцией целевого сайта.

GeeTest v4#

Те же типы, что и для GeeTest v3: GeeTestTaskProxyless и GeeTestTask. Установите version в 4, чтобы использовать GeeTest v4.

Параметр Обязательный Тип Описание
websiteURL да string Полный URL страницы, где расположен виджет GeeTest v4
version да int Должно быть 4
initParameters да object Должен содержать captcha_id, статический идентификатор капчи виджета
userAgent нет string User-Agent браузера, используемого для загрузки капчи
risk_type нет string Динамическое значение risk_type, передаваемое в запросе загрузки капчи

Только для GeeTestTask (решение через ваш прокси), дополнительно:

Параметр Обязательный Тип Описание
proxyType да string http, socks4 или socks5
proxyAddress да string IP-адрес или хост прокси
proxyPort да int Порт прокси
proxyLogin нет string Логин для авторизации на прокси
proxyPassword нет string Пароль для авторизации на прокси

Примеры объекта task

// GeeTestTaskProxyless (v4)
{
  "type": "GeeTestTaskProxyless",
  "websiteURL": "https://example.com/login",
  "version": 4,
  "initParameters": {
    "captcha_id": "e392e65f912c780f2c3ebac7702651de"
  }
}

// GeeTestTask (v4, ваш прокси)
{
  "type": "GeeTestTask",
  "websiteURL": "https://example.com/login",
  "version": 4,
  "initParameters": {
    "captcha_id": "e392e65f912c780f2c3ebac7702651de"
  },
  "proxyType": "http",
  "proxyAddress": "1.2.3.4",
  "proxyPort": 8080
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "captcha_id": "e392e65f912c780f2c3ebac7702651de",
    "lot_number": "...",
    "pass_token": "...",
    "gen_time": "...",
    "captcha_output": "..."
  }
}

solution.lot_number, pass_token, gen_time и captcha_output вместе образуют результат GeeTest v4. Передайте их в callback GeeTest на странице без изменений.

Tencent#

Типы TencentTaskProxyless и TencentTask.

Параметр Обязательный Тип Описание
websiteURL да string Полный URL страницы, где загружена капча
appId да string Значение параметра appId из исходного кода страницы
captchaScript нет string URL скрипта капчи из исходного кода страницы. По умолчанию: https://turing.captcha.qcloud.com/TCaptcha.js

Только для TencentTask (решение через ваш прокси), дополнительно:

Параметр Обязательный Тип Описание
proxyType да string http, socks4 или socks5
proxyAddress да string IP-адрес или хост прокси
proxyPort да int Порт прокси
proxyLogin нет string Логин для авторизации на прокси
proxyPassword нет string Пароль для авторизации на прокси

Примеры объекта task

// TencentTaskProxyless
{
  "type": "TencentTaskProxyless",
  "websiteURL": "https://example.com/login",
  "appId": "190014885"
}

// TencentTask (ваш прокси)
{
  "type": "TencentTask",
  "websiteURL": "https://example.com/login",
  "appId": "190014885",
  "proxyType": "http",
  "proxyAddress": "1.2.3.4",
  "proxyPort": 8080
}

Пример ответа getTaskResult

Пока задача находится в обработке:

{
  "errorId": 0,
  "status": "processing"
}

После успешного решения:

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "appid": "190014885",
    "ret": 0,
    "ticket": "tr0344YjJASGmJGtohyWS_y6tJKiqVPIdFgl87vWlVaQoueR8D6DH28go-i-VjeassM31SXO7D0*",
    "randstr": "@KVN"
  }
}

solution.appid, ret, ticket и randstr вместе образуют результат Tencent. Передайте их в callback капчи на странице без изменений.