Use um resolvedor de CAPTCHA com Selenium

Por solvethree4 min de leitura

Use o solvethree para obter um token de reCAPTCHA Enterprise e depois use o Selenium para inserir solution.token no formulário da sua aplicação e enviá-lo. O SDK resolve a tarefa; ele não preenche o formulário do navegador para você.

O exemplo usa um formulário HTTPS com um campo de token e um botão de envio. Adapte esses seletores à aplicação que você está testando.

Nesta página

Prepare o formulário e o ambiente Python

  1. 1.

    Instale as dependências

    Use Python 3.10 ou mais recente com Chrome. Instale o pacote selenium pelo pip e depois instale o SDK Python oficial do solvethree a partir do arquivo wheel disponível para download. Use as instruções de instalação por download direto na integração com Python; não as substitua por uma instalação presumida a partir de um registro de pacotes.

  2. 2.

    Configure o perfil de destino

    Configure o hostname do formulário sob seu controle no console do solvethree e verifique se o perfil está ativo para seu espaço de trabalho. Enviar um hostname em uma tarefa não cria esse perfil. O exemplo solicita a ação login; altere-a se sua aplicação usar outra ação.

  3. 3.

    Defina as variáveis de ambiente

    Defina TARGET_URL como a URL HTTPS completa do seu formulário, SOLVETHREE_PROXY como a URL do seu proxy HTTP ou HTTPS e SOLVETHREE_API_KEY como a chave de API do seu espaço de trabalho. Mantenha a chave no processo Python, não no JavaScript da página.

Resolva primeiro e depois inicie o Chrome com a identidade retornada

Este exemplo com Chrome exige um proxy com autorização por lista de IPs permitidos, sem nome de usuário ou senha. Ele rejeita URLs de proxy que contenham credenciais e não implementa a configuração de proxy autenticado.

A tarefa usa o hostname extraído de TARGET_URL, a ação login e um proxy. Depois que solve retorna um resultado pronto, o Chrome é iniciado com esse mesmo proxy e o userAgent retornado. Antes da navegação, o exemplo também define o cabeçalho secChUa retornado.

Selenium + Python · Chrome com um proxy autorizado por IP
# Install selenium and the official solvethree Python SDK first.
import os
from urllib.parse import urlsplit
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from solvethree import Solvethree

target = os.environ["TARGET_URL"]  # Your configured HTTPS form page.
proxy_url = os.environ["SOLVETHREE_PROXY"]
proxy = urlsplit(proxy_url)
if proxy.username or proxy.password:
    raise ValueError("This Chrome example requires an IP-allowlisted proxy without URL credentials")
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
result = client.solve({"site": urlsplit(target).hostname, "action": "login", "proxy": proxy_url})
solution = result["solution"]
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=" + proxy_url)
options.add_argument("--user-agent=" + solution["userAgent"])
driver = webdriver.Chrome(options=options)
try:
    driver.execute_cdp_cmd("Network.enable", {})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
        "headers": {"sec-ch-ua": solution["secChUa"]}
    })
    driver.get(target)
    # Adapt the field and button to your application's form contract.
    field = WebDriverWait(driver, 20).until(
        lambda browser: browser.find_element(By.NAME, "g-recaptcha-response")
    )
    driver.execute_script("""
        arguments[0].value = arguments[1];
        arguments[0].dispatchEvent(new Event('input', {bubbles:true}));
    """, field, solution["token"])
    driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
    # Check your application's success response here.
finally:
    driver.quit()

Solvethree.solve cria a tarefa uma única vez e consulta seu status até que esteja pronta ou lance uma exceção. Só então o navegador navega até o formulário. O script aguarda o campo de token, atribui solution.token, dispara um evento de entrada e clica no botão de envio. O Chrome é fechado no bloco finally.

Adapte as premissas do formulário da demonstração

  • TARGET_URL é a página do formulário da sua aplicação. O site da tarefa é seu hostname, não a URL completa; requisições de reCAPTCHA não usam um campo url ou type.
  • login é a ação do exemplo. Substitua-a pela ação usada pela aplicação e pelo perfil configurado para ela.
  • By.NAME com g-recaptcha-response localiza a textarea da demonstração. Use o campo ou parâmetro de envio que sua aplicação realmente lê. Atribuir o valor e disparar um evento de entrada é a transferência da demonstração, não um callback universal de reCAPTCHA.
  • button[type="submit"] identifica o botão de envio da demonstração. Substitua-o por um seletor inequívoco para seu formulário e mantenha o comportamento de sessão, CSRF e callback exigido pela aplicação.

A espera explícita de 20 segundos do exemplo verifica apenas se a textarea existe. Após clicar em Submit, adicione uma espera condicional pelo resultado real da sua aplicação, como o estado de sucesso ou um erro de validação. Use um prazo total para o fluxo do navegador separado do tempo limite do solucionador; não substitua verificações de estado por pausas fixas nem misture esperas implícitas e explícitas sem critério.

Verifique a etapa com falha antes de pagar por outra resolução

A tarefa de resolução falha antes de o Chrome ser iniciado.

Inspecione errorCode e error da tarefa em estado terminal. Diferencie uma tarefa com falha de um erro de requisição HTTP.

Experimente: Corrija o problema de entrada, perfil ou conectividade informado antes de tentar novamente. Pare de consultar uma tarefa com falha; entradas inválidas que não foram alteradas não melhorarão com outra requisição.

O Selenium excede o tempo limite ao procurar a textarea.

Confirme que o Chrome chegou ao formulário pretendido e que a página realmente contém o campo com o nome usado na demonstração.

Experimente: Substitua o localizador da demonstração pelo mecanismo de transferência de token da sua aplicação e aguarde o estado que o torna disponível. Um tempo limite maior não corrigirá um seletor errado.

O token está pronto, mas a aplicação rejeita o envio.

Primeiro, inspecione a requisição de saída da aplicação. Verifique se ela contém solution.token — não o ID da tarefa nem um valor antigo — e se a ação, o proxy, a identidade do navegador e a sessão correspondem ao fluxo pretendido.

Experimente: Corrija o parâmetro enviado ou os requisitos da aplicação antes de solicitar outro token. Uma tarefa pronta fornece uma solução; a resposta da aplicação determina se o envio foi aceito.

Execute sua primeira tarefa.

Comece com $5 em créditos no espaço de trabalho.

Criar um espaço de trabalho
Use um resolvedor de CAPTCHA com Selenium · solvethree