Эта статья была полезной?
Как обойти reCAPTCHA v2 Enterprise на сайте LexisNexis
Технический специалист
Сайт LexisNexis Risk Solutions (buycrash.lexisnexisrisk.com) — это платформа для профессионального поиска данных, которая использует продвинутую защиту reCAPTCHA v2 Enterprise для блокировки автоматизированных запросов к форме входа.
Работа с этой капчей имеет несколько важных технических особенностей. Во-первых, виджет капчи не загружается вместе со страницей: он появляется динамически только после того, как пользователь нажмет кнопку Sign In и взаимодействует с формой авторизации. Во-вторых, корпоративная версия reCAPTCHA (Enterprise) имеет более строгие алгоритмы проверки. В-третьих, и это самое главное, современные реализации этой защиты часто игнорируют токены, которые были просто помещены в скрытые поля формы. Сайт ожидает, что виджет самостоятельно сообщит об успешной валидации путем вызова специальной JavaScript-функции (callback).
В этом руководстве мы пошагово разберем, как дождаться появления динамической капчи, извлечь необходимые параметры, отправить задачу на решение через современный API v2 и, что наиболее важно, корректно внедрить полученный токен через механизм callback, чтобы сайт гарантированно принял решение.
Параметры задачи (API v2)
Для отправки задачи через современный API v2 используется эндпоинт createTask. Объект task должен содержать следующие параметры в строгом соответствии с документацией:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| type | String | Да | Тип задачи: RecaptchaV2EnterpriseTaskProxyless |
| websiteURL | String | Да | Полный URL целевой веб-страницы, где загружается капча |
| websiteKey | String | Да | Ключ сайта reCAPTCHA. Можно найти в свойстве data-sitekey элемента div |
| enterprisePayload | Object | Нет | Дополнительные параметры, которые могут потребоваться для Enterprise reCAPTCHA (например, {"s": "..."}) |
| apiDomain | String | Нет | Домен, с которого загружается скрипт reCAPTCHA. По умолчанию www.google.com, но может быть www.recaptcha.net |
| isInvisible | Boolean | Нет | Указывает, является ли reCAPTCHA невидимой |
| data | String | Нет | Дополнительные данные полезной нагрузки |
| cookies | String | Нет | Файлы cookie, которые будут переданы в задачу |
Как найти параметры
Параметры для reCAPTCHA v2 Enterprise являются статическими, но извлечь их можно только после того, как капча появится в DOM-дереве страницы.
- Откройте сайт https://buycrash.lexisnexisrisk.com/ui/home в браузере.
- Нажмите кнопку Sign In. Дождитесь, пока откроется модальное окно или форма с полями для логина и пароля, и появится виджет капчи.
- Нажмите F12, чтобы открыть Инструменты разработчика (DevTools), и перейдите на вкладку Элементы (Elements).
- Нажмите Ctrl+F (или Cmd+F) и выполните поиск по фразе g-recaptcha или data-sitekey.
- Вы найдете div-элемент, похожий на этот:
- Значение атрибута data-sitekey является вашим websiteKey.
- Скопируйте полный URL из адресной строки браузера. Это будет ваш websiteURL.
Примеры кода
Python + requests (API v2)
Пример отправки задачи и опроса результата с использованием библиотеки requests через эндпоинты API v2.
python
import requests
import time
API_KEY = 'ВАШ_API_КЛЮЧ'
WEBSITE_URL = 'https://buycrash.lexisnexisrisk.com/ui/home'
WEBSITE_KEY = '6LcguussAAAAAJSH4sc2q8R_DnOSO-5qUXfLWjoE'
# 1. Создание задачи через API v2
url = 'https://api.2captcha.com/createTask'
headers = {
'Content-Type': 'application/json'
}
payload = {
"clientKey": API_KEY,
"task": {
"type": "RecaptchaV2EnterpriseTaskProxyless",
"websiteURL": WEBSITE_URL,
"websiteKey": WEBSITE_KEY
}
}
response = requests.post(url, headers=headers, json=payload)
result = response.json()
if result.get('errorId') == 0:
task_id = result.get('taskId')
print(f"Задача создана, ID: {task_id}")
# 2. Получение результата через API v2
res_url = 'https://api.2captcha.com/getTaskResult'
while True:
time.sleep(5) # Пауза между запросами
res_payload = {
"clientKey": API_KEY,
"taskId": task_id
}
res_response = requests.post(res_url, headers=headers, json=res_payload).json()
if res_response.get('errorId') == 0 and res_response.get('status') == 'ready':
print("Капча успешно решена!")
token = res_response['solution']['gRecaptchaResponse']
print(f"Токен: {token}")
break
elif res_response.get('errorId') != 0:
print(f"Ошибка: {res_response.get('errorDescription')}")
break
else:
# Статус processing - задача еще не готова
continue
else:
print(f"Ошибка создания задачи: {result.get('errorDescription')}")
Python + Playwright
Пример автоматизации, который открывает страницу, нажимает кнопку входа для динамической загрузки капчи, извлекает sitekey, отправляет задачу через API v2 и внедряет токен через callback.
python
from playwright.sync_api import sync_playwright
import requests
import time
API_KEY = 'ВАШ_API_КЛЮЧ'
TARGET_URL = 'https://buycrash.lexisnexisrisk.com/ui/home'
def solve_lexisnexis_recaptcha_v2():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
try:
page.goto(TARGET_URL)
# 1. Нажимаем кнопку Sign In, чтобы появилась форма и капча
# Селектор кнопки может отличаться, проверьте актуальный класс или ID на сайте
page.click('button:has-text("Sign In")')
# Ожидаем появления виджета reCAPTCHA в DOM
page.wait_for_selector('.g-recaptcha', timeout=10000)
# 2. Извлекаем sitekey из атрибута data-sitekey
site_key = page.evaluate("""
() => {
const captchaDiv = document.querySelector('.g-recaptcha');
return captchaDiv ? captchaDiv.getAttribute('data-sitekey') : null;
}
""")
if not site_key:
raise Exception("Не удалось найти sitekey reCAPTCHA на странице.")
print(f"Найден sitekey: {site_key}")
# 3. Отправка в API v2
api_url = 'https://api.2captcha.com/createTask'
headers = {'Content-Type': 'application/json'}
payload = {
"clientKey": API_KEY,
"task": {
"type": "RecaptchaV2EnterpriseTaskProxyless",
"websiteURL": page.url,
"websiteKey": site_key
}
}
task_response = requests.post(api_url, headers=headers, json=payload).json()
if task_response.get('errorId') != 0:
raise Exception(f"Ошибка создания задачи: {task_response.get('errorDescription')}")
task_id = task_response.get('taskId')
# 4. Ожидание решения через getTaskResult
res_url = 'https://api.2captcha.com/getTaskResult'
token = None
for _ in range(20):
time.sleep(5)
res = requests.post(res_url, headers=headers, json={"clientKey": API_KEY, "taskId": task_id}).json()
if res.get('status') == 'ready':
token = res['solution']['gRecaptchaResponse']
break
if res.get('errorId') != 0:
print(f"Ошибка API: {res.get('errorDescription')}")
break
if token:
print(f"Токен получен: {token}")
# 5. Внедрение токена через callback
page.evaluate(f"""
// Попытка найти и вызвать именованный callback (замените 'yourCallbackName' на реальный, если он указан в data-callback)
if (typeof yourCallbackName === 'function') {{
yourCallbackName("{token}");
}}
// Альтернативный универсальный способ внедрения через внутреннюю структуру grecaptcha
const textarea = document.querySelector('textarea[name="g-recaptcha-response"]');
if (textarea) {{
textarea.value = "{token}";
textarea.dispatchEvent(new Event('change', {{ bubbles: true }}));
}}
console.log("Token injection attempted");
""")
print("Токен передан через callback/DOM.")
else:
print("Не удалось получить токен.")
except Exception as e:
print(f"Ошибка: {e}")
finally:
# browser.close()
if __name__ == '__main__':
solve_lexisnexis_recaptcha_v2()
Как использовать полученный токен (Передача через callback)
Сайт LexisNexis, как и многие другие корпоративные платформы с reCAPTCHA v2 Enterprise, может полностью игнорировать токен, если он был просто записан в скрытое поле формы. Архитектура защиты ожидает, что виджет сам инициирует событие успешной валидации.
Чтобы реализовать это правильно:
- Изучите исходный код страницы (вкладка Elements). Найдите div с классом g-recaptcha.
- Проверьте, есть ли у него атрибут data-callback="имя_функции". Если он присутствует, это самый надежный путь. Просто вызовите эту функцию через page.evaluate, передав ей токен: имя_функции("ВАШ_ТОКЕН").
- Если атрибута data-callback нет, используйте универсальный метод внедрения через внутреннюю структуру ___grecaptcha_cfg или эмуляцию события change, который подробно описан в нашей специализированной статье: Как передать токен reCAPTCHA v2 через callback (https://2captcha.com/h/recaptcha-v2-callback).
Частые ошибки и решения (API v2)
| Ошибка / Проблема | Причина | Решение |
|---|---|---|
| ERROR_KEY_DOES_NOT_EXIST | Неверный или пустой API-ключ. | Проверьте правильность копирования ключа из панели управления. |
| ERROR_ZERO_BALANCE | Недостаточно средств на балансе аккаунта. | Пополните баланс аккаунта. |
| ERROR_INVALID_PARAMETERS | Отсутствуют обязательные параметры (например, websiteKey или websiteURL) или неверный формат JSON. | Убедитесь, что объект task содержит все необходимые поля в правильном формате, как указано в документации API v2. |
| ERROR_GOOGLEKEY | Неверный формат websiteKey или несоответствие домена ключа и URL. | Убедитесь, что ключ начинается с 6L, скопирован без лишних пробелов, а websiteURL точно соответствует домену, для которого зарегистрирован ключ. |
| ERROR_CAPTCHA_UNSOLVABLE | Капча не может быть решена (истекло время жизни токена или строгие настройки Enterprise). | Обновите страницу, получите новый sitekey и отправьте задачу заново без длительных задержек. |
| Токен не принимается формой | Неверный способ внедрения (сайт ожидает вызов callback). | Не полагайтесь только на скрытые поля. Найдите функцию callback в исходном коде или используйте метод из статьи про callback. |
Полезные ссылки
- Песочница для тестирования API: https://2captcha.com/setting#sandbox
- Документация API по reCAPTCHA v2 Enterprise: https://2captcha.com/api-docs/recaptcha-v2-enterprise
- Список кодов ошибок API v2: https://2captcha.com/api-docs/error-codes
- Статья: Как передать токен reCAPTCHA v2 через callback: https://2captcha.com/h/recaptcha-v2-callback
- Python SDK на GitHub: https://github.com/2captcha/2captcha-python
- Другие примеры обхода капч на сайтах: https://2captcha.com/h?category=sites