Explicaciones Técnicas

¿Qué es CAPTCHA de Solve Media?

Solve Media CAPTCHA (ahora parte de Permit.io / Radius Networks) era un CAPTCHA basado en publicidad que reemplazaba el texto aleatorio distorsionado con mensajes y eslóganes de marca. En lugar de escribir "aX3kP", los usuarios escribieron una frase reconocible como "Calidad en la que puedes confiar".

Si bien Solve Media es menos común hoy en día, todavía aparece en algunos sitios web. Funciona como un CAPTCHA de texto estándar y se puede resolver con el mismo enfoque de OCR de imagen.


Cómo funciona Solve Media

  1. El widget carga y muestra un mensaje publicitario como imagen.
  2. El usuario lee la frase de la marca y la escribe en el cuadro de entrada.
  3. La respuesta es verificada por los servidores de Solve Media.
  4. Si es correcto, se continúa con el envío del formulario.
┌─────────────────────────────────┐
│                                 │
│   "Taste The Rainbow"           │
│                                 │
├─────────────────────────────────┤
│ Type the phrase: [____________] │
│                     [Verify]    │
└─────────────────────────────────┘

Resolver CAPTCHA de medios versus texto estándar

Característica Resolver medios CAPTCHA de texto estándar
Contenido del texto Frases de marca, palabras en inglés. Personajes aleatorios
Legibilidad Alto (destinado a ser legible) Bajo (destinado a ser difícil)
distorsión mínimo pesado
Modelo de ingresos Publicidad Ninguno
Dificultad para OCR Fácil (texto limpio) Duro (distorsionado)
Experiencia de usuario Mejor (palabras reconocibles) Peor (difícil de leer)

Identificar Solve Media en una página

Busque estos marcadores:

<!-- Solve Media script -->
<script src="https://api.solvemedia.com/papi/challenge.script"></script>

<!-- Widget container -->
<div id="adcopy-outer"></div>

<!-- Hidden response fields -->
<input type="hidden" name="adcopy_challenge" />
<input type="hidden" name="adcopy_response" />

Los elementos con ID que comienzan con adcopy- o solvemedia indican Solve Media CAPTCHA.


Resolver Resolver medios con CaptchaAI

Dado que Solve Media muestra texto en una imagen, se puede resolver con el método estándar de OCR de imagen:

pitón

import requests
import time
import base64

API_KEY = "YOUR_API_KEY"

# Capture the CAPTCHA image
# Method 1: Screenshot the widget
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com/page-with-solvemedia")

captcha_img = driver.find_element(By.CSS_SELECTOR, "#adcopy-puzzle-image img")
captcha_img.screenshot("solvemedia.png")

# Submit to CaptchaAI
with open("solvemedia.png", "rb") as f:
    img_b64 = base64.b64encode(f.read()).decode()

response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "base64",
    "body": img_b64,
    "phrase": 1,      # Contains spaces (multi-word phrase)
    "json": 1
})

task_id = response.json()["request"]

# Poll for solution
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        text = result["request"]
        print(f"Phrase: {text}")
        break

# Type the phrase
driver.find_element(By.CSS_SELECTOR, "#adcopy_response").send_keys(text)
driver.find_element(By.CSS_SELECTOR, "form").submit()

Nodo.js

const axios = require('axios');
const fs = require('fs');

async function solveSolveMedia(imagePath) {
  const imageB64 = fs.readFileSync(imagePath).toString('base64');

  const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
    params: {
      key: 'YOUR_API_KEY',
      method: 'base64',
      body: imageB64,
      phrase: 1,
      json: 1
    }
  });

  const taskId = submit.data.request;

  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
    });
    if (res.data.status === 1) return res.data.request;
  }
  throw new Error('Timeout');
}

Consideraciones clave

consejo ¿Por qué?
Establecer phrase=1 Las frases de Solve Media contienen espacios
Establecer numeric=2 Las frases suelen ser solo letras.
No configurar min_len/max_len La longitud de la frase varía
Mantenga el caso como está Algunas implementaciones no distinguen entre mayúsculas y minúsculas

Preguntas frecuentes

¿Sigue activo Solve Media?

Solve Media fue adquirida y renombrada. Algunas implementaciones heredadas todavía existen en sitios web más antiguos, pero las nuevas implementaciones son raras.

¿Por qué Solve Media es más fácil de resolver que reCAPTCHA?

Solve Media fue diseñado para ser legible: era un producto publicitario, no un producto de seguridad. El texto era intencionalmente claro para que los usuarios leyeran el mensaje de la marca.

¿Puedo resolver Solve Media sin OCR?

En algunos casos, el texto de la frase está disponible en la fuente de la página o en la respuesta API, lo que hace innecesaria la extracción de imágenes. Verifique el campo oculto adcopy_challenge.

¿CaptchaAI tiene un método Solve Media dedicado?

No. Utilice el método OCR de imagen estándar (method=base64 o method=post) con phrase=1.


Guías relacionadas

Configuración recomendada para su pipeline

Use exactamente la misma configuración de navegador en todos sus entornos de QA, staging y CI. Esto evita que un test funcione en local y falle en CI sin razón aparente.

from selenium import webdriver

def make_driver(headless: bool = True) -> webdriver.Chrome:
    options = webdriver.ChromeOptions()
    if headless:
        options.add_argument('--headless=new')
    options.add_argument('--window-size=1280,800')
    options.add_argument('--lang=es-ES')
    return webdriver.Chrome(options=options)

Mantener viewport, idioma y user-agent por defecto idénticos en todos los runners reduce la varianza y facilita comparar resultados entre ejecuciones de su propio QA.

Cómo se integra CaptchaAI en su pipeline propio

El patrón de integración con CaptchaAI siempre es el mismo, independientemente del lenguaje o framework de pruebas que use:

  1. Su test detecta el widget de CAPTCHA en la página de su propia aplicación (formulario de QA, landing de staging, endpoint de preproducción).
  2. Su test envía a CaptchaAI los datos públicos del widget (sitekey, URL de la página, tipo de CAPTCHA).
  3. CaptchaAI devuelve un token válido para esa página.
  4. Su test inyecta ese token en el campo correspondiente y envía el formulario.
  5. Su backend verifica el token con el proveedor de CAPTCHA, exactamente igual que con un usuario real.

Este flujo se aplica únicamente a integraciones que usted controla. No se utiliza para sortear protecciones de sitios de terceros.

Métricas y observabilidad

Incluya métricas específicas para los pasos relacionados con CAPTCHA en sus pipelines de QA. Esto le permite detectar regresiones en su propia integración antes de que lleguen a producción:

  • Tiempo de resolución por intento — desde la solicitud a CaptchaAI hasta la entrega del token.
  • Tasa de éxito por endpoint propio — cuántas verificaciones backend pasan respecto al total de intentos.
  • Distribución de errores — agrupados por código (ERROR_*, timeouts internos, fallos de red).
  • Latencia extremo a extremo — incluyendo render de la página, resolución de CAPTCHA y respuesta de su backend.

Conserve trazas (logs, capturas, HAR) durante un período razonable para poder reproducir incidentes en su entorno QA cuando un test falle de forma intermitente.

Buenas prácticas en su entorno QA

  • Pruebe siempre sobre su propia aplicación o sobre entornos explícitamente autorizados.
  • Mantenga una API key de CaptchaAI separada para QA, distinta de la de producción, para no mezclar métricas.
  • Defina timeouts y reintentos razonables (backoff exponencial) para no acumular trabajos pendientes en CaptchaAI durante caídas.
  • Versione sus snapshots de configuración (sitekey, action, umbrales) junto al código de los tests.
  • Revise periódicamente el changelog de su proveedor de CAPTCHA para anticipar cambios que afecten a su propia integración.

Solución de problemas

Síntoma Acción recomendada
El test no detecta el widget Revise selectores y tiempos en su entorno staging
CaptchaAI devuelve ERROR_NO_SLOT_AVAILABLE Reintente con backoff en su pipeline interna
La validación backend rechaza el token Compare action/sitekey con su configuración real
El test funciona en local pero falla en CI Iguale viewport, idioma y user-agent en ambos entornos
Tiempos de resolución muy variables Revise concurrencia y límites de su API key de CaptchaAI

Valide sus integraciones CAPTCHA en entornos propios con CaptchaAI.

Los comentarios están deshabilitados para este artículo.