Envía una solución de CAPTCHA con Playwright para Python

Por solvethree4 min de lectura

Resuelve primero el CAPTCHA y después crea un contexto de Playwright con el mismo proxy y la identidad de navegador devuelta. Envía solution.token a través del campo que tu aplicación envía realmente.

El siguiente ejemplo envía un formulario de una página que controlas. Espera la respuesta POST de la aplicación; no intercepta reCAPTCHA ni depende de una función de retorno universal de CAPTCHA.

En esta página

Prepara el destino y el entorno

Usa Python 3.10+, instala Playwright y su navegador Chromium e instala el paquete wheel del SDK oficial de solvethree para Python. Mantén la clave de API del espacio de trabajo en el proceso de Python, no en el JavaScript del navegador.

  • TARGET_URL: la URL completa de la página de tu formulario. El ejemplo extrae su nombre de host para la solicitud de resolución.
  • SOLVETHREE_PROXY: la URL del proxy, incluidas las credenciales de autenticación si son necesarias. Se usa el mismo proxy para la resolución y el tráfico del navegador.
  • SOLVETHREE_API_KEY: la clave de API de tu espacio de trabajo.

El nombre de host de destino necesita un perfil activo disponible para tu espacio de trabajo. Configura el perfil del sitio antes de ejecutar el ejemplo. Cambia la acción login del ejemplo por la que requiera tu integración; enviar un nombre de host y una acción no crea un perfil. La solicitud usa reCAPTCHA Enterprise v3 de forma predeterminada.

Resuelve, configura Chromium y envía

Python Playwright · un envío real de formulario
# 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 es síncrono. Llamar a client.solve mediante asyncio.to_thread evita que su operación de creación y consulta bloquee el bucle de eventos de Playwright. Devuelve un resultado listo o lanza una excepción; el SDK no tiene un cliente asíncrono nativo.

El contexto del navegador usa solution.userAgent y solution.secChUa. El ejemplo también separa el servidor proxy de su nombre de usuario y contraseña, y decodifica las credenciales antes de pasarlas a Playwright. Como esta tarea usa un solo proxy, no hay un paso de selección de candidatos.

  1. 1.

    Adapta la entrada del token a la aplicación

    El ejemplo espera a que el campo se incorpore al documento, asigna solution.token y emite un evento de entrada. No requiere que el campo sea visible. Si tu aplicación envía un campo distinto o lee el estado del token en otro lugar, adapta esta transferencia para que coincida con su solicitud saliente.

  2. 2.

    Añade los requisitos de sesión del formulario

    El ejemplo empieza con un contexto de navegador nuevo. Añade cualquier sesión, preparación del formulario o gestión de CSRF que requiera tu aplicación antes de enviar.

  3. 3.

    Espera el POST correcto

    La espera de respuesta se registra antes de hacer clic en Submit. Su predicado busca un POST a la ubicación de red de la URL de destino. Si la página envía allí otras solicitudes POST, limita el predicado al endpoint de envío.

Lee la respuesta de la aplicación

El estado HTTP impreso confirma que ha llegado una respuesta coincidente. Comprueba el cuerpo de la respuesta de la aplicación o el estado resultante de la página para determinar si ha aceptado el envío. Una tarea lista de solvethree significa que se ha generado una solución, no que el destino la haya aceptado.

La aplicación rechaza un token listo.

Inspecciona la solicitud saliente del formulario antes de pagar por otra resolución.

Prueba esto: Confirma que contiene solution.token en lugar del ID de tarea o un valor antiguo. Comprueba que el envío usa el proxy de la resolución, el agente de usuario y los client hints devueltos, y el destino previsto.

La espera de respuesta captura una solicitud ajena.

Compara la URL del POST capturado con el endpoint real del formulario.

Prueba esto: Haz que el predicado de respuesta sea específico para ese endpoint en lugar de aceptar cualquier POST a la misma ubicación de red.

La llamada de resolución lanza una excepción antes del envío desde el navegador.

Distingue entre un error de solicitud HTTP y una tarea fallida en estado terminal.

Prueba esto: Gestiona por separado las respuestas HTTP que no indican éxito. Si una tarea falla, inspecciona errorCode y error y corrige la causa en lugar de reintentar con los mismos parámetros. El método solve del SDK ya se detiene cuando hay un fallo.

Ejecuta tu primera tarea.

Empieza con $5 de crédito en tu espacio de trabajo.

Crear un espacio de trabajo
Envía una solución de CAPTCHA con Playwright para Python · solvethree