undetected-chromedriver é uma biblioteca Python que corrige o ChromeDriver do Selenium para reduzir sinais de detecção de bot. Ele lida com a correspondência de versões do Chrome, remove sinalizadores sinal de navegador automatizado e modifica outras impressões digitais do navegador que os sites verificam. Quando um site ainda apresenta um CAPTCHA apesar das medidas controle de QAs, CaptchaAI resolve e retorna um token que você injeta na página.
Este guia mostra como combinar as duas ferramentas – use o undetected-chromedriver para navegação controle de QA e CaptchaAI para quaisquer CAPTCHAs que ainda apareçam.
O que você precisa
| Requisito | Detalhes |
|---|---|
| Chave de API CaptchaAI | captchaai.com |
| Python 3.8+ | |
| Navegador Chrome | Instalado em seu sistema |
Instale dependências:
pip install undetected-chromedriver requests
Configuração básica
import undetected_chromedriver as uc
import requests
import time
def create_qa_browser_browser():
"""Create an undetected Chrome browser instance."""
options = uc.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
driver = uc.Chrome(options=options)
return driver
Resolvendo reCAPTCHA v2 em uma sessão controle de QA
Etapa 1: navegue e extraia a chave do site
API_KEY = "YOUR_API_KEY"
def extract_recaptcha_sitekey(driver):
"""Extract reCAPTCHA v2 sitekey from the page."""
try:
element = driver.find_element("css selector", "[data-sitekey]")
return element.get_attribute("data-sitekey")
except Exception:
# Try finding in iframe src
iframes = driver.find_elements("css selector", "iframe[src*='recaptcha']")
for iframe in iframes:
src = iframe.get_attribute("src")
if "k=" in src:
return src.split("k=")[1].split("&")[0]
return None
Etapa 2: Resolva com CaptchaAI
def solve_recaptcha_v2(sitekey, pageurl):
"""Submit reCAPTCHA v2 to CaptchaAI and return the token."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(20)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
Etapa 3: injetar o token e enviar
def inject_recaptcha_token(driver, token):
"""Inject the solved token into the page and submit."""
driver.execute_script(f'''
document.getElementById("g-recaptcha-response").innerHTML = "{token}";
document.getElementById("g-recaptcha-response").style.display = "block";
''')
# If there's a callback function, trigger it
driver.execute_script(f'''
if (typeof ___grecaptcha_cfg !== 'undefined') {{
var clients = ___grecaptcha_cfg.clients;
for (var key in clients) {{
var client = clients[key];
if (client && client.callback) {{
client.callback("{token}");
}}
}}
}}
''')
Fluxo de trabalho completo: Faça login com reCAPTCHA
import undetected_chromedriver as uc
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha(sitekey, pageurl):
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": pageurl, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(20)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
def main():
driver = uc.Chrome()
try:
# Navigate to target page
driver.get("https://staging.example.com/qa-login")
time.sleep(3)
# Fill in form fields
driver.find_element("id", "username").send_keys("user")
driver.find_element("id", "password").send_keys("pass")
# Extract sitekey
element = driver.find_element("css selector", "[data-sitekey]")
sitekey = element.get_attribute("data-sitekey")
pageurl = driver.current_url
print(f"Sitekey: {sitekey}")
# Solve CAPTCHA
token = solve_recaptcha(sitekey, pageurl)
print(f"Token: {token[:50]}...")
# Inject token
driver.execute_script(
f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)
# Submit form
driver.find_element("id", "submit-btn").click()
time.sleep(3)
print(f"Current URL: {driver.current_url}")
finally:
driver.quit()
if __name__ == "__main__":
main()
Resolvendo Cloudflare Turnstile
Para sites com widgets Cloudflare Turnstile, extraia o sitekey e resolva através do método Turnstile:
def solve_turnstile(sitekey, pageurl):
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "turnstile",
"sitekey": sitekey, "pageurl": pageurl, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(10)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
# Inject Turnstile token
def inject_turnstile_token(driver, token):
driver.execute_script(f'''
var input = document.querySelector('[name="cf-turnstile-response"]');
if (input) input.value = "{token}";
''')
Solução de problemas
| Problema | Causa | Correção |
|---|---|---|
| Incompatibilidade de versão do Chrome | UC não consegue encontrar driver correspondente | Atualize o Chrome ou especifique version_main em uc.Chrome() |
| CAPTCHA ainda aparece | Site usa sinal de navegador avançada | Isso é esperado – resolva com CaptchaAI |
| A envio controlado ao endpoint QA falha | ID de elemento ou retorno de chamada incorreto | Verifique a implementação do reCAPTCHA da página |
WebDriverException |
O Chrome travou | Adicione --no-sandbox e --disable-dev-shm-usage |
Perguntas frequentes
Por que usar o chromedriver não detectado com CaptchaAI?
O Undetected-chromedriver reduz os sinais de detecção de bot para que apareçam menos CAPTCHAs. Quando os CAPTCHAs ainda são acionados, CaptchaAI os resolve. A combinação dá a maior taxa de sucesso.
O chromedriver não detectado funciona no modo headless?
Sim, mas o modo headless pode acionar mais CAPTCHAs. Use options.add_argument("--headless=new") para o novo modo modo headless do Chrome.
Posso usar isso com Selenium Grid?
Sim, mas o undetected-chromedriver precisa corrigir o binário do driver local. Para configurações distribuídas, pré-atualize o driver em cada nó.
E se o site detectar automação apesar da UC?
Alguns sites usam detecção avançada além dos patches de UC. CaptchaAI lida com os CAPTCHAs resultantes independentemente do método de detecção.
Adicione CaptchaAI à automação do seu navegador
Obtenha sua chave API emcaptchaai.com. Combine navegação controle de QA com resolução confiável de CAPTCHA.