Envie uma solução de CAPTCHA com Playwright para Python

Por solvethree4 min de leitura

Resolva o CAPTCHA primeiro e depois crie um contexto do Playwright usando o mesmo proxy e a identidade de navegador retornada. Envie solution.token pelo campo que sua aplicação realmente envia.

O exemplo abaixo envia um formulário em uma página que você controla. Ele aguarda a resposta ao POST da aplicação; não intercepta o reCAPTCHA nem depende de um callback universal de CAPTCHA.

Nesta página

Prepare o destino e o ambiente

Use Python 3.10+, instale o Playwright e seu navegador Chromium e instale o pacote wheel oficial do SDK Python do solvethree. Mantenha a chave de API do espaço de trabalho no processo Python, não no JavaScript do navegador.

  • TARGET_URL: a URL completa da página do formulário. O exemplo extrai seu hostname para a solicitação de resolução.
  • SOLVETHREE_PROXY: a URL do proxy, incluindo credenciais de autenticação, se necessárias. O mesmo proxy é usado para a resolução e o tráfego do navegador.
  • SOLVETHREE_API_KEY: a chave de API do seu espaço de trabalho.

O hostname de destino precisa de um perfil ativo disponível para seu espaço de trabalho. Configure o perfil do site antes de executar o exemplo. Altere a ação login do exemplo para a ação exigida pela sua integração; enviar um hostname e uma ação não cria um perfil. A solicitação usa reCAPTCHA Enterprise v3 por padrão.

Resolva, configure o Chromium e envie

Python Playwright · um envio real de formulário
# Install playwright and the official Python SDK; run playwright install chromium.
import asyncio
import os
from urllib.parse import urlsplit, unquote
from playwright.async_api import async_playwright
from solvethree import Solvethree

async def main():
    target = os.environ["TARGET_URL"]
    proxy = urlsplit(os.environ["SOLVETHREE_PROXY"])
    client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
    task = {"site": urlsplit(target).hostname, "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    result = await asyncio.to_thread(client.solve, task, timeout=180)
    solution = result["solution"]
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch()
        try:
            netloc = proxy.netloc.rsplit("@", 1)[-1]
            context = await browser.new_context(
                proxy={"server": f"{proxy.scheme}://{netloc}", "username": unquote(proxy.username or ""), "password": unquote(proxy.password or "")},
                user_agent=solution["userAgent"], extra_http_headers={"sec-ch-ua": solution["secChUa"]})
            page = await context.new_page()
            await page.goto(target)
            field = page.locator('[name="g-recaptcha-response"]')
            await field.wait_for(state="attached")
            await field.evaluate("(field, token) => { field.value=token; field.dispatchEvent(new Event('input',{bubbles:true})); }", solution["token"])
            async with page.expect_response(lambda r: r.request.method == "POST" and urlsplit(r.url).netloc == urlsplit(target).netloc) as outcome:
                await page.get_by_role("button", name="Submit", exact=True).click()
            print("Application HTTP status:", (await outcome.value).status)
            # Check the application's actual response; adapt form/CSRF/session setup.
            await context.close()
        finally:
            await browser.close()

asyncio.run(main())

Solvethree é síncrono. Chamar client.solve por meio de asyncio.to_thread impede que sua operação de criação e consulta periódica bloqueie o loop de eventos do Playwright. A chamada retorna um resultado pronto ou lança uma exceção; o SDK não tem cliente assíncrono nativo.

O contexto do navegador usa solution.userAgent e solution.secChUa. O exemplo também separa o servidor proxy do nome de usuário e da senha, decodificando as credenciais antes de passá-las ao Playwright. Como essa tarefa usa um único proxy, não há etapa de seleção de candidatos.

  1. 1.

    Use o campo de token da aplicação

    O exemplo aguarda o campo ser anexado, atribui solution.token e dispara um evento de entrada. Ele não exige que o campo esteja visível. Se sua aplicação enviar um campo diferente ou ler o estado do token em outro lugar, adapte essa transferência para corresponder à solicitação enviada.

  2. 2.

    Adicione os requisitos de sessão do formulário

    O exemplo começa com um novo contexto de navegador. Adicione qualquer sessão, preparação do formulário ou tratamento de CSRF que sua aplicação exija antes do envio.

  3. 3.

    Aguarde o POST correto

    A espera pela resposta é registrada antes de clicar em Submit. Seu predicado corresponde a um POST para o endereço de rede da URL de destino. Se a página enviar outras solicitações POST para esse endereço, restrinja o predicado ao endpoint de envio.

Leia a resposta da aplicação

O status HTTP impresso confirma que uma resposta correspondente chegou. Verifique o corpo da resposta da aplicação ou o estado resultante da página para determinar se ela aceitou o envio. Uma tarefa pronta do solvethree significa que uma solução foi gerada, não que o destino a aceitou.

A aplicação rejeita um token pronto.

Inspecione a solicitação enviada pelo formulário antes de pagar por outra resolução.

Experimente: Confirme que ela contém solution.token, e não o ID da tarefa ou um valor antigo. Verifique se o envio usa o proxy da resolução, o user agent e os client hints retornados, além do destino pretendido.

A espera pela resposta captura uma solicitação sem relação com o envio.

Compare a URL do POST capturado com o endpoint real do formulário.

Experimente: Torne o predicado de resposta específico para esse endpoint, em vez de corresponder a todo POST para o mesmo endereço de rede.

A chamada de resolução lança uma exceção antes do envio pelo navegador.

Diferencie um erro de solicitação HTTP de uma tarefa encerrada com falha.

Experimente: Trate separadamente as respostas HTTP que não indicam sucesso. Para uma tarefa com falha, inspecione errorCode e error e corrija a causa, em vez de tentar novamente com as mesmas entradas. O método solve do SDK já para em caso de falha.

Execute sua primeira tarefa.

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

Criar um espaço de trabalho
Envie uma solução de CAPTCHA com Playwright para Python · solvethree