reCAPTCHA v2 — по-прежнему один из самых распространённых барьеров на формах логина, регистрации, чекаута и отправки данных. Если ваш сценарий автоматизации натыкается на чекбокс или картиночное задание reCAPTCHA v2, его можно решить через API за четыре шага: извлечь со страницы sitekey и pageurl, отправить их в решатель reCAPTCHA v2, дождаться результата и подставить полученный токен в защищённый запрос.
Это руководство — для разработчиков, которым нужна работающая интеграция, а не обзорная теория.
Не уверены, какая у вас версия reCAPTCHA? Сначала прочитайте Как определить версию reCAPTCHA.
Что нужно перед стартом
| Требование | Описание |
|---|---|
| API-ключ CaptchaAI | Получите на captchaai.com/api.php, 32-символьная строка. |
| URL страницы | Полный адрес, на котором загружается виджет reCAPTCHA v2. |
| sitekey | Публичный ключ конкретного экземпляра виджета. |
| HTTP-клиент | requests, axios, fetch, curl — что угодно. |
| Активные потоки | На счёте должны быть свободные потоки решений. |
Шаг 1: извлеките sitekey и pageurl
pageurl — это URL страницы, на которой стоит reCAPTCHA. Его задавайте полностью, со схемой https://.
sitekey найти можно одним из трёх способов:
1. В разметке — найдите <div class="g-recaptcha" data-sitekey="...">:
<div class="g-recaptcha" data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>
2. В URL iframe — https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&... — параметр k= и есть sitekey.
3. В сетевом трафике — откройте DevTools → Network, отфильтруйте по recaptcha и в любом запросе найдёте параметр k.
Шаг 2: отправьте задачу
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://https://staging.example.com/qa-login"
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": SITEKEY,
"pageurl": PAGEURL,
"json": 1,
}).json()
assert submit["status"] == 1, submit
task_id = submit["request"]
print("task id:", task_id)
Эквивалент на Node.js:
const r = await fetch("https://ocr.captchaai.com/in.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: SITEKEY,
pageurl: PAGEURL,
json: "1",
}),
});
const { status, request: taskId } = await r.json();
if (status !== 1) throw new Error(taskId);
Невидимая reCAPTCHA? Добавьте параметр
invisible=1. Подробнее в Как работает невидимая reCAPTCHA.
Шаг 3: опросите результат
reCAPTCHA v2 решается обычно за 15–60 секунд. Подождите 20 секунд, затем опрашивайте каждые 5.
import time
time.sleep(20)
while True:
res = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if res.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if res.get("status") == 1:
token = res["request"]
print("token:", token[:60], "…")
break
raise RuntimeError(res)
Возвращённый токен — это длинная строка, начинающаяся обычно с 03AGdBq25....
Шаг 4: подставьте токен на страницу
Способ зависит от того, как сайт принимает решение. Чаще всего — текстовое поле g-recaptcha-response:
document.querySelector('textarea[name="g-recaptcha-response"]').value = token;
document.querySelector("form").submit();
В Selenium:
driver.execute_script(
"document.querySelector('[name=\"g-recaptcha-response\"]').value = arguments[0];",
token,
)
driver.find_element(By.CSS_SELECTOR, "form").submit()
В Playwright:
await page.evaluate((t) => {
document.querySelector('[name="g-recaptcha-response"]').value = t;
}, token);
await page.click('button[type="submit"]');
Если у виджета есть data-callback, сначала вызовите эту функцию:
const callback = document.querySelector(".g-recaptcha").dataset.callback;
if (callback && window[callback]) window[callback](token);
Полный рабочий пример (Python)
import time
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://https://staging.example.com/qa-login"
def solve_recaptcha_v2():
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": SITEKEY, "pageurl": PAGEURL, "json": 1,
}).json()
if submit["status"] != 1:
raise RuntimeError(submit)
task_id = submit["request"]
time.sleep(20)
for _ in range(40):
res = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1,
}).json()
if res.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if res.get("status") == 1:
return res["request"]
raise RuntimeError(res)
raise TimeoutError("solve timed out")
if __name__ == "__main__":
token = solve_recaptcha_v2()
print("token:", token[:80])
Частые ошибки и как их исправить
| Ошибка | Причина | Что делать |
|---|---|---|
ERROR_GOOGLEKEY |
sitekey пуст или неверен | Извлеките sitekey ещё раз из текущей страницы |
ERROR_PAGEURL |
Не указан pageurl |
Передайте полный URL со схемой |
ERROR_ZERO_BALANCE |
Нет потоков | Пополните счёт или подождите |
ERROR_CAPTCHA_UNSOLVABLE |
Сайт усложнил задание | Повторите через несколько секунд; см. распространённые ошибки решения reCAPTCHA v2 |
| Сайт отвергает токен | Токен «протух» | Используйте токен в течение ~110 секунд после получения |
Когда что-то не работает
- Токен возвращается, а сайт всё равно блокирует — у формы свой обработчик. Найдите имя callback'а и вызовите его, не подставляя поле напрямую.
- Используйте ту же конфигурацию QA-сеанса — отправляйте те же
User-Agentи cookies, что использовались при получении токена. - Прокси-зависимая reCAPTCHA — добавьте параметры
proxyиproxytypeв запрос, чтобы решатель использовал ваш IP-пул.
Дальше
- Решение Cloudflare Turnstile через API
- Решение GeeTest v3 через API
- Быстрый старт CaptchaAI
Получите ключ на captchaai.com/api.php и подключите решение reCAPTCHA v2 за один спринт.