Conserva las cookies de la aplicación al enviar un token resuelto

Por solvethree4 min de lectura

Un token de reCAPTCHA resuelto no sustituye las cookies de sesión ni el valor CSRF de la aplicación. Obtén el formulario y envíalo mediante la misma requests.Session para que el POST conserve las cookies recibidas durante el GET.

Usa las cabeceras de navegador devueltas por el servicio de resolución y el mismo proxy para ambas solicitudes a la aplicación. El ejemplo resuelve primero para que esas cabeceras estén disponibles antes de abrir el formulario.

En esta página

Mantén el GET y el POST del formulario en una sola sesión

Usa Python 3.10+ con requests y el SDK oficial de solvethree para Python instalados. El nombre de host de destino necesita un perfil activo en tu espacio de trabajo; enviar su nombre de host en una tarea no crea uno. Consulta la configuración del perfil de sitio si no está configurado.

  • Establece TARGET_URL en la URL del formulario de tu aplicación. Esta demostración en un sitio propio usa la misma URL para el GET y el POST.
  • Establece SOLVETHREE_PROXY en el único proxy utilizado para la resolución y ambas solicitudes a la aplicación.
  • Establece SOLVETHREE_API_KEY en la clave de API de tu espacio de trabajo. Ejecuta este código en el servidor.
requests.Session · conservar las cookies de la aplicación y un valor CSRF
# This owned demo form has an input named csrf_token and g-recaptcha-response.
import os
from html.parser import HTMLParser
from urllib.parse import urlsplit
import requests
from solvethree import Solvethree

class FormParser(HTMLParser):
    csrf = None
    def handle_starttag(self, tag, attributes):
        values = dict(attributes)
        if tag == "input" and values.get("name") == "csrf_token":
            self.csrf = values.get("value")

target = os.environ["TARGET_URL"]
proxy = os.environ["SOLVETHREE_PROXY"]
request = {"site": urlsplit(target).hostname, "action": "login", "proxy": proxy}
# Obtain the solver's browser headers before opening the application session.
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
with requests.Session() as session:
    session.headers.update({"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
    proxies = {"http": proxy, "https": proxy}
    page = session.get(target, proxies=proxies, timeout=20, allow_redirects=False)
    page.raise_for_status()
    parser = FormParser(); parser.feed(page.text)
    if not parser.csrf: raise RuntimeError("The expected demo CSRF input was not found")
    response = session.post(target, proxies=proxies, timeout=20, allow_redirects=False,
        data={"csrf_token": parser.csrf, "g-recaptcha-response": solution["token"]})
    print("Application HTTP status:", response.status_code)
    # Use the actual form's submit URL, fields and session rules. Inspect its result.

La llamada solve del SDK crea la tarea y consulta su estado hasta que esté lista o se lance una excepción. Después, el ejemplo aplica solution.userAgent y solution.secChUa a la sesión. El GET llena su almacén de cookies; el POST reutiliza ese almacén y envía solution.token junto con el valor CSRF extraído del formulario.

Cambia la acción login, la URL de envío y los campos del formulario de la demostración para que coincidan con tu aplicación. csrf_token es el nombre del campo de este formulario, no un requisito de solvethree. Ajusta el analizador HTML si el tuyo usa otro nombre o estructura e incluye cualquier otro campo obligatorio, como las credenciales de inicio de sesión. Si la URL de envío difiere de la URL del formulario, sigue usando la misma sesión.

Si la aplicación rechaza el POST

El estado HTTP que se muestra es un punto de partida, no una prueba de que el inicio de sesión haya tenido éxito. Inspecciona la respuesta de la aplicación y la solicitud saliente antes de pagar otra resolución. Una tarea lista significa que se generó una solución; la aplicación sigue decidiendo si acepta el envío.

No se encuentra el campo CSRF.

Comprueba el estado y el cuerpo de la respuesta al GET. El seguimiento de redirecciones está desactivado, por lo que una respuesta de redirección no es el formulario esperado.

Prueba esto: Obtén de forma explícita el formulario correcto mediante la misma sesión y después ajusta el analizador a su campo CSRF real.

La aplicación indica que falta la sesión o que el valor CSRF no es válido.

Comprueba si el GET recibió cookies, si el POST envió las cookies pertinentes y si su valor CSRF procede de esa respuesta del formulario.

Prueba esto: Mantén ambas solicitudes en la misma requests.Session. No obtengas el formulario con un cliente y lo envíes con otro.

La aplicación rechaza el CAPTCHA.

Inspecciona el campo del token saliente, la acción, el proxy, User-Agent y sec-ch-ua. Confirma que envías solution.token y no el ID de la tarea ni un token anterior.

Prueba esto: Usa el token actual, el mismo proxy utilizado para la resolución y las cabeceras de navegador devueltas. Si el token ha caducado o ya se ha evaluado, obtén uno nuevo poco antes del envío.

El POST se completa, pero el inicio de sesión no.

Inspecciona el cuerpo de la respuesta y cualquier destino de redirección, además de la URL de envío real y los campos obligatorios del formulario.

Prueba esto: Adapta los datos del formulario de la demostración al contrato de la aplicación. Un token de CAPTCHA no aporta credenciales ni otros campos de la aplicación que falten.

Ejecuta tu primera tarea.

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

Crear un espacio de trabajo
Conserva las cookies de la aplicación al enviar un token resuelto · solvethree