Desafíos
Los navegadores alojados se encargan por sí solos de los desafíos de deslizador y de casilla. El servicio de resolución de desafíos, desactivado salvo que lo actives, atiende los que ellos no pueden.
Desafíos de deslizador
Algunos sitios responden con un desafío de tipo «desliza para verificar»: un control que hay que arrastrar hasta el final de una barra, o una pieza de rompecabezas que hay que arrastrar hasta su hueco. Un navegador alojado se encarga de ellos por ti, en cualquier pestaña y también dentro de frames. Está activado por defecto; pasa solveSliders: false cuando tu script se ocupe de ellos.
- Qué hace. Un deslizador simple se arrastra hasta el final. Un rompecabezas se arrastra hasta que la pieza encaja en su hueco: el navegador encuentra el hueco en la imagen, comprueba dónde quedó realmente la pieza y corrige. El arrastre es un movimiento del ratón con el botón pulsado y a ritmo humano, no un salto.
- Cuándo se contiene. Si no encuentra el hueco con seguridad, deja el rompecabezas sin tocar en lugar de adivinar, porque un arrastre equivocado puede contar en contra de la sesión. Lo intenta como máximo tres veces por página, y espera mientras alguien controla la sesión desde la vista en vivo o durante un traspaso.
- Qué ves. Cada intento es un evento
slideren la línea de tiempo de eventos de la sesión, que indica si el desafío desapareció después (passed) o no (failed), o por qué se dejó un rompecabezas sin tocar (skipped). - Solo se tocan desafíos: un deslizador cuenta como tal cuando la página o el widget que lo rodea lo indica (un captcha o una comprobación de verificación). Los inputs de rango, los carruseles y los filtros de precio no se tocan. La entrada de ratón de tu propio script y un arrastre en curso pueden mezclarse, así que pausa los clics mientras haya un desafío en pantalla, o desactiva la opción.
Desafíos de casilla
Algunos sitios piden primero marcar una casilla de «verifica que eres humano». Un navegador alojado la marca por ti, en cualquier pestaña y también dentro de frames, incluidos los widgets que ocultan la casilla a los scripts de la página. Es una opción aparte de la de los deslizadores, también activada por defecto; pasa solveCheckboxes: false para encargarte tú de estas casillas.
- Qué casillas. Solo una casilla cuyo propio texto indica que es una comprobación humana (humano, robot, captcha, verifica que eres…). Una casilla de «recordarme» o «acepto los términos» nunca se marca, diga lo que diga el resto de la página.
- El clic. Un movimiento del puntero a ritmo humano hasta la casilla, una breve pausa y una pulsación tan larga como la de una persona. Si la casilla abre después un deslizador, se trata como un deslizador.
- Qué ves. Cada intento es un evento
checkboxen la línea de tiempo de eventos de la sesión:passedcuando la casilla desapareció o quedó marcada,failedcuando seguía esperando. Como máximo tres intentos por página, y ninguno mientras alguien controla la sesión desde la vista en vivo o durante un traspaso.
Servicio de resolución de desafíos
Para los sitios que siguen presentando desafíos después de las acciones gratuitas de deslizador y de casilla, un navegador alojado puede pasar los desafíos más difíciles a un servicio de resolución. Está desactivado salvo que lo pidas: pasa challengeService: true para que elija por sí solo, o un objeto para elegir qué puede hacer. Usa tu propia clave del servicio de resolución, o la nuestra (se cobra por desafío resuelto).
Elegir de qué desafíos se encarga
Nunca le indicas qué widget ni qué proveedor usa un sitio. El navegador alojado reconoce por sí mismo cada desafío de la página, por su marcado, sus frames y su comportamiento, y lo clasifica en una de cinco categorías. Tú eliges categorías, no widgets.
| Categoría | Qué cuenta como tal | En auto |
|---|---|---|
token | Un widget que le entrega un token a la página: una casilla de «No soy un robot» que se convierte en un rompecabezas de imágenes, un widget invisible cuyo rompecabezas aparece, una comprobación interactiva del tipo «verifica que eres humano» que sigue sin respuesta. | Sí |
clearance | Una espera de página completa del tipo «comprobando tu navegador» que no se resuelve sola. | Sí |
block-page | La página de bloqueo de un sitio con un rompecabezas o una comprobación del dispositivo. | Sí |
image | Un código de texto distorsionado junto a un cuadro de texto, y un rompecabezas cuyo hueco el navegador no pudo ubicar por sí mismo. | Sí |
score | Una comprobación de puntuación invisible que la propia página ejecuta. | No: inclúyela tú en la lista |
- Selección automática.
challengeService: true, o un objeto sincategories(o concategories: "auto"): se atiende cada desafío que reconozca entoken,clearance,block-pageeimage, en todos los sitios.scorequeda fuera porque el navegador ya obtiene su propio token de puntuación: responderlo desde otro lugar cuesta una resolución en cada llamada, así que solo vale la pena para un sitio que rechace las puntuaciones de tus sesiones. - Elige categorías.
categories: ["token", "image"]atiende solo esas. Un desafío de otra categoría se sigue reportando en la línea de tiempo (comocategory_off), pero nunca se paga. - Elige sitios.
sites: ["shop.example"]lo limita a esos hosts y sus subdominios; en los demás no se reporta ni se pide nada. Combínalo concategoriespara «este tipo de desafío en ese sitio». - ¿No sabes qué usa un sitio? Ejecútalo una vez con
mode: "report": no se pide ni se paga nada, y la línea de tiempo lista cada desafío que mostraron las páginas comochallenge.detected, con sucategoryy si se puede resolver. Luego activa exactamente esas categorías para ese sitio.
// In the body of POST /api/v1/browsers, or in the SDK's launch options (cloud: true)
// Auto-select: every challenge it recognises (all categories but score), on every site
challengeService: true
// Only widgets that hand out a token, only on one site, at most EUR 0.20 per session
challengeService: { categories: ["token"], sites: ["shop.example"], maxSpendEur: 0.2 }
// Only full-page waits and block pages, with your own solving-service key
challengeService: { categories: ["clearance", "block-page"], key: "own" }
// Auto-select plus the score check, on one site
challengeService: { categories: ["token", "clearance", "block-page", "image", "score"], sites: ["shop.example"] }
// First find out what a site uses: report only, nothing asked or paid for
challengeService: { mode: "report" }Todos los campos
| Campo | Tipo | Por defecto | Significado |
|---|---|---|---|
categories | "auto" o una lista de token, score, clearance, block-page, image | "auto" | Qué tipos de desafío se pueden responder. auto incluye todos menos score. |
sites | lista de nombres de host | todos los sitios | Solo en estos hosts y sus subdominios (como máximo 50). |
key | "own" o "managed" | tu clave guardada si tienes una; si no, la nuestra | De quién es la clave del servicio de resolución: la tuya o la nuestra (se cobra por desafío resuelto). |
apiKey | string | ninguno | Tu clave del servicio de resolución, solo para esta sesión (se guarda cifrada y nunca se vuelve a mostrar). Implica key: "own". |
mode | "solve" o "report" | "solve" | report solo reconoce y reporta; no se pide ni se paga nada, y no hace falta ninguna clave. |
maxSolves | número entero, de 1 a 100 | 10 | Solicitudes por sesión; las solicitudes se detienen al llegar a esta cantidad. |
maxSpendEur | número, de 0.01 a 100 | 0.50 | Lo que una sesión puede gastar en resoluciones (con nuestra clave, lo que pagas tú); las solicitudes se detienen ahí. |
Cómo funciona
- Primero lo gratuito. Las acciones de deslizador y de casilla siempre van primero. Solo se recurre al servicio cuando un desafío sigue ahí después de haber tenido una oportunidad razonable: apareció un rompecabezas de imágenes, un widget invisible abrió su rompecabezas, un widget quedó sin responder durante unos 15 a 25 segundos, una espera de página completa no se resolvió en unos 20 segundos, o la página es una página de bloqueo o un código de texto.
- Cómo se introduce la respuesta. Como la página lo espera: un token en el campo de respuesta del widget y su callback, una cookie para el sitio y una recarga, un código escrito en su cuadro, una pieza de rompecabezas arrastrada a su lugar. Después comprueba que el desafío desapareció, igual que las acciones gratuitas.
- La misma IP. Las esperas de página completa y las páginas de bloqueo deben resolverse desde la IP que usa la respuesta: el servicio las resuelve a través de la propia IP de salida de tu sesión, mediante una conexión de corta duración y de un solo uso. Si un sitio rechaza un token, se pide una vez más de la misma forma.
- Tu clave o la nuestra.
key: "own"usa tu clave del servicio de resolución: guárdala una vez en el panel (Settings), o pasaapiKeycon la solicitud. Se guarda cifrada, nunca se vuelve a mostrar y nunca llega al navegador; le pagas al servicio directamente.key: "managed"usa la nuestra: cada desafío resuelto se cobra de tu saldo de navegadores alojados al precio propio del servicio × 1.5; los intentos fallidos son gratis. Omitekeypara usar tu clave guardada si tienes una, o la nuestra si no. - Límites. Como máximo 2 solicitudes por desafío y por página. Por sesión,
maxSolves(10 por defecto, como máximo 100) ymaxSpendEur(€0.50 por defecto): las solicitudes se detienen al llegar a cualquiera de los dos. Con nuestra clave, además, un tope mensual por cuenta (configúralo en el panel, como máximo €25). Una clave incorrecta o un saldo vacío en el servicio detiene las solicitudes para esa sesión. - Qué ves.
challenge.detecteduna vez por desafío y por página, ychallenge.servicepor cada solicitud (solved,failedoskipped, con el motivo y el costo del servicio) en la línea de tiempo de eventos;challenges(qué clave, cuántas solicitudes, cuánto costaron las resoluciones con nuestra clave) en la sesión. En una ejecución de agente, el agente espera mientras el servicio trabaja en una página. - Algunos widgets se detectan pero no se resuelven: su respuesta no se puede devolver a una página de forma general. Se reportan con
solvable: falsey nunca se cobran. La dirección de la página y los detalles del desafío se envían al servicio de resolución.
Qué pasa con cada tipo
| En la página | Categoría | Qué se le pide al servicio | Cómo se introduce la respuesta |
|---|---|---|---|
| Una casilla de «No soy un robot» cuyo clic abrió un rompecabezas de imágenes | token | Un token para ese widget | En el campo de respuesta del widget, y se llama al callback de la página con él |
| Un widget invisible cuyo rompecabezas de imágenes apareció | token | Un token para ese widget | Igual |
| Una comprobación interactiva del tipo «verifica que eres humano» que sigue sin respuesta | token | Un token para ese widget | Igual |
| Un código de texto distorsionado junto a un cuadro de texto | image | El texto de la imagen | Se escribe en el cuadro, tecla por tecla, después de hacer clic en él |
| Un deslizador de rompecabezas que el navegador no puede ubicar por sí mismo (por ejemplo, uno con un hueco señuelo) | image | Dónde está el hueco | El navegador arrastra la pieza hasta ahí y comprueba dónde quedó realmente |
| Una espera de página completa del tipo «comprobando tu navegador» que no se resuelve | clearance | Una cookie de clearance, resuelta a través de la IP de salida de tu sesión | Se establece para el sitio y luego la página se recarga |
| Una página de bloqueo con un rompecabezas o una comprobación del dispositivo | block-page | Una cookie, resuelta a través de la IP de salida de tu sesión | Se establece para el sitio y luego la página se recarga |
Una comprobación de puntuación invisible que la propia página ejecuta (solo con score en la lista) | score | Un token de puntuación para la acción propia de la página | Se entrega a la llamada con la que la propia página pide un token |
Las acciones gratuitas siguen yendo primero: un deslizador simple se arrastra, un rompecabezas cuyo hueco el navegador puede encontrar se coloca, y una casilla que se marca con un clic se pulsa, todo sin consultar al servicio. En el widget, la casilla en sí puede quedar sin marcar después de introducir un token: la página lee el campo de respuesta y el callback, no la casilla.
Desde los SDK
El SDK 0.38.0 o posterior acepta la opción al iniciar en la nube (Python: challenge_service, que también acepta max_solves, max_spend_eur y api_key). La línea de tiempo indica qué pasó; sus últimos eventos llegan unos segundos después de que termina la sesión.
import { Cloud, launch } from "clearcote";
const browser = await launch({
cloud: true,
challengeService: { categories: ["token", "image"], sites: ["shop.example"], maxSpendEur: 0.2 },
});
const page = await browser.newPage();
await page.goto("https://shop.example/signup");
// ... your script: challenges the free actions cannot clear are answered for you
const id = browser.cloudSession.id;
await browser.close();
const { events } = await new Cloud().browsers.events(id);
for (const e of events) if (e.type.startsWith("challenge.")) console.log(e.type, e.data);
// challenge.detected { category: "token", solvable: true }
// challenge.service { category: "token", outcome: "solved", applied: "callback", attempt: 1, ms: 12725, costUsd: 0.00013 }from clearcote import Cloud, launch
browser = launch(cloud=True, challenge_service={"categories": ["token", "image"], "sites": ["shop.example"], "max_spend_eur": 0.2})
page = browser.new_page()
page.goto("https://shop.example/signup")
session_id = browser.cloud_session["id"]
browser.close()
for e in Cloud().browsers.events(session_id)["events"]:
if e["type"].startswith("challenge."):
print(e["type"], e["data"])