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
- El widget carga y muestra un mensaje publicitario como imagen.
- El usuario lee la frase de la marca y la escribe en el cuadro de entrada.
- La respuesta es verificada por los servidores de Solve Media.
- 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
- Resolución de CAPTCHA de imagen mediante API
- Cómo funciona la resolución de CAPTCHA de imágenes (OCR)
- Errores y soluciones comunes de OCR CAPTCHA
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:
- 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).
- Su test envía a CaptchaAI los datos públicos del widget (
sitekey, URL de la página, tipo de CAPTCHA). - CaptchaAI devuelve un token válido para esa página.
- Su test inyecta ese token en el campo correspondiente y envía el formulario.
- 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 (
backoffexponencial) 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.