Solucionador de captcha para
Selenium
Resolva o desafio dentro da execução em vez de deixar o job falhar. Um exemplo funcional em Python e os três fatores que decidem se o seu token é aceito.
import time
import requests
CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}
def solve(task: dict) -> dict:
"""Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
r = requests.post(
"https://api.captchano.com/v1/solve",
params={"wait": 60},
json=task,
headers=HEADERS,
timeout=75,
)
data = r.json()
# A solve can outlast the 60 s wait: poll the task until it finishes.
while data.get("status") in ("queued", "solving"):
time.sleep(5)
data = requests.get(
f"https://api.captchano.com/v1/task/{data['id']}",
headers=HEADERS,
timeout=30,
).json()
if data.get("status") != "ready":
raise RuntimeError(data.get("error") or data)
return data["solution"]
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/login")
sitekey = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey")
solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": driver.current_url})
driver.execute_script(
"document.getElementById('g-recaptcha-response').value = arguments[0]",
solution["token"],
)
driver.find_element(By.CSS_SELECTOR, "form").submit()O que decide se o token é aceito
- Repasse seu proxy. O token deve ser gerado por trás do mesmo IP de saída que o envia. Em sistemas que avaliam a sessão, isso é obrigatório, não uma otimização.
- Use o mesmo user agent. O Turnstile e vários sistemas anti-bot vinculam o token a um user agent. Retornamos o que foi usado para que você possa reutilizá-lo exatamente.
- Solicite no último momento. Os tokens expiram em cerca de 120 segundos. Peça um quando estiver pronto para enviar.
Bloqueante ou polling
O exemplo usa ?wait=60, então a chamada retorna a resolução pronta e a sua etapa no Selenium continua linear. Se você preferir não manter uma conexão aberta, remova o parâmetro, guarde o id retornado e faça polling em GET /v1/task/{id} a cada cinco segundos. Um token pelo qual você já pagou continua disponível por dez minutos, então uma conexão perdida não faz você perder a resolução.
Custo
$0.00598 por resolução bem-sucedida de reCAPTCHA v2, e resoluções que falham nunca são cobradas. Veja os preços de todos os tipos de desafio ou a referência da API para o formato completo da requisição.
Como a resolução se encaixa no Selenium
O Selenium controla um navegador real, então o desafio é renderizado exatamente como um usuário o veria. Leia a sitekey do DOM, solicite um token e grave-o de volta com execute_script antes de clicar em enviar.
- 01Carregue a página
Abra o alvo com o proxy e o user agent a partir dos quais você vai enviar o formulário.
- 02Leia a sitekey
Use find_element por [data-sitekey] e leia o atributo, além de data-callback, se existir.
- 03Resolva
Faça POST de type, sitekey e driver.current_url para /v1/solve?wait=60 com o mesmo proxy e user agent.
- 04Injete e envie
Use execute_script para preencher o campo de resposta e disparar o callback, depois clique em enviar.
Colocando o token na página
driver.execute_script define o campo oculto g-recaptcha-response ou cf-turnstile-response e, quando a página usa um, chama o callback do widget.
Onde as integrações costumam dar errado
Muitas páginas habilitam o botão de envio a partir do callback do widget. Preencher só o campo deixa o botão desabilitado.
A textarea de resposta é criada quando o widget é renderizado. Aguarde o iframe do widget antes de injetar.
O proxy do Selenium é definido na inicialização do driver. Passe a mesma string de proxy para a resolução, para que o token e o envio compartilhem o mesmo IP.
Perguntas frequentes sobre captcha no Selenium
O Selenium consegue resolver o reCAPTCHA sozinho?
Não. O Selenium controla o navegador, mas não consegue responder a um desafio de imagem, e navegadores automatizados têm mais chance de receber um. Você solicita um token a uma API de resolução e o injeta, como faz o exemplo desta página.
Isso funciona com undetected-chromedriver ou Selenium Grid?
Sim. A integração apenas lê o DOM e executa JavaScript, então funciona com qualquer sessão WebDriver, local ou remota, desde que você passe o mesmo proxy e user agent para a resolução.
Onde coloco o token do Turnstile?
O Turnstile usa um input oculto chamado cf-turnstile-response dentro do formulário. Defina o valor dele e chame o callback indicado em data-callback, se a página declarar um.
Como lidar com um captcha que só aparece às vezes?
Verifique se o widget existe após cada navegação e só chame a API quando ele estiver presente. A cobrança é por resolução bem-sucedida, então verificar não custa nada.
Guias que ajudam
Pronto para começar?
Comece com um teste grátis de 3 dias e depois pague por resolução bem-sucedida conforme seu tráfego cresce. Não é preciso cartão para o teste.