O Selenium automatiza as interações do navegador, mas os CAPTCHAs o interrompem. A API do CaptchaAI resolve CAPTCHAs externamente enquanto o Selenium cuida do navegador - você extrai os parâmetros CAPTCHA, envia-os para a API e injeta o token retornado.
Requisitos
| Requisito | Detalhes |
|---|---|
| Python 3.7+ | Com pip instalado |
| Selênio | pip install selenium |
| Chrome + ChromeDriver | Versões correspondentes |
| solicitações | pip install requests |
| Chave de API CaptchaAI | Decaptchaai.com |
Como funciona
- Selenium carrega a página de destino
- Seu script extrai a chave do site CAPTCHA da página DOM
- CaptchaAI resolve o CAPTCHA usando a chave do site e URL da página
- Seu script injeta o token na página e envia o formulário
O CAPTCHA é resolvido no lado do servidor por CaptchaAI — Selenium nunca interage diretamente com o widget CAPTCHA.
Etapa 1: configurar o Selênio
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
driver = webdriver.Chrome(options=options)
O sinalizador AutomationControlled ajuda a evitar a detecção básica de bots. Para uma configuração controle de QA mais forte, adicione:
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
Etapa 2: crie o solucionador CAPTCHA
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha_v2(site_key, page_url):
"""Solve reCAPTCHA v2 using CaptchaAI API."""
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
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(f"Solve failed: {result.text}")
raise TimeoutError("CAPTCHA solve timed out")
Etapa 3: extrair a chave do site e resolver
# Navigate to the target page
driver.get("https://staging.example.com/qa-login")
# Wait for the reCAPTCHA to load
wait = WebDriverWait(driver, 10)
recaptcha = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "g-recaptcha"))
)
# Extract the site key
site_key = recaptcha.get_attribute("data-sitekey")
page_url = driver.current_url
print(f"Site key: {site_key}")
print(f"Page URL: {page_url}")
# Solve the CAPTCHA
token = solve_recaptcha_v2(site_key, page_url)
print(f"Token received: {token[:50]}...")
Etapa 4: injetar o token e enviar
# Inject the token into the reCAPTCHA response field
driver.execute_script(f"""
document.getElementById('g-recaptcha-response').innerHTML = '{token}';
document.getElementById('g-recaptcha-response').style.display = '';
""")
# If the form uses a callback function, trigger it
driver.execute_script(f"""
if (typeof ___grecaptcha_cfg !== 'undefined') {{
Object.keys(___grecaptcha_cfg.clients).forEach(function(key) {{
var client = ___grecaptcha_cfg.clients[key];
if (client.callback) client.callback('{token}');
}});
}}
""")
# Submit the form
driver.find_element(By.CSS_SELECTOR, "form").submit()
# Wait for navigation
wait.until(EC.url_changes(page_url))
print(f"Success! Now on: {driver.current_url}")
Exemplo de trabalho completo
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
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"
def solve_recaptcha_v2(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
})
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
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(f"Solve failed: {result.text}")
raise TimeoutError("Timed out")
def main():
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
try:
driver.get("https://staging.example.com/qa-login")
wait = WebDriverWait(driver, 10)
# Extract site key
recaptcha = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "g-recaptcha"))
)
site_key = recaptcha.get_attribute("data-sitekey")
# Solve
token = solve_recaptcha_v2(site_key, driver.current_url)
# Inject and submit
driver.execute_script(
f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)
driver.find_element(By.CSS_SELECTOR, "form").submit()
wait.until(EC.url_changes(driver.current_url))
print("Login successful!")
finally:
driver.quit()
if __name__ == "__main__":
main()
Lidando com diferentes tipos de CAPTCHA
reCAPTCHA v3
def solve_recaptcha_v3(site_key, page_url, action="verify"):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"version": "v3",
"action": action
})
task_id = resp.text.split("|")[1]
# ... same polling logic
Cloudflare Turnstile
def solve_turnstile(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "turnstile",
"sitekey": site_key,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# ... same polling logic
Solução de problemas
| Problema | Causa | Correção |
|---|---|---|
| Token rejeitado | O token expirou antes do envio | Injetar e enviar em 120 segundos |
| Chave do site não encontrada | CAPTCHA carrega dinamicamente | Adicione WebDriverWait com tempo limite mais longo |
NoSuchElementException |
Seletor errado | Inspecione a página para encontrar o elemento correto |
| Incompatibilidade de versão do ChromeDriver | Chrome atualizado | Baixe a versão correspondente do ChromeDriver |
| Detecção de bot apesar do token correto | Antibot além do CAPTCHA | Adicione opções controle de QAs, use o chromedriver não detectado |
Perguntas frequentes
Posso executar o Selenium no modo headless com CaptchaAI?
Sim. CaptchaAI resolve CAPTCHAs do lado do servidor - o navegador só precisa carregar a página para extrair a chave do site. O modo Headless funciona bem.
Preciso clicar na caixa de seleção CAPTCHA?
Não. CaptchaAI retorna um token que você injeta diretamente no formulário. Nenhuma interação visual com o widget CAPTCHA é necessária.
E quanto ao reCAPTCHA com retornos de chamada?
Alguns sites usam retornos de chamada JavaScript em vez de envio de formulário. Use driver.execute_script() para acionar o retorno de chamada com o token resolvido. VerComo resolver o retorno de chamada reCAPTCHA v2.