Página 1 de 2

Conector netutv reparado

Publicado: 15 Jun 2014, 06:45
por robalo
Netu.tv ha cambiado la url para los m3u8

Edito: elimino el archivo. El archivo no es válido. Lo siento, pensaba que sería igual de fácil que antes.
ReEdito: Más abajo está el bueno :)

Re: Conector netutv reparado

Publicado: 18 Jun 2014, 10:46
por chopchop
robalo escribió:Netu.tv ha cambiado la url para los m3u8
He estado mirándolo un poco y parece que ahora el video lo hospeda en hqq.tv
Tiene 2 versiones, un reproductor de flash y uno html5 que utilizan ambos una playlist m3u8 con el video troceado en muchos cachos.

La url final de una playlist es así:

http://c1.hqq.tv/sec/8JvzVXGTyY8T66ArFN ... e.mp4.m3u8

Siendo c1.hqq.tv un servidor variable desde c1 hasta c6 y que son intercambiables.

La ristra de números /sec/8JvzVXGTyY8T66ArFN7CfA/1403121600 es generada así que no se puede usar el método actual que tiene el script de sustituir elementos en las urls conocidas.

No encuentro tampoco dónde hacen las llamadas y me parece bastante complicado seguir el código, que está bastante ofuscado.

La playlist tiene esta pinta y no sé si una vez conseguida la ruta a los archivos se pueden concatenar en un .strm o similar para que el xbmc los reproduzca seguidos y sin cortes.

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:NO
#EXT-X-VERSION:2
#EXT-X-TARGETDURATION:20
#EXTINF:20,
1393037748ea76e.mp4Frag1Num0.ts
#EXTINF:20,
1393037748ea76e.mp4Frag1Num1.ts
#EXTINF:20,
1393037748ea76e.mp4Frag2Num2.ts
#EXTINF:20,
1393037748ea76e.mp4Frag4Num3.ts
#EXTINF:20,
1393037748ea76e.mp4Frag4Num4.ts

Re: Conector netutv reparado

Publicado: 18 Jun 2014, 11:33
por robalo
Si, es un coñazo. De vez en cuando le hecho un vistazo para ver si tengo un mejor día. Hay veces que pieso que la primera parte de la url se extrae de la cookies, otras veces que está en los escripts codificado en utf8-b64 y utf8-b64 invertido y otras veces las dos cosas.

Tengo que comprobar cada cuanto tiempo cambian las urls o dejan de ser válidas

Re: Conector netutv reparado

Publicado: 18 Jun 2014, 18:21
por chopchop
robalo escribió:otras veces que está en los escripts codificado en utf8-b64
Me has dado la idea con lo de la codificación utf8 y he conseguido desofuscar una url. El problema es llegar a la URL donde sale ya que me topo con un muro de javascript que no sé salvar.

He llegado a una url tal que así
http://hqq.tv/player/embed_player.php?v ... B4UU&pass=


y en la variable SSzdbh de javascript está la cadena del fichero ofuscada que se puede desofuscar con este código:

Código: Seleccionar todo

<html>
<head>
<script type="text/javascript">
	function tb(b) {
		if (b.indexOf(".") == -1) {
			b = b.substr(1);
			s2 = "";
			for (j = 0; j < b.length; j += 3) s2 += "%u0" + b.slice(j, j + 3);
			b = unescape(s2)
		}
		return b
	}

	window.onload = function() {
		var boton = document.getElementById('boton');

		boton.onclick = function() {
			var v = document.getElementById('texto').value;
			var t = tb(v);
			var c = document.getElementById('cont-texto')
			c.innerHTML = t;
		}
	}
</script>
<body>
Cadena cifrada: <input id="texto" size="64" type="text" /> <input id="boton" type="button" value="Convertir" />
<div id="cont-texto"></div>
</body>
Al acceder a esta página html si metes una cadena ofuscada en la caja de texto y le das al botón deberías ver la url de la playlist.

La variable es dinámica y cambia en cada carga, pero no creo que sea dificil capturarla con una expresión regular.
Para desofuscar la cadena sólo hay que crear la función tb[*] en python y no es complicada.

El problema que veo ahora es cómo sacar la clave del parámetro at en la url del reproductor, ya que lo que veo es que sin ese parámetro la página da error 404 pero contiene un código javascript ofuscado que creo que es la clave.

Luego también está el problema de juntar la playlist, pero ese es otro problema

[*]La función para la desofuscación la he sacado del fichero javascript uppod-0.4.9.js adjunto en esa misma página. He pasado el fichero por un formateador de javascript y he podido encontrar la funcón tb donde hace la desofuscación.

Re: Conector netutv reparado

Publicado: 18 Jun 2014, 20:05
por jesus
Las playlist m3u8 son reproducibles directamente :)

Re: Conector netutv reparado

Publicado: 18 Jun 2014, 21:39
por robalo
Buen trabajo chopchop, era lo que me faltaba :) eres grande

Le key 'at' se puede extraer de

Código: Seleccionar todo

http://hqq.tv/player/embed_player.php?vid=U14H3MXO3S65&autoplay=no
Al final del archivo hay un script con un rochizo muy largo. Cogemos el chorizo

Código: Seleccionar todo

<script language="javascript" type="text/javascript" src="data:text/javascript;charset=utf-8;base64,([^"])+"><\/script>
La cadana la pasamos de b64 a utf8
El resultado de esta operación nos devuelve otro chorizo, pero esta vez invertido
Se invierte y la nueva cadena la pasamos de b64 a utf8
Ahora nos devuelve otro chorizo del tipo '%u003c%u0066%u006f...'
Le hacemos unescape y tendriamos

Código: Seleccionar todo

<form  id="form-98722570" method="get" action="http://hqq.tv/player/embed_player.php" target="_self" hidden>		
  <input name="vid" id="text" value="U14H3MXO3S65">
  <input name="at" id="text" value="9d746aa93cc758aee8a5ee39876d980c">
  <input name="autoplayed" id="text" value="yes">
  <input name="referer" id="text" value="on">
  <input name="http_referer" id="text" value="http://netu.tv/watch_video.php?v=U14H3MXO3S65">
  <input name="pass" id="text" value="">
</form>
<script>
	if ((self!=top)&&(m == true)){
		document.getElementById('c_page').setAttribute('style', 'display:block; margin: 0px; position:absolute; top:0;left:0; width:100%; height:100%; padding:0;');
	}else{
		document.getElementById('c_page').innerHTML = "";
		document.getElementById('not').setAttribute('style', 'display:block;');
	}
</script>
que es el formulario donde están los datos a pasar

Si tengo tiempo hago un script en javascript, pero creo que ya lo tenemos :)

Re: Conector netutv reparado

Publicado: 19 Jun 2014, 08:58
por robalo
El script en javascript
Para que funcione el script el navegador tiene que permitir el acceso de datos entre dominios.
Que yo sepa sólo podemos configurar dos navegadores para que funcione, IE y Chrome.

IE:
Herramientas->Opcines de Internet->Zona de Internet->Nivel personalizado...->Miscelánea->Tener acceso a origen de datos entre dominios = Habilitar
Chrome: (por consola)
chrome.exe --disable-web-security

Código: Seleccionar todo

<html>
<head>
<script type="text/javascript">
	function at(){

		var id_video = document.getElementById('id_video').value;
		var m = 'GET';
		var f = "http://hqq.tv/player/embed_player.php?vid="+id_video+"&autoplay=no";

		var xmlhttp = new XMLHttpRequest();

		xmlhttp.onreadystatechange
		=function(){
			if (xmlhttp.readyState==4 && xmlhttp.status==200){

				var data = xmlhttp.responseText;

				var match_b64_1 = /base64,(.+?)"/;
				var b64_1 = data.match(match_b64_1)[1];
				var utf8_1 = decode64(b64_1);

				var match_b64_inv = /='(.+?)';/;
				var b64_inv = utf8_1.match(match_b64_inv)[1];

				var start = 0, end = b64_inv.length - 1, arr = new Array(end);
				while (end >= 0)
					arr[start++] = b64_inv.charAt(end--);
				var b64_2 = arr.join('');
				var utf8_2 = decode64(b64_2);

				var match_at = /<input name="at" id="text" value="(.+?)">/;
				var at = utf8_2.match(match_at)[1];

				// ver resultados de los pasos
				var res = document.getElementById('res');
				res.innerHTML =
					"<b>b64_1:</b><br>"+b64_1+"<br>"+
					"<b>utf8_1:</b><br>"+utf8_1+"<br>"+
					"<b>b64_inv:</b><br>"+b64_inv+"<br>"+
					"<b>b64_2:</b><br>"+b64_2+"<br>"+
					"<b>utf8_2:</b><br>"+utf8_2+"<br>"+
					"<b>at:</b><br>"+at;
			}
		}
		xmlhttp.open(m,f,false);
		xmlhttp.send();
	}

// ---------------------------------------------
// decode64
// ---------------------------------------------
	var keyStr = "ABCDEFGHIJKLMNOP" +
	             "QRSTUVWXYZabcdef" +
	             "ghijklmnopqrstuv" +
	             "wxyz0123456789+/" +
	             "=";
	
	function decode64(input) {
	     var output = "";
	     var chr1, chr2, chr3 = "";
	     var enc1, enc2, enc3, enc4 = "";
	     var i = 0;
	 
	     // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
	     var base64test = /[^A-Za-z0-9\+\/\=]/g;
	     if (base64test.exec(input)) {
	        alert("There were invalid base64 characters in the input text.\n" +
	              "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
	              "Expect errors in decoding.");
	     }
	     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
	 
	     do {
	        enc1 = keyStr.indexOf(input.charAt(i++));
	        enc2 = keyStr.indexOf(input.charAt(i++));
	        enc3 = keyStr.indexOf(input.charAt(i++));
	        enc4 = keyStr.indexOf(input.charAt(i++));
	 
	        chr1 = (enc1 << 2) | (enc2 >> 4);
	        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
	        chr3 = ((enc3 & 3) << 6) | enc4;
	 
	        output = output + String.fromCharCode(chr1);
	 
	        if (enc3 != 64) {
	           output = output + String.fromCharCode(chr2);
	        }
	        if (enc4 != 64) {
	           output = output + String.fromCharCode(chr3);
	        }
	 
	        chr1 = chr2 = chr3 = "";
	        enc1 = enc2 = enc3 = enc4 = "";
	 
	     } while (i < input.length);
	 
	     return unescape(output);
	  }
// ---------------------------------------------
</script>
</head>
<body>
	<pre>
		ID Video: <input id="id_video" type="text"><input type="button" value="Ejecutar" onclick="at()">
		<div id="res"></div>
	</pre>
</body>
</html>
Ahora, en teoría, hay que pasar los dos script a python y ya está :)

Re: Conector netutv reparado

Publicado: 19 Jun 2014, 12:36
por robalo
La teoría funciona :) al menos en javascript

El html Completo

Código: Seleccionar todo

<html>
<head>
<script type="text/javascript">

// ---------------------------------------------
// at
// ---------------------------------------------
	function at(){

		var id_video = document.getElementById('id_video').value;
		var m = 'GET';
		var f = "http://hqq.tv/player/embed_player.php?vid="+id_video+"&autoplay=no";

		var xmlhttp = new XMLHttpRequest();

		xmlhttp.onreadystatechange
		=function(){
			if (xmlhttp.readyState==4 && xmlhttp.status==200){

				var data = xmlhttp.responseText;

				var match_b64_1 = /base64,(.+?)"/;
				var b64_1 = data.match(match_b64_1)[1];
				var utf8_1 = decode64(b64_1);

				var match_b64_inv = /='(.+?)';/;
				var b64_inv = utf8_1.match(match_b64_inv)[1];

				var start = 0, end = b64_inv.length - 1, arr = new Array(end);
				while (end >= 0)
					arr[start++] = b64_inv.charAt(end--);
				var b64_2 = arr.join('');
				var utf8_2 = decode64(b64_2);

				var match_at = /<input name="at" id="text" value="(.+?)">/;
				var at = utf8_2.match(match_at)[1];

				m3u8(at);

				var b = document.getElementById('b').value;
				var url = document.getElementById('url').value;

				// ver resultados de los pasos
				var res = document.getElementById('res');
				res.innerHTML =
					"<b>b64_1:</b><br>"+b64_1+"<br>"+
					"<b>utf8_1:</b><br>"+utf8_1+"<br>"+
					"<b>b64_inv:</b><br>"+b64_inv+"<br>"+
					"<b>b64_2:</b><br>"+b64_2+"<br>"+
					"<b>utf8_2:</b><br>"+utf8_2+"<br>"+
					"<b>at:</b><br>"+at+"<br>"+
					"<b>b:</b><br>"+b+"<br>"+
					"<b>url:</b><br>"+url+"<br>";
			}
		}
		xmlhttp.open(m,f,false);
		xmlhttp.send();
	}

// ---------------------------------------------
// m3u8
// ---------------------------------------------
	function m3u8(at){

		var id_video = document.getElementById('id_video').value;
		var m = 'GET';
		var f = "http://hqq.tv/player/embed_player.php?vid="+id_video+"&at="+at+"&autoplayed=yes&referer=on&http_referer=http%3A%2F%2Fnetu.tv%2Fwatch_video.php%3Fv%3D"+id_video+"&pass="

		var xmlhttp = new XMLHttpRequest();

		xmlhttp.onreadystatechange
		=function(){
			if (xmlhttp.readyState==4 && xmlhttp.status==200){

				var data = xmlhttp.responseText;

				var match_b = /"#(.+?)"/;
				var b = "#"+data.match(match_b)[1];

				document.getElementById('b').value = b;
				document.getElementById('url').value = tb(b);
			}
		}
		xmlhttp.open(m,f,false);
		xmlhttp.send();
	}

// ---------------------------------------------
// tb
// ---------------------------------------------
	function tb(b){
		if (b.indexOf(".") == -1) {
			b = b.substr(1);
			s2 = "";
			for (j = 0; j < b.length; j += 3) s2 += "%u0" + b.slice(j, j + 3);
			b = unescape(s2)
		}
		return b
	}

// ---------------------------------------------
// decode64
// ---------------------------------------------
	var keyStr = "ABCDEFGHIJKLMNOP" +
	             "QRSTUVWXYZabcdef" +
	             "ghijklmnopqrstuv" +
	             "wxyz0123456789+/" +
	             "=";
	
	function decode64(input) {
	     var output = "";
	     var chr1, chr2, chr3 = "";
	     var enc1, enc2, enc3, enc4 = "";
	     var i = 0;
	 
	     // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
	     var base64test = /[^A-Za-z0-9\+\/\=]/g;
	     if (base64test.exec(input)) {
	        alert("There were invalid base64 characters in the input text.\n" +
	              "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
	              "Expect errors in decoding.");
	     }
	     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
	 
	     do {
	        enc1 = keyStr.indexOf(input.charAt(i++));
	        enc2 = keyStr.indexOf(input.charAt(i++));
	        enc3 = keyStr.indexOf(input.charAt(i++));
	        enc4 = keyStr.indexOf(input.charAt(i++));
	 
	        chr1 = (enc1 << 2) | (enc2 >> 4);
	        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
	        chr3 = ((enc3 & 3) << 6) | enc4;
	 
	        output = output + String.fromCharCode(chr1);
	 
	        if (enc3 != 64) {
	           output = output + String.fromCharCode(chr2);
	        }
	        if (enc4 != 64) {
	           output = output + String.fromCharCode(chr3);
	        }
	 
	        chr1 = chr2 = chr3 = "";
	        enc1 = enc2 = enc3 = enc4 = "";
	 
	     } while (i < input.length);
	 
	     return unescape(output);
	  }
// ---------------------------------------------
</script>
</head>
<body>
	<pre>
		ID Video: <input id="id_video" type="text"><input type="button" value="Ejecutar" onclick="at()">
		<div id="res"></div>
		<input id="b" type="hidden">
		<input id="url" type="hidden">
	</pre>
</body>
</html>
Ahora toca pasarlo a python

Re: Conector netutv reparado

Publicado: 19 Jun 2014, 21:01
por robalo
Ya está listo el conector :)
Ahora si funciona

Re: Conector netutv reparado

Publicado: 22 Jun 2014, 07:04
por tazvader
Gran trabajo Chopchop y Robalo!!
La unión hace al fuerza :)