Casos de Uso

Manipulação de Selenium CAPTCHA com Python e CaptchaAI

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

  1. Selenium carrega a página de destino
  2. Seu script extrai a chave do site CAPTCHA da página DOM
  3. CaptchaAI resolve o CAPTCHA usando a chave do site e URL da página
  4. 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.

Guias Relacionados

Os comentários estão desativados para este artigo.