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

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

Как решить Cloudflare Turnstile на Leonardo AI

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

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

Введение

Leonardo AI — это популярная платформа для генерации изображений с помощью искусственного интеллекта. Для защиты процессов входа в аккаунт и регистрации от автоматизированных скриптов сайт использует Cloudflare Turnstile. Это невидимая или интерактивная капча, которая оценивает поведение пользователя и окружение браузера.

В этом руководстве мы разберем, как получить необходимые параметры, решить капчу через API 2Captcha и корректно внедрить токен на страницу авторизации Leonardo AI, используя проверенные методы внедрения.

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

Для обхода Cloudflare Turnstile на Leonardo AI используется тип задачи TurnstileTaskProxyless (или TurnstileTask, если требуются ваши прокси).

json Copy
{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "TurnstileTaskProxyless",
        "websiteURL": "https://app.leonardo.ai/auth/login",
        "websiteKey": "0x4AAAAAAAjpS3rLKnsHyb79",
        "action": "email_continue"
    }
}

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

websiteURL

Это полный адрес страницы, на которой появляется капча. В данном случае это страница входа: https://app.leonardo.ai/auth/login

websiteKey (sitekey)

Это публичный ключ Cloudflare Turnstile.

  1. Откройте страницу входа и нажмите F12 (Инструменты разработчика).
  2. Перейдите на вкладку Elements (Элементы).
  3. Нажмите Ctrl+F и введите data-sitekey или cf-turnstile.
  4. Скопируйте значение атрибута. Для Leonardo AI это 0x4AAAAAAAjpS3rLKnsHyb79.

action

Некоторые реализации Turnstile используют параметр action для определения контекста (например, вход, регистрация или продолжение ввода email).

  1. На вкладке Elements найдите контейнер капчи (обычно div с классом cf-turnstile).
  2. Проверьте наличие атрибута data-action.
  3. Альтернативно, перейдите на вкладку Network, выполните действие, вызывающее капчу (например, введите email и нажмите Continue), и найдите запрос к challenges.cloudflare.com. В теле запроса (Payload) будет указан параметр action. Для Leonardo AI при продолжении входа через email это значение часто равно email_continue.

Варианты передачи (внедрения) токена

После получения токена от API 2Captcha его необходимо правильно передать на сайт. В зависимости от архитектуры сайта (особенно если это SPA на React или Vue), простого изменения DOM может быть недостаточно. Ниже приведены основные методы, основанные на успешной практике обхода Turnstile (включая примеры из скриптов для VFS Global).

1. Внедрение в скрытые поля (DOM-манипуляция)

Самый распространенный способ. Turnstile создает скрытые поля, которые отправляются вместе с формой.

python Copy
# Для Selenium / SeleniumBase
driver.execute_script("document.getElementsByName('cf-turnstile-response')[0].value = arguments[0];", token)
driver.execute_script(f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';")
driver.execute_script(f"document.getElementById('g-recaptcha-response').value = '{token}';")

2. Вызов callback-функции

Современные фреймворки часто не читают DOM напрямую, а ждут вызова функции обратного вызова, которую Turnstile регистрирует при инициализации. Если сайт определяет callback, его нужно вызвать вручную.

python Copy
# Если вы перехватили имя callback-функции (например, window.turnstileCallback)
driver.execute_script(f"window.turnstileCallback('{token}');")

# Или универсальный поиск callback в объекте turnstile (если он доступен глобально)
driver.execute_script(f"""
    if (typeof turnstile !== 'undefined' && typeof turnstile.execute === 'function') {{
        // Иногда требуется принудительное обновление состояния
    }}
    // Попытка найти и вызвать сохраненный callback
    if (typeof window.tsCallback === 'function') {{
        window.tsCallback('{token}');
    }}
""")

3. Разблокировка кнопки отправки

Часто кнопка отправки формы имеет атрибут disabled, который снимается только после успешного срабатывания callback. Если вы внедряете токен вручную, кнопку, возможно, придется разблокировать принудительно.

python Copy
# Находим кнопку и удаляем атрибут disabled
el = driver.find_element(By.XPATH, "//button[@type='submit']")
driver.execute_script("arguments[0].removeAttribute('disabled')", el)

4. Проверка успешности внедрения

После внедрения рекомендуется проверить, принял ли виджет Turnstile токен, вызвав встроенный метод getResponse().

python Copy
resp = driver.execute_script("return turnstile.getResponse();")
print("Ответ turnstile.getResponse():", resp) # Должен вывести ваш токен, а не null

Примеры кода

Python + requests (Получение токена)

Этот код отправляет задачу в API и возвращает готовый токен.

python Copy
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

from twocaptcha import TwoCaptcha

api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')
solver = TwoCaptcha(api_key)

try:
    result = solver.turnstile(
        sitekey='0x4AAAAAAAjpS3rLKnsHyb79',
        url='https://app.leonardo.ai/auth/login',
        action='email_continue'
    )
    print(f"Токен успешно получен: {result['code']}")
    
except Exception as e:
    print(f"Произошла ошибка: {e}")

Python + SeleniumBase (Автоматизация с полным циклом внедрения)

Адаптированный скрипт, использующий undetected-chromedriver через SeleniumBase для обхода базовой детекции и применяющий все описанные выше методы внедрения токена.

python Copy
import time
import chromedriver_autoinstaller_fix
import requests
from seleniumbase import Driver
from selenium.webdriver.common.by import By

chromedriver_autoinstaller_fix.install()

agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
# Запускаем драйвер с anti-detect настройками
driver = Driver(uc=True, headless=False, proxy=False, agent=agent)

url = 'https://app.leonardo.ai/auth/login'
sitekey = "0x4AAAAAAAjpS3rLKnsHyb79"
my_key = "YOUR_2CAPTCHA_KEY"

try:
    # 1. Открываем страницу с задержкой для обхода начальной проверки Cloudflare
    driver.uc_open_with_reconnect(url, reconnect_time=20)
    time.sleep(5)
    
    # 2. Взаимодействие со страницей для вызова капчи (пример для Leonardo AI)
    # Введите email и нажмите кнопку продолжения
    # driver.find_element(By.ID, "email-input").send_keys("test@example.com")
    # driver.find_element(By.XPATH, "//button[contains(text(), 'Continue')]").click()
    time.sleep(3)
    
    # 3. Отправляем задачу на решение
    user_agent = driver.get_user_agent()
    data = {
        "key": my_key,
        "method": "turnstile",
        "sitekey": sitekey,
        "json": 1,
        "pageurl": url,
        "useragent": user_agent,
        "action": "email_continue"
    }
    
    response = requests.post("https://api.2captcha.com/in.php", data=data)
    print("Отправлено на сервис:", response.text)
    task_id = response.json()["request"]
    
    # 4. Ожидаем результат
    time.sleep(15)
    while True:
        solu = requests.get(f"https://api.2captcha.com/res.php?key={my_key}&action=get&json=1&id={task_id}").json()
        if solu["request"] == "CAPCHA_NOT_READY":
            print("Ожидание решения...")
            time.sleep(10)
        elif "ERROR" in solu["request"]:
            print("Ошибка:", solu["request"])
            driver.quit()
            exit(0)
        else:
            break
            
    token = solu["request"]
    print("Токен получен:", token)
    
    # 5. Внедрение токена (Комплексный подход)
    # Метод 1: Скрытые поля
    driver.execute_script("document.getElementsByName('cf-turnstile-response')[0].value = arguments[0];", token)
    driver.execute_script(f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';")
    driver.execute_script(f"document.getElementById('g-recaptcha-response').value = '{token}';")
    
    # Метод 2: Попытка вызвать callback (если определен)
    driver.execute_script(f"""
        if (typeof window.turnstileCallback === 'function') {{
            window.turnstileCallback('{token}');
        }}
    """)
    
    # Метод 3: Разблокировка кнопки отправки
    try:
        submit_btn = driver.find_element(By.XPATH, "//button[@type='submit']")
        driver.execute_script("arguments[0].removeAttribute('disabled')", submit_btn)
    except:
        pass
        
    time.sleep(2)
    
    # 6. Проверка успешности внедрения
    resp = driver.execute_script("return turnstile.getResponse();")
    print("Проверка turnstile.getResponse():", resp)
    print("Токен успешно внедрен")
    
    time.sleep(10) # Пауза для визуальной проверки или дальнейших действий
    
except Exception as e:
    print(f"Ошибка: {e}")
finally:
    driver.quit()

Отчеты о правильности решения

Если сайт отклонил полученный токен, обязательно сообщите об этом через метод reportIncorrect. Это помогает сервису улучшать алгоритмы и возвращает вам средства за неудачную попытку. Если токен успешно прошел проверку, отправьте reportCorrect.

Отправить отчет можно через API:

python Copy
import requests

API_KEY = "YOUR_API_KEY"
TASK_ID = "123456789" # Замените на реальный ID задачи из ответа API

# Отчет о неверном решении
requests.post(
    "https://api.2captcha.com/reportIncorrect",
    json={"clientKey": API_KEY, "taskId": TASK_ID}
)

# Отчет о правильном решении
requests.post(
    "https://api.2captcha.com/reportCorrect",
    json={"clientKey": API_KEY, "taskId": TASK_ID}
)

Подробный гайд по отправке отчетов с примерами для разных языков: https://2captcha.com/h/how-to-submit-reports

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

Ошибка / Проблема Причина Решение
ERROR_CAPTCHA_UNSOLVABLE IP-адрес заблокирован Cloudflare или передан неверный параметр action. Используйте тип задачи TurnstileTask с качественными резидентскими прокси. Убедитесь, что параметр action точно совпадает с тем, что ожидает сайт.
Токен получен, но сайт не пускает Неправильное внедрение токена или истекло время его жизни. Используйте комплексный подход к внедрению: скрытые поля + вызов callback + разблокировка кнопки. Проверяйте результат через turnstile.getResponse().
Ошибка при поиске элементов Сайт обновил верстку или защитные механизмы. Проверьте актуальные XPath или CSS-селекторы через DevTools. Увеличьте время ожидания или используйте явные ожидания.
ERROR_WRONG_USER_KEY Неверный API-ключ. Проверьте, что вы используете правильный ключ из личного кабинета 2Captcha.

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