Скрипт стабильно логинится неделями — а потом на форме входа появляется 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 отвечает ваша автоматизация. Автоматизировать вход можно только в аккаунты с законным доступом: свои, тестовые или клиентские по договору.
Что читать дальше
Смежные сценарии — если логин у вас на другом стеке автоматизации:
- Обработка CAPTCHA в Selenium на Python
- Решение CAPTCHA в Puppeteer на Node.js
- CAPTCHA в Playwright: пошаговая настройка