Análisis técnico real de
f1live.me/dervlin.me/seckyes.ccDesmontando 4 capas de defensa: tokens firmados, anti-iframe, detector de sandbox y Cloudflare. Fecha del análisis: Octubre 2026
Queríamos dos cosas simples (en teoría):
Sky Sports F1) sin toda la web alrededor — solo el video.Lo que encontramos en el camino: un sistema anti-bot de 4 capas que hace técnicamente imposible ver el video sin aceptar la publicidad.
El video no está en f1live.me. Está escondido detrás de una cadena de 4 saltos:
┌─────────────────────────────────────────────────────────────────┐
│ 1. f1live.me/sky-sports-f1-sky-f1/formula-1/1 │
│ La página "bonita": menús NFL/NBA/F1, chat, tags, ads. │
│ Solo contiene un <iframe>. │
└────────────────────────────┬────────────────────────────────────┘
│ <iframe src=...>
▼
┌─────────────────────────────────────────────────────────────────┐
│ 2. embedsports.me/motorsports/sky-sports-f1-sky-f1-stream-1 │
│ El "embed". Carga embed.min.js + siteConfig (tokens). │
│ Aquí vive el anti-bot y el detector de sandbox. │
└────────────────────────────┬────────────────────────────────────┘
│ JS construye con tokens firmados
▼
┌─────────────────────────────────────────────────────────────────┐
│ 3. dervlin.me/sd0embed/motorsports?pid=5&v=skyf1&... │
│ El reproductor JW Player + HLS + P2P. │
│ Aquí se genera la URL real del stream. │
└────────────────────────────┬────────────────────────────────────┘
│ construye URL firmada
▼
┌─────────────────────────────────────────────────────────────────┐
│ 4. seckyes.cc?scode=sv2.xxx&stream=xxx&expires=xxx&... │
│ El manifiesto .m3u8 detrás de CLOUDFLARE. │
│ Sin cf_clearance → 401. Sin TLS de Chrome → 400. │
└─────────────────────────────────────────────────────────────────┘
Cada salto añade una capa de seguridad. Vamos una por una.
En la respuesta de embedsports.me, el servidor inyecta un JSON en cada visita:
const siteConfig = {
csrf: "YjQ2MzZjNTRjZWRhYWFiZDVhMzIyNjMzN2E4OWJiMzcyθ...", // base64 enorme
csrf_ip: "gygZRDIEO8iTmn+1qb/aT17KR5TObPvjXvfAv+CobNIBvRSBtSKw/...",
sec_hash: "BmMfPIIybm4sclCFeRdb2w",
sec_expires: 1792435119,
tracker: "pge=embed&lang=en&dom=em&ref=...",
trackerUrl: "https://shop.lbeato.store"
};
| Campo | Qué es | Para qué sirve |
|---|---|---|
sec_expires |
Timestamp Unix | La firma caduca (~60 segundos) |
csrf |
Token anti-CSRF: base64(hex.hex.firma) |
Evita peticiones falsificadas |
csrf_ip |
Token cifrado que contiene tu IP | Ata la sesión a tu dirección IP |
sec_hash |
Hash corto | Valida la combinación de tokens |
trackerUrl |
Dominio de tracking | Telemetría / anti-fraude |
Fíjate en la estructura de csrf:
YjQ2MzZjNTRjZWRhYWFiZDVhMzIyNjMzN2E4OWJiMzcy... . M... . ZDM4NGYwZTdlMjkz...
└──────── primer segmento ────────┘ └─ ts ─┘ └─── firma (parece HMAC) ───┘
Es una URL firmada. El servidor la valida con una clave secreta y rechaza cualquier manipulación.
Consecuencia: aunque copies la URL, muere en ~60 s y está atada a tu IP. No puedes “guardarla” para usar después.
Esta es la parte anti-hotlinking. En el código de embedsports.me está literal:
// Si soy la ventana de arriba (no estoy dentro de un iframe) → BLOQUEADO
if (window.top === window.self)
return e("Direct access blocked, place iframe embed code on your website.");
// Si no tengo referer → BLOQUEADO
if (!(document.referrer || location.ancestorOrigins?.length))
throw e("Referrer check failed, null referrer not allowed");
El reproductor solo funciona dentro de un <iframe> y solo con un Referer real:
| Escenario | ¿Funciona? | Por qué |
|---|---|---|
| Abrir la URL del player directamente | ❌ | window.top === window.self |
Abrir desde un archivo file:/// |
❌ | Referer = null |
| Abrir desde una web normal (http/https) | ✅ | Tiene referer y está en iframe |
Con sandbox en el iframe |
❌ | Lo detecta (ver Capa 3) |
Consecuencia: no puedes abrir el player “solo”; necesitas una página padre legítima que lo embeba.
Esta es, sin duda, la parte más astuta y donde se responde tu pregunta principal. ¡Aquí está el por qué no puedes quitar la publicidad!
El sitio inyecta en el DOM un objeto invisible:
if (esDispositivoRaro || esEdge) {
document.body.insertAdjacentHTML("beforeend",
'<object data="data:application/pdf;base64,aG1t" ' +
'width="1px" height="1px" ' +
'style="position:absolute;top:-500px;left:-500px;visibility:hidden;" ' +
'onerror="sandDetect();this.remove()"></object>');
}
window.sandDetect = () => e("Remove sandbox attributes on the iframe tag");
<object> con datos basura (aG1t = “hmt” en base64).sandbox, el navegador bloquea la carga del objeto → dispara onerror.onerror llama a sandDetect() → te muestra “Remove sandbox attributes on the iframe tag” y mata el video.El video y la publicidad comparten el MISMO entorno de ejecución.
sandbox al iframe para cortar eso → el objeto de prueba falla → el player detecta que bloqueaste la publicidad → se niega a reproducir.Es monetización coercitiva disfrazada de “seguridad”:
┌──────────────────────────────────────┐
│ Elige: │
│ │
│ A) Ves el video CON publicidad ✅ │
│ B) Bloqueas publicidad → NO video │
│ │
│ No existe opción C. │
└──────────────────────────────────────┘
Cuando el player por fin construye la URL del stream:
https://seckyes.cc?scode=sv2.08ab3c20...&stream=yehe4ipo9...&expires=1792435224
&u_id=stlan-fd6b28f7...&session_id=9e59bfde...&host_id=s-b3
Y ahí responde Cloudflare:
HTTP/2 401
server: cloudflare
cf-ray: a4d44fb40ef670a7-EZE
nel: {"report_to":"cf-nel","success_fraction":0.0,...}
cf-cache-status: DYNAMIC
cf_clearanceSe emite solo tras pasar un challenge JavaScript (o captcha). El navegador debe resolver un problema criptográfico antes de recibirla.
Cloudflare analiza cómo se negoció el cifrado HTTPS (orden de cifrados, extensiones, curvas). Python y curl tienen una “firma” distinta a Chrome.
Prueba real:
curl→ 401,yt-dlp(petición propia) → 400. Misma URL, misma cookie. Solo cambia el “olor” TLS.
La cookie cf_clearance está atada a:
Cámbialos → la cookie deja de valer.
Si la cookie se crea dentro de un iframe, Cloudflare la guarda particionada por el sitio de arriba (SameSite=None; Secure; Partitioned). No se puede reusar en otro contexto/dominio.
Junta las 4 capas y obtienes una cadena de requisitos que deben cumplirse simultáneamente:
| Requisito | Capa que lo impone | Cómo se “sortea” |
|---|---|---|
| IP concreta | csrf_ip + cf_clearance |
Misma IP (nada de proxies) |
| Token fresco (<60 s) | sec_expires |
Regenerar pedido por pedido |
| Dentro de un iframe con referer | Capa 2 (referer check) | Página padre real |
| NO tener sandbox | Capa 3 (detector <object>) |
Sacrificar bloqueo de ads |
| Pasar challenge JS | Cloudflare (cf_clearance) |
Navegador real |
| Fingerprint TLS de Chrome | Cloudflare (JA3/JA4) | Navegador real (no curl/python) |
| Mismo UA que generó la cookie | Cloudflare binding | No cambiar UA |
Es un sistema cerrado de confianza. El único cliente que acepta es:
Un navegador real, con tu IP, con tus cookies frescas, viendo su publicidad.
Todo lo demás — curl, yt-dlp, Chromium headless, iframes con sandbox — se detecta y se bloquea.
| Intento | Resultado | Quién lo bloqueó |
|---|---|---|
curl con URL firmada válida |
401 | Cloudflare (TLS fingerprint) |
yt-dlp (petición propia) |
400 | Cloudflare |
| Chromium headless (Selenium) | 403 en dervlin | Anti-bot de comportamiento |
| nodriver (headless) | no navega / no arranca | Detección de automatización |
iframe con sandbox |
cartel anti-adblock | Capa 3 (detector object) |
Página en file:// |
“null referrer not allowed” | Capa 2 |
Respuesta directa a tu pregunta. No se puede separar el video de la publicidad por estas razones:
Mismo circuito (Capa 3): el player detecta si bloqueas el entorno que el anuncio necesita. Bloqueas ads → no hay video.
uBlock solo corta red, no decides qué es “el video”: el bloqueador de anuncios corta peticiones a dominios de ads. A veces el video sigue; a veces hay una verificación de que el anuncio “cargó”. En este sitio, la Capa 3 asegura que la verificación falle si bloqueas.
El anti-bot está fundido con la monetización: no es que los desarrolladores sean torpes; es diseño deliberado. Es “o aceptas la publicidad o no hay contenido”.
Rendirse y usar un reproductor externo (mpv): ahí no hay publicidad porque no abres la web. Pero mpv necesita la cookie cf_clearance (Capa 4), que solo tu navegador real puede generar. Reutilizas tu sesión; no la automatizas desde cero.
m3u8 → Copy as cURL.mpv/yt-dlp → sin publicidad, sin navegador.No es automatizable desde cero, pero reutiliza tu sesión ya autorizada.
Entender estas capas es una excelente introducción a:
| Concepto | Qué es | Busca |
|---|---|---|
| JA3 / JA4 | Huella del handshake TLS. Delata curl vs Chrome | “TLS fingerprinting JA3” |
| Cloudflare Turnstile | El challenge JS moderno (reemplaza reCAPTCHA) | “Cloudflare Turnstile managed challenge” |
| CHIPS | Cookies particionadas por sitio de arriba | “CHIPS partitioned cookies” |
| HMAC-signed URLs | URLs firmadas con clave secreta | “URL signing HMAC” |
| Anti-adblock bait | El truco del <object> roto |
“anti-adblock bait object” |
| Token binding | Atar sesiones a IP/UA | “session token binding” |
| HLS / m3u8 | Formato de streaming (Apple) | “HLS m3u8 format” |
| P2P streaming | Distribuir video entre usuarios | “P2P HLS P2pEngine” |
curl --http2 vs curl --http1.1 y compara respuestas.chrome://net-export/ para ver tus propias conexiones TLS.<iframe> que restringe lo que el contenido embebido puede hacer.| Pregunta | Respuesta corta |
|---|---|
¿Por qué curl falla? |
Cloudflare detecta el fingerprint TLS |
¿Por qué yt-dlp falla? |
Igual: petición HTTP no es Chrome |
| ¿Por qué headless falla? | Anti-bot de comportamiento (403 en dervlin) |
| ¿Por qué el sandbox mata el video? | El detector <object> envenenado (Capa 3) |
| ¿Por qué no puedo quitar los ads? | El video y los ads comparten circuito; si bloqueas el entorno de ads, no hay video |
| ¿Se puede automatizar 100%? | No de forma estable: exige navegador real + IP + cookies + ads |
| ¿Qué SÍ funciona? | uBlock en tu navegador, o mpv con tu cookie capturada |
Moraleja: la “seguridad” aquí no protege al usuario; protege la monetización. El anti-bot y el anti-adblock son la misma cosa disfrazada de dos.
Análisis realizado con fines educativos. Todos los datos se obtuvieron de respuestas públicas del sitio.