2008-11-13 20 views
11

Tenemos videos de YouTube en un sitio y queremos detectar si es probable que no puedan verlos debido a la política de la compañía (la mayoría de las veces).Detectando si YouTube está bloqueado por la compañía/ISP

Tenemos dos sitios:

1) Flex/Flash 2) HTML

Creo que con Flex puedo intentar descargar http://youtube.com/crossdomain.xml y si es XML válido suponer el sitio está disponible

Pero con HTML no sé cómo hacerlo. Ni siquiera puedo pensar en un "buen truco".

Respuesta

14

Me gusta la solución del lacker, pero sí, crea un race condition. Esto va a funcionar y no creará un contition carrera:

var image = new Image(); 
image.onload = function(){ 
// The user can access youtube 
}; 
image.onerror = function(){ 
// The user can't access youtube 
}; 
image.src = "http://youtube.com/favicon.ico"; 
+3

como con la solución de lacker, si la página de bloqueo tiene un favicon esto causará un falso positivo. Debería verificar la presencia de algo distinto para youtube. –

+0

@Colin Pickard: Buen punto. Quizás tengas razón. Pero supongo que si hay una página de bloqueo usaría un HTTP 404 (No encontrado) u otro Código de estado de error, así que supongo que no podrá recuperar la imagen. Supongo que la forma correcta sería hacer un XMLHttpRequest y mirar la respuesta, pero el favicon es más fácil de codificar y más fácil que, por ejemplo, un navegador de teléfono móvil lo implementa –

+0

IE en Windows phone 8.1 siempre llama a la función onerror. ¡Parece que el navegador no considera .ico como un formato de imagen válido! – smohadjer

8

Esto debería funcionar. Básicamente, carga un archivo javascript de youtube.com, luego verifica si existe una función en ese archivo.

<html> 

<head> 
    <script src="http://www.youtube.com/js/account.js"></script> 
    <script> 
     function has_you_tube() 
     { 
      if(typeof addVideosToQuicklist == 'function') 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 

     } 
    </script> 

</head> 
<body> 
    <script>alert("has_youtube: " + has_you_tube()); </script> 
</body> 


</html> 
+0

Nota, una buena manera de probar esto es agregar: 127.0.0.1 www.youtube.com a sus anfitriones el archivo –

+0

¿Qué? ¿Por qué 127.0.0.1/js/account.js existiría y tendría esa función en él? – Karl

+2

@Karl: esta es una forma de probar el caso cuando youtube * está bloqueado *. Por supuesto, el caso desbloqueado se probaría dejando esta línea fuera de los hosts. –

14

Puede cargar una imagen de youtube utilizando javascript y comprobar sus propiedades. El favicon es pequeña y tiene una misma URL -

var image = new Image(); 
image.src = "http://youtube.com/favicon.ico"; 
if (image.height > 0) { 
    // The user can access youtube 
} else { 
    // The user can't access youtube 
} 

Creo que esto es un poco mejor que la carga de Javascript, porque esto no va a tratar de ejecutar cualquier código, y mientras youtube podría cambiar el nombre de sus archivos javascript, o funciones de las archivos, es poco probable que cambien el nombre de su favicon.

+0

Me gusta más que mi propia solución –

+0

¿no es esto una condición de carrera? –

+0

buena idea, gracias por compartir. – mmattax

1

me quedé atrapado en este hoy y probé la prueba favicon pero no estaba trabajando en el IE. Estaba usando el YouTube Player API Reference for iframe Embeds para incrustar videos de youtube en mi sitio, así que lo que hice fue verificar el reproductor var definido justo antes del onYouTubeIFrameReady con un retraso en la llamada javascript.

<script> function YouTubeTester() {    
      if (player == undefined) { 
       alert("youtube blocked"); 
      } 
     } 
</script> 
<script>window.setTimeout("YouTubeTester()", 500);</script> 

Parece que funciona para mí. Necesitaba la demora para que funcione en IE.

0

Esto funcionó para mí ... También es mi primer mensaje, espero que ayude a alguien también.

<?php 

$v = file_get_contents("https://www.youtube.com/iframe_api"); 

//Tie counts to a variable 
$test = substr_count($v, 'loading'); 

if ($test > 0) 

{ ?> 
    <iframe>YOUTUBE VIDEO GOES HERE</iframe> 

    <?php 
} 

else 

{ 

echo "<br/> no connection"; 

} 

?> 
+1

Esto no es realmente una respuesta a la pregunta - OP no está utilizando php. – Sculper

Cuestiones relacionadas