Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как обойти reCAPTCHA v2 на сайте Zlookup

Грегори Фишер
Грегори Фишер

Технический специалист

Сайт Zlookup (zlookup.com) использует защиту reCAPTCHA v2 для защиты своих форм проверки email от автоматизированных запросов. Главная особенность обхода этой капчи заключается не только в получении токена, но и в его правильном внедрении.

Современные реализации reCAPTCHA v2 часто не читают токены из скрытых полей формы напрямую. Вместо этого сайт ожидает вызова специальной JavaScript-функции (callback) с полученным токеном. В этом руководстве мы разберем, как извлечь параметры, решить капчу через API v2 и корректно передать токен через callback.

Параметры задачи

Для отправки задачи через современный API v2 используется эндпоинт createTask. Объект task должен содержать следующие параметры:

Параметр Тип Обязательный Описание
type String Да Тип задачи: RecaptchaV2TaskProxyless или RecaptchaV2Task
websiteURL String Да Полный URL страницы, где находится капча
websiteKey String Да Публичный ключ сайта reCAPTCHA (начинается с 6L...)
isInvisible Boolean Нет Установите true, если на сайте используется невидимая версия reCAPTCHA (Invisible)

Как найти параметры

Параметры для reCAPTCHA v2 являются статическими и легко извлекаются из исходного кода страницы или сетевых запросов.

Способ 1: Через исходный код страницы (вкладка Elements)

  1. Откройте сайт https://www.zlookup.com/ в браузере.
  2. Нажмите F12, чтобы открыть Инструменты разработчика (DevTools), и перейдите на вкладку Элементы (Elements).
  3. Нажмите Ctrl+F (или Cmd+F) и выполните поиск по фразе g-recaptcha или data-sitekey.
  4. Вы найдете div-элемент, похожий на этот:
  5. Значение атрибута data-sitekey является вашим websiteKey.
  6. Скопируйте полный URL из адресной строки браузера. Это будет ваш websiteURL.

Способ 2: Через сетевые запросы (вкладка Network)
Если вы не можете найти ключ в исходном коде (например, он подгружается динамически), его можно перехватить из сетевого трафика:

  1. Откройте Инструменты разработчика (F12) и перейдите на вкладку Сеть (Network).
  2. Включите сохранение логов (Preserve log) и обновите страницу или выполните действие, вызывающее капчу.
  3. В фильтре введите recaptcha или api.js.
  4. Найдите запросы к серверам Google, например, к /recaptcha/api2/anchor или /recaptcha/api2/reload.
  5. Нажмите на запрос и перейдите на вкладку Payload (Полезная нагрузка) или Params (Параметры).
  6. В параметрах URL (Query String Parameters) найдите поле k. Его значение (например, 6LcXOgkUAAAAAHDrb05dOxG4yI5_Na4FmjFBUhPr) и есть ваш websiteKey.

Примеры кода

Python + requests (API v2)

Пример отправки задачи и опроса результата с использованием библиотеки requests через эндпоинты API v2.

python Copy
import requests
import time

API_KEY = 'ВАШ_API_КЛЮЧ'
WEBSITE_URL = 'https://www.zlookup.com/'
WEBSITE_KEY = '6LcXOgkUAAAAAHDrb05dOxG4yI5_Na4FmjFBUhPr'

# 1. Создание задачи через API v2
url = 'https://api.2captcha.com/createTask'
headers = {
    'Content-Type': 'application/json'
}
payload = {
    "clientKey": API_KEY,
    "task": {
        "type": "RecaptchaV2TaskProxyless",
        "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 Copy
from playwright.sync_api import sync_playwright
import requests
import time

API_KEY = 'ВАШ_API_КЛЮЧ'
TARGET_URL = 'https://www.zlookup.com/'

def solve_zlookup_recaptcha_v2():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        
        try:
            page.goto(TARGET_URL)
            
            # Ожидаем появления виджета reCAPTCHA
            page.wait_for_selector('.g-recaptcha', timeout=10000)
            
            # Извлекаем 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}")
            
            # Отправка в API v2
            api_url = 'https://api.2captcha.com/createTask'
            headers = {'Content-Type': 'application/json'}
            payload = {
                "clientKey": API_KEY,
                "task": {
                    "type": "RecaptchaV2TaskProxyless",
                    "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')
            
            # Ожидание решения через 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}")
                
                # Внедрение токена через callback
                # Подробная инструкция по поиску точного имени callback: 
                # https://2captcha.com/h/recaptcha-v2-callback
                page.evaluate(f"""
                    // 1. Попытка найти и вызвать именованный callback (замените 'yourCallbackName' на реальный, если он есть в data-callback)
                    if (typeof yourCallbackName === 'function') {{
                        yourCallbackName("{token}");
                    }}
                    
                    // 2. Альтернативный универсальный способ внедрения через внутреннюю структуру 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_zlookup_recaptcha_v2()

Как использовать полученный токен (Передача через callback)

Сайт Zlookup, как и многие другие современные сайты с reCAPTCHA v2, может игнорировать токен, если он просто помещен в скрытое поле. Сайт ожидает, что виджет сам сообщит о успешной валидации через вызов функции callback.

Чтобы реализовать это правильно:

  1. Изучите исходный код страницы (вкладка Elements). Найдите div с классом g-recaptcha.
  2. Проверьте, есть ли у него атрибут data-callback="имя_функции". Если есть, просто вызовите эту функцию через page.evaluate, передав ей токен: имя_функции("ВАШ_ТОКЕН").
  3. Если атрибута data-callback нет, используйте универсальный метод внедрения через внутреннюю структуру ___grecaptcha_cfg, который подробно описан в нашей специализированной статье: Как передать токен reCAPTCHA v2 через callback (https://2captcha.com/h/recaptcha-v2-callback).

Частые ошибки и решения

Ошибка / Проблема Причина Решение
ERROR_WRONG_USER_KEY Неверный или пустой API-ключ. Проверьте правильность копирования ключа из панели управления.
ERROR_INVALID_GOOGLE_KEY Неверный websiteKey или несоответствие домена. Убедитесь, что ключ начинается с 6L и скопирован без лишних пробелов. websiteURL должен точно соответствовать домену ключа.
Токен не принимается формой Неверный способ внедрения токена (сайт ждет callback). Не полагайтесь только на скрытые поля. Найдите функцию callback в исходном коде или используйте метод из статьи про callback.
ERROR_CAPTCHA_UNSOLVABLE Капча не может быть решена (истекло время). Убедитесь, что вы не ждете слишком долго перед отправкой задачи, и что websiteURL актуален.

Полезные ссылки