Envie uma solução de CAPTCHA com Playwright para Python
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
# 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.
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.
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.
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.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.