O reCAPTCHA v2 ainda é um dos desafios mais comuns em formulários de login, cadastro, checkout e envio de dados. Se a sua automação esbarra num checkbox ou desafio de imagem de reCAPTCHA v2, dá para resolver via API em quatro passos: extraia sitekey e pageurl da página, envie ao solver reCAPTCHA v2 do CaptchaAI, aguarde o resultado e injete o token no fluxo protegido.
Este guia é para devs que precisam de uma integração funcionando, não de uma visão teórica.
Não tem certeza de qual versão é? Leia antes Como identificar a versão do reCAPTCHA.
O que você precisa antes de começar
| Requisito | Detalhes |
|---|---|
| API key do CaptchaAI | Pegue em captchaai.com/api.php. 32 caracteres. |
| URL completa | A URL exata onde o widget reCAPTCHA v2 carrega. |
| sitekey | A chave pública do widget naquela página. |
| Cliente HTTP | requests, axios, fetch, curl — qualquer um. |
| Threads ativos | Sua conta precisa de threads disponíveis. |
Passo 1: extraia sitekey e pageurl
pageurl é a URL completa da página onde a reCAPTCHA está. Sempre passe com https://.
Para o sitekey, três caminhos:
1. No HTML — procure <div class="g-recaptcha" data-sitekey="...">:
<div class="g-recaptcha" data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>
2. Na URL do iframe — https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&... — o parâmetro k= é o sitekey.
3. No tráfego de rede — DevTools → Network, filtre por recaptcha e veja o parâmetro k em qualquer requisição.
Passo 2: envie a tarefa
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "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)
Equivalente em 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 invisível? Adicione
invisible=1. Mais detalhes em Como funciona a reCAPTCHA invisível.
Passo 3: consulte o resultado
reCAPTCHA v2 normalmente leva 15–60 segundos. Espere 20 s e depois consulte a cada 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)
O token retornado é uma string longa que costuma começar com 03AGdBq25....
Passo 4: injete o token na página
Depende de como o site espera receber o token. O mais comum é o textarea 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"]');
Se o widget tiver data-callback, chame também a função:
const callback = document.querySelector(".g-recaptcha").dataset.callback;
if (callback && window[callback]) window[callback](token);
Exemplo completo (Python)
import time
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "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])
Erros frequentes e soluções
| Erro | Causa | O que fazer |
|---|---|---|
ERROR_GOOGLEKEY |
sitekey vazio ou inválido | Reextraia o sitekey da página atual |
ERROR_PAGEURL |
Faltou pageurl |
Envie a URL completa com esquema |
ERROR_ZERO_BALANCE |
Sem threads | Recarregue ou aguarde liberar |
ERROR_CAPTCHA_UNSOLVABLE |
O site endureceu o desafio | Tente de novo após alguns segundos; veja erros comuns ao resolver reCAPTCHA v2 |
| O site rejeita o token | Token venceu | Use dentro de ~110 s após receber |
Quando algo dá errado
- Token volta mas o site continua bloqueando — o formulário tem handler próprio. Encontre o callback e chame em vez de só preencher o textarea.
- Precisa manter a mesma sinal de navegador — envie as mesmas cookies e
User-Agentque estavam ativos quando você pediu o token. - reCAPTCHA dependente de proxy — adicione
proxyeproxytypeno envio para o solver usar seu pool de IPs.