Use Cases

Автоматическая обработка CAPTCHA при входе в систему с помощью CaptchaAI

Скрипт стабильно логинится неделями — а потом на форме входа появляется reCAPTCHA или Cloudflare Turnstile, и автоматизация замирает. CaptchaAI закрывает разрыв: возвращает токен, который форма принимает как прохождение проверки человеком — остаётся отправить его вместе с логином и паролем.

Какие CAPTCHA встречаются на форме входа

CAPTCHA Как выглядит Метод CaptchaAI
reCAPTCHA v2 Флажок или задача перед отправкой формы method=userrecaptcha
reCAPTCHA v3 Невидимая проверка, блокирует пользователей с низким score method=userrecaptcha&version=v3
Cloudflare Turnstile Виджет перед формой входа method=turnstile
Капча-изображение Текст на картинке, который нужно ввести method=base64

Три способа ниже закрывают разные ситуации. Форма принимает обычный POST — берите способ 1, он не тратит ресурсы на запуск браузера. Поля логина подгружаются через JavaScript или сайт проверяет поведение до отправки формы — нужен headless-браузер: Selenium (способ 2) для Python-стека, Puppeteer (способ 3) для Node.js. Логика решения CAPTCHA одна и та же во всех трёх случаях — меняется только то, как вы получаете sitekey со страницы и куда отправляете токен.

Способ 1: вход через обычный POST-запрос, без браузера

Если форма принимает стандартный POST-запрос, браузер не нужен. Схема: получить sitekey со страницы логина, решить капчу через CaptchaAI и отправить токен вместе с учётными данными одним запросом. Перед тем как писать код, проверьте три вещи на странице логина:

  • откуда форма берёт sitekey — из HTML-атрибута или из отдельного запроса к API сайта
  • нужен ли CSRF-токен в теле запроса вместе с логином и паролем
  • сохраняет ли сайт сессию в cookie сразу после успешного POST, или требуется отдельный запрос за токеном авторизации
import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_recaptcha(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": site_key, "pageurl": page_url
    })
    task_id = resp.text.split("|")[1]
    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

# Login flow
session = requests.Session()
login_url = "https://staging.example.com/qa-login"

# Load login page to get cookies and site key
page = session.get(login_url)
# Extract site_key from the page HTML...
site_key = "6Le-wvkS..."

# Solve CAPTCHA
token = solve_recaptcha(site_key, login_url)

# Submit login form
resp = session.post(login_url, data={
    "username": "[email protected]",
    "password": "your_password",
    "g-recaptcha-response": token
})

if resp.url != login_url:
    print("Login successful!")
    # session now has auth cookies for subsequent requests

Способ 2: Selenium (Python)

Когда логин рендерится через JavaScript, обычный POST не сработает. Здесь нужен браузер: Selenium заполняет поля, а CaptchaAI параллельно решает капчу.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time

API_KEY = "YOUR_API_KEY"

options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)

# Navigate to login page
driver.get("https://staging.example.com/qa-login")
wait = WebDriverWait(driver, 10)

# Fill in credentials
username_field = wait.until(EC.presence_of_element_located((By.NAME, "username")))
username_field.send_keys("[email protected]")
driver.find_element(By.NAME, "password").send_keys("your_password")

# Extract site key and solve
recaptcha = driver.find_element(By.CLASS_NAME, "g-recaptcha")
site_key = recaptcha.get_attribute("data-sitekey")

token = solve_recaptcha(site_key, driver.current_url)

# Inject token
driver.execute_script(
    f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)

# Submit
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
wait.until(EC.url_changes(driver.current_url))
print(f"Logged in! Now at: {driver.current_url}")

Способ 3: автоматизация через Puppeteer (Node.js)

Тот же принцип для Node.js: Puppeteer управляет headless-браузером, а CaptchaAI отдаёт токен для скрытого поля формы.

const puppeteer = require("puppeteer");
const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solveRecaptcha(siteKey, pageUrl) {
  const submit = await axios.get("https://ocr.captchaai.com/in.php", {
    params: {
      key: API_KEY,
      method: "userrecaptcha",
      googlekey: siteKey,
      pageurl: pageUrl,
    },
  });
  const taskId = submit.data.split("|")[1];

  while (true) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId },
    });
    if (result.data === "CAPCHA_NOT_READY") continue;
    if (result.data.startsWith("OK|")) return result.data.split("|")[1];
    throw new Error(result.data);
  }
}

(async () => {
  const browser = await puppeteer.launch({ headless: "new" });
  const page = await browser.newPage();
  await page.goto("https://staging.example.com/qa-login");

  // Fill credentials
  await page.type("#username", "[email protected]");
  await page.type("#password", "your_password");

  // Get site key and solve
  const siteKey = await page.$eval(".g-recaptcha", (el) =>
    el.getAttribute("data-sitekey")
  );
  const token = await solveRecaptcha(siteKey, page.url());

  // Inject and submit
  await page.evaluate(
    (t) => (document.getElementById("g-recaptcha-response").innerHTML = t),
    token
  );
  await page.click('button[type="submit"]');
  await page.waitForNavigation();

  console.log("Logged in:", page.url());
  await browser.close();
})();

Что делать, если после капчи сайт ещё запрашивает код MFA

Некоторые формы сочетают CAPTCHA с двухфакторной проверкой: капча подтверждает, что запрос не от бота, код из SMS — что входит владелец аккаунта. Сначала закрывайте CAPTCHA, затем обрабатывайте редирект на MFA. На практике код из SMS или push-уведомления может прийти с задержкой в 10–30 секунд — не опрашивайте страницу подтверждения сразу после отправки логина, дайте редиректу время произойти. Если автоматизация забирает код из почтового ящика или через API push-провайдера, заведите для этого отдельный тайм-аут: смешивать его с тайм-аутом ожидания решения CAPTCHA — частая причина ложных сбоев в CI.

# Step 1: Solve CAPTCHA and submit login
token = solve_recaptcha(site_key, login_url)
resp = session.post(login_url, data={
    "username": "[email protected]",
    "password": "your_password",
    "g-recaptcha-response": token
})

# Step 2: Handle MFA page (if redirected)
if "verify" in resp.url or "mfa" in resp.url:
    # Your MFA code logic here
    mfa_code = get_mfa_code()
    resp = session.post(resp.url, data={"code": mfa_code})

# Step 3: Verify logged in
assert "dashboard" in resp.url

Автоматизируйте только аккаунты с законным доступом — свои, тестовые или клиентские по договору. При сборе персональных данных сверьтесь с 152-ФЗ или GDPR — это зона ответственности вашей автоматизации, а не CaptchaAI.

Типичные проблемы при автоматическом входе — и как их чинить

Проблема Причина Решение
Вход снова возвращает на страницу с CAPTCHA Токен истёк Решайте и отправляйте токен в течение 60 секунд
«Неверные учётные данные» при правильном пароле Не передан CSRF-токен Извлеките CSRF-токен со страницы входа и добавьте его в запрос
Сессия слетает сразу после входа Cookies не сохраняются между запросами Используйте requests.Session() или cookies браузера
reCAPTCHA v3 блокирует вход, хотя токен валиден Слишком низкий score CaptchaAI ориентируется на высокий score; проверьте, что параметр action совпадает с тем, что ждёт сайт

Пример: команда с ночными regression-тестами логина в CI обычно берёт BASIC ($15/мес, 5 потоков); для нескольких окружений параллельно — STANDARD ($30/мес, 15 потоков).

Что логировать, чтобы быстро находить сбои входа

Когда автоматический вход ломается через месяц после деплоя, разбираться приходится по логам, а не по памяти. Для сценариев с CAPTCHA полезно фиксировать не только факт успеха или неудачи, но и то, что происходило внутри решения:

  • task_id, который вернул in.php, и время между отправкой задачи и получением токена из res.php
  • HTTP-статус ответа формы логина и итоговый URL после редиректа
  • score, если сайт как-то раскрывает результат reCAPTCHA v3 на своей стороне
  • количество повторных опросов res.php и текст последней ошибки (CAPCHA_NOT_READY, ERROR_...)
  • время появления MFA-редиректа, если он есть, и код ответа на шаге подтверждения

Эти несколько полей закрывают почти все реальные инциденты: истёкший токен, изменившийся sitekey, пропавший CSRF-токен или новый MFA-шаг, который автоматизация ещё не умеет обрабатывать. В CI такие логи стоит сохранять как артефакт задания — без них диагностика зависшего логина занимает часы вместо минут.

Часто задаваемые вопросы

Вопросы ниже — то, с чем реально сталкиваются команды, когда переносят вход из ручного тестирования в CI.

Нужен ли браузер, чтобы автоматизировать вход с CAPTCHA?

Не всегда. Если форма принимает POST-запрос, достаточно способа 1. Браузер нужен только когда логин рендерится через JavaScript или сайт проверяет поведение до отправки формы.

Если сомневаетесь, начните со способа 1 и переходите на Selenium или Puppeteer только когда получите ошибку про отсутствующее поле формы — это быстрый по нашей внутренней выборке способ понять, что логин зависит от JavaScript.

Что делать, если reCAPTCHA v3 блокирует вход даже с валидным токеном?

Итоговое решение по score всегда принимает сам сайт, а не CaptchaAI. Проверьте по порядку:

  • совпадает ли параметр action в запросе к CaptchaAI с тем, что сайт передаёт при обычном логине — рассинхрон здесь самая частая причина
  • не идёт ли запрос с IP или User-Agent, которые сайт уже считает подозрительными вне зависимости от CAPTCHA
  • не занижен ли собственный порог score на стороне сайта — CaptchaAI не может обойти его напрямую

Как определить, какой тип CAPTCHA стоит на странице входа?

Откройте DevTools → Elements и проверьте разметку формы по порядку:

  • атрибут data-sitekey рядом с классом g-recaptcha — это reCAPTCHA v2/v3
  • класс cf-turnstile или скрипт с challenges.cloudflare.com — это Turnstile
  • <img> с base64-строкой вместо обычной картинки — это капча-изображение

Если виджет в iframe, смотрите src: google.com/recaptcha или challenges.cloudflare.com.

Законно ли автоматизировать вход в аккаунт?

CaptchaAI решает только сам вызов CAPTCHA — за форму, учётные данные и cookies отвечает ваша автоматизация. Автоматизировать вход можно только в аккаунты с законным доступом: свои, тестовые или клиентские по договору.

Что читать дальше

Смежные сценарии — если логин у вас на другом стеке автоматизации:

Комментарии для этой статьи отключены.