Página 1 de 6

Obtener la URL de un vídeo embebido

Publicado: 24 May 2016, 18:04
por tormund
Hola, estoy desarrollando una app para Android para ver los vídeos de la web Pordede. Para ello conecto con la web donde está alojado el vídeo, obtengo la url del vídeo y lo reproduzco por streaming. Lo he hecho sin problemas con Steamcloud y Streaminto (la url esta en la mismo HTML) pero no tengo ni idea de como hacerlo cuando la web tiene el vídeo embebido en Flash.

Como soy un usuario habitual de pelisalacarta he intentado comprender cómo lo hacéis leyendo los ficheros .py pero mis conocimientos de python son muy limitados. ¿Podriais orientarme en el proceso de obtener las URLs de sitios como Powvideo?

Llevo mucho tiempo intentandolo, os agradecería alguna pista para intentar hacerlo en Java.

Saludos.

Re: Obtener la URL de un vídeo embebido

Publicado: 24 May 2016, 22:27
por robalo
Hola tormund

Para extraer las urls de los empaquetados JS de powvideo no creo que tengas problemas. El agoritmo se puede hacer para cualquier lenguaje con más o menos dificultad.

Los empaquetados JS de powvideo sulen ser algo como lo siguiente

Código: Seleccionar todo

<script>eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1m=B;F=B;2 d(1l){5(1m)2C.2B(1l)};2 1j(1k,L){$("<2A>",{l:\'2z\',\'k\':1k,2y:\'2x:2w\'}).2v(\'1f\',2(){5(1a L==\'2\')L();$(2u.2t())}).2s(\'2r\')};2 11(l){1j(\'j://2q.2p.2o/1i/1i.2n?l=\'+l)};2 1h(q){2m(g i=0;i<7.1c;i++){5(7[i].f==q.f)e i}};2 1g(q){e 7[1h(q)+1]};2 I(){g K=1g(4().8());5(K){4().2l();4().1f([K])}};2 W(1d){5(J&&J.1e){J.1e(1d,\'*\')}};2 x(3){d(3);m(\'2k\',3?3.2j+\' \'+V():\'\');5(7.1c>1){I()}};2 y(3){5(3.2i==Z&&3.Y==0&&4().2h()==-1){d(\'1b!\',3);17(\'2g\');m(\'1b\');I()}};2 t(){5(4().15()==0)m(\'2f\')};2 r(){m(\'2e\')};2 m(18,H){5(1a 19==\'2\')19(\'2d\',\'2c\',18,E(),p()+(H?\' \'+H:\'\'))};2 17(G){$.2b(\'/2a\',{29:\'28\',G:G,l:E(),c:p()})};2 w(3){d(3);5(3.O[0].f!=7[0].f){d(\'27, 26!\');14(2(){4().16()},10)}};2 u(){d(\'25 16\');5(4().15()==0){g c=p();5(c&&c.24(\'23\')!=0){14(2(){11(c)},22)}}};2 s(3){5(!F&&3.X>Z&&3.Y/3.X>0.9){F=N;W(\'21% 1Z\');d(3)}};2 E(){e 4().8()?4().8().o:\'\'};2 p(){e 4().8()?(4().8().c?4().8().c:\'\'):\'\'};2 V(){e 4().8()?4().8().f:\'\'};g b=\'j://1Y.A.z/1X/1W/U/T/n.1V\';g C={1U:\'\',1T:0,1S:\'1R\',1Q:\'1P\',1O:\'1N\',1M:\'20\'};g a=[];7=[{b:b,a:a,k:\'M://S.R.Q.13:1L/1K/P:U/T/1J?h=D\',o:\'n\'},{b:b,a:a,k:\'j://A.z/D.1I\',o:\'n\'},{b:b,a:a,k:\'j://S.R.Q.13:1H/D/v.P\',o:\'n\'}];7=1G.1F(7,2(v){v[\'f\']=v[\'k\'];e v});4("1E").1D({1C:1B,1A:1z,O:[7[0]],1y:"1x",1w:"1v",1u:"N",M:{1t:10},C:C,1s:{1r:B},1q:\'1p 1o 6.12.1\',1n:\'j://A.z\'}).y(y).x(x).w(w).u(u).t(t).s(s).r(r);',62,163,'||function|ev|jwplayer|if||sources|getPlaylistItem||tracks|image|mediaid|llog|return|file|var|||http|src|id|sendGa|zklsemqu0dad|description|getMediaId|item|onComplete|onTime|onPlay|onBeforePlay||onPlaylist|onError|onBufferChange|net|powvideo|false|captions|laohpnlomuikkfn2mdk7ylquhbbmy7nqd2sndqqdidsd6yrfnmvlwcdjja|getDesc|allView|action|extra|loadNext|top|next|callback|rtmp|true|playlist|mp4|233|31|176|00207|01|getPlayFile|sendMsgToTop|duration|position|100||logVisit|||setTimeout|getPosition|play|sendStatus|category|ga|typeof|Stuck|length|msg|postMessage|load|getNextSource|getSourceIndex|player|visit|url|str|debug|aboutlink|Player|Powvideo|abouttext|enabled|analytics|bufferlength|androidhls|flash|primary|start|startparam|562|height|954|width|setup|vplayer|map|jQuery|8777|m3u8|zklsemqu0dad_n|vod|19350|fontsize|Arial|fontfamily|dacf84|color|uniform|edgeStyle|backgroundOpacity|backgroundColor|jpg|37|scap|img|complete||90|30000|cG8t|indexOf|before|go|fallback|videostatus|op|stats|post|event|send|Complete|Play|check|getDuration|bufferPercent|message|Error|stop|for|php|tv|hdfull|em|body|appendTo|remove|this|on|none|display|style|ifr|iframe|log|console'.split('|')))</script>
Lo anterior se compone de 5 partes:
p = patrón/plantilla que se reemplazará con los datos de k
a = base x
c = longitud de la lista de reemplazos
k = lista de reemplazos
e = función

El mismo código anterior escrito de una forma más clara, también en JS

Código: Seleccionar todo

var p = '1m=B;F=B;2 d(1l){5(1m)2C.2B(1l)};2 1j(1k,L){$("<2A>",{l:\'2z\',\'k\':1k,2y:\'2x:2w\'}).2v(\'1f\',2(){5(1a L==\'2\')L();$(2u.2t())}).2s(\'2r\')};2 11(l){1j(\'j://2q.2p.2o/1i/1i.2n?l=\'+l)};2 1h(q){2m(g i=0;i<7.1c;i++){5(7[i].f==q.f)e i}};2 1g(q){e 7[1h(q)+1]};2 I(){g K=1g(4().8());5(K){4().2l();4().1f([K])}};2 W(1d){5(J&&J.1e){J.1e(1d,\'*\')}};2 x(3){d(3);m(\'2k\',3?3.2j+\' \'+V():\'\');5(7.1c>1){I()}};2 y(3){5(3.2i==Z&&3.Y==0&&4().2h()==-1){d(\'1b!\',3);17(\'2g\');m(\'1b\');I()}};2 t(){5(4().15()==0)m(\'2f\')};2 r(){m(\'2e\')};2 m(18,H){5(1a 19==\'2\')19(\'2d\',\'2c\',18,E(),p()+(H?\' \'+H:\'\'))};2 17(G){$.2b(\'/2a\',{29:\'28\',G:G,l:E(),c:p()})};2 w(3){d(3);5(3.O[0].f!=7[0].f){d(\'27, 26!\');14(2(){4().16()},10)}};2 u(){d(\'25 16\');5(4().15()==0){g c=p();5(c&&c.24(\'23\')!=0){14(2(){11(c)},22)}}};2 s(3){5(!F&&3.X>Z&&3.Y/3.X>0.9){F=N;W(\'21% 1Z\');d(3)}};2 E(){e 4().8()?4().8().o:\'\'};2 p(){e 4().8()?(4().8().c?4().8().c:\'\'):\'\'};2 V(){e 4().8()?4().8().f:\'\'};g b=\'j://1Y.A.z/1X/1W/U/T/n.1V\';g C={1U:\'\',1T:0,1S:\'1R\',1Q:\'1P\',1O:\'1N\',1M:\'20\'};g a=[];7=[{b:b,a:a,k:\'M://S.R.Q.13:1L/1K/P:U/T/1J?h=D\',o:\'n\'},{b:b,a:a,k:\'j://A.z/D.1I\',o:\'n\'},{b:b,a:a,k:\'j://S.R.Q.13:1H/D/v.P\',o:\'n\'}];7=1G.1F(7,2(v){v[\'f\']=v[\'k\'];e v});4("1E").1D({1C:1B,1A:1z,O:[7[0]],1y:"1x",1w:"1v",1u:"N",M:{1t:10},C:C,1s:{1r:B},1q:\'1p 1o 6.12.1\',1n:\'j://A.z\'}).y(y).x(x).w(w).u(u).t(t).s(s).r(r);';
var a = 62;
var c = 162;
var k = '||function|ev|jwplayer|if||sources|getPlaylistItem||tracks|image|mediaid|llog|return|file|var|||http|src|id|sendGa|zklsemqu0dad|description|getMediaId|item|onComplete|onTime|onPlay|onBeforePlay||onPlaylist|onError|onBufferChange|net|powvideo|false|captions|laohpnlomuikkfn2mdk7ylquhbbmy7nqd2sndqqdidsd6yrfnmvlwcdjja|getDesc|allView|action|extra|loadNext|top|next|callback|rtmp|true|playlist|mp4|233|31|176|00207|01|getPlayFile|sendMsgToTop|duration|position|100||logVisit|||setTimeout|getPosition|play|sendStatus|category|ga|typeof|Stuck|length|msg|postMessage|load|getNextSource|getSourceIndex|player|visit|url|str|debug|aboutlink|Player|Powvideo|abouttext|enabled|analytics|bufferlength|androidhls|flash|primary|start|startparam|562|height|954|width|setup|vplayer|map|jQuery|8777|m3u8|zklsemqu0dad_n|vod|19350|fontsize|Arial|fontfamily|dacf84|color|uniform|edgeStyle|backgroundOpacity|backgroundColor|jpg|37|scap|img|complete||90|30000|cG8t|indexOf|before|go|fallback|videostatus|op|stats|post|event|send|Complete|Play|check|getDuration|bufferPercent|message|Error|stop|for|php|tv|hdfull|em|body|appendTo|remove|this|on|none|display|style|ifr|iframe|log|console'.split('|');
var e = function(c){
	return( c < a ? '': e( parseInt(c/a) ) ) + ( (c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36) )
};
while(c--)
	if(k[c])
		p = p.replace( new RegExp('\\b' + e(c) + '\\b','g'), k[c]);
Si ejecutamos eso en JS en la variable p tendríamos el código desempaquetado

Código: Seleccionar todo

debug=false;allView=false;function llog(str){if(debug)console.log(str)};function visit(url,callback){$("<iframe>",{id:'ifr','src':url,style:'display:none'}).on('load',function(){if(typeof callback=='function')callback();$(this.remove())}).appendTo('body')};function logVisit(id){visit('http://em.hdfull.tv/player/player.php?id='+id)};function getSourceIndex(item){for(var i=0;i<sources.length;i++){if(sources[i].file==item.file)return i}};function getNextSource(item){return sources[getSourceIndex(item)+1]};function loadNext(){var next=getNextSource(jwplayer().getPlaylistItem());if(next){jwplayer().stop();jwplayer().load([next])}};function sendMsgToTop(msg){if(top&&top.postMessage){top.postMessage(msg,'*')}};function onError(ev){llog(ev);sendGa('Error',ev?ev.message+' '+getPlayFile():'');if(sources.length>1){loadNext()}};function onBufferChange(ev){if(ev.bufferPercent==100&&ev.position==0&&jwplayer().getDuration()==-1){llog('Stuck!',ev);sendStatus('check');sendGa('Stuck');loadNext()}};function onPlay(){if(jwplayer().getPosition()==0)sendGa('Play')};function onComplete(){sendGa('Complete')};function sendGa(category,extra){if(typeof ga=='function')ga('send','event',category,getDesc(),getMediaId()+(extra?' '+extra:''))};function sendStatus(action){$.post('/stats',{op:'videostatus',action:action,id:getDesc(),mediaid:getMediaId()})};function onPlaylist(ev){llog(ev);if(ev.playlist[0].file!=sources[0].file){llog('fallback, go!');setTimeout(function(){jwplayer().play()},10)}};function onBeforePlay(){llog('before play');if(jwplayer().getPosition()==0){var mediaid=getMediaId();if(mediaid&&mediaid.indexOf('cG8t')!=0){setTimeout(function(){logVisit(mediaid)},30000)}}};function onTime(ev){if(!allView&&ev.duration>100&&ev.position/ev.duration>0.9){allView=true;sendMsgToTop('90% complete');llog(ev)}};function getDesc(){return jwplayer().getPlaylistItem()?jwplayer().getPlaylistItem().description:''};function getMediaId(){return jwplayer().getPlaylistItem()?(jwplayer().getPlaylistItem().mediaid?jwplayer().getPlaylistItem().mediaid:''):''};function getPlayFile(){return jwplayer().getPlaylistItem()?jwplayer().getPlaylistItem().file:''};var image='http://img.powvideo.net/scap/37/01/00207/zklsemqu0dad.jpg';var captions={backgroundColor:'',backgroundOpacity:0,edgeStyle:'uniform',color:'dacf84',fontfamily:'Arial',fontsize:'20'};var tracks=[];sources=[{image:image,tracks:tracks,src:'rtmp://176.31.233.13:19350/vod/mp4:01/00207/zklsemqu0dad_n?h=laohpnlomuikkfn2mdk7ylquhbbmy7nqd2sndqqdidsd6yrfnmvlwcdjja',description:'zklsemqu0dad'},{image:image,tracks:tracks,src:'http://powvideo.net/laohpnlomuikkfn2mdk7ylquhbbmy7nqd2sndqqdidsd6yrfnmvlwcdjja.m3u8',description:'zklsemqu0dad'},{image:image,tracks:tracks,src:'http://176.31.233.13:8777/laohpnlomuikkfn2mdk7ylquhbbmy7nqd2sndqqdidsd6yrfnmvlwcdjja/v.mp4',description:'zklsemqu0dad'}];sources=jQuery.map(sources,function(v){v['file']=v['src'];return v});jwplayer("vplayer").setup({width:954,height:562,playlist:[sources[0]],startparam:"start",primary:"flash",androidhls:"true",rtmp:{bufferlength:10},captions:captions,analytics:{enabled:false},abouttext:'Powvideo Player 6.12.1',aboutlink:'http://powvideo.net'}).onBufferChange(onBufferChange).onError(onError).onPlaylist(onPlaylist).onBeforePlay(onBeforePlay).onPlay(onPlay).onTime(onTime).onComplete(onComplete);

Re: Obtener la URL de un vídeo embebido

Publicado: 25 May 2016, 07:21
por tormund
Por lo que he entendido se trata de sustituir el contenido de p con el de k aplicando la función e. Voy a estudiarlo tranquilamente, espero ser capaz de llevarlo a cabo.

Muchisimas gracias por tu ayuda.

Re: Obtener la URL de un vídeo embebido

Publicado: 25 May 2016, 10:24
por robalo
Exacto :)

Re: Obtener la URL de un vídeo embebido

Publicado: 26 May 2016, 19:06
por jesus
En Android siempre puedes pasar el javascript por un webview, que lleva su propio intérprete :)

Re: Obtener la URL de un vídeo embebido

Publicado: 26 May 2016, 21:30
por robalo
Anda la leshe!! :) Y para Java pelao también?
El code en Java para el jsunpacker no es para nada largo y bastante fácil de emular pero hay algunos chorizos que enredan mucho y si resuelve rápido pues no te digo nada :), es muy interesante.

Ya tengo entretenimiento para el el primer café de mañana, a ver que encuentro. Gracias jesus por la info :)

Re: Obtener la URL de un vídeo embebido

Publicado: 26 May 2016, 21:50
por jesus
En java existe un intérprete de Javascript (Rhino), pero fallará si el código tiene dependencias con el DOM de la página. Cuando el código hable del "document.location" y cosas así.

Pero en Android puedes coger la URL, pasársela a un webview que viene a ser un navegador embebido, y luego acceder a lo que resulta después de evaluar la página. Infalible contra los ofuscadores de javascript :)

Re: Obtener la URL de un vídeo embebido

Publicado: 27 May 2016, 13:53
por robalo
Al final he podido buscar info y probar a retales el tema de JS.

La solución que encajado y que probado sólamnete con powvideo ha sido

Código: Seleccionar todo

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class unPack {

	String unPacked;

	unPack(String packed) {

		ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");

		try {
			engine.eval("var res = " + packed + ";");
		} catch (ScriptException e) {
			e.printStackTrace();
		}

		unPacked = (String) engine.get("res");;

	}
}
Me falta probarlo AADecode y algunos más que vea por ahí

Re: Obtener la URL de un vídeo embebido

Publicado: 29 May 2016, 11:11
por tormund
Con ese simple código de java puedo obtener el código javascript que contiene la URL???? :shock:

No he entendido a que te refieres con que te falta probarlo AADecode.

Muchas gracias por todo, sois unos cracks.

Re: Obtener la URL de un vídeo embebido

Publicado: 29 May 2016, 11:29
por tormund
Jesús, la idea seria tener un webview oculto, pasarle el HTML que parseo de powvideo, evaluarlo con el webview y obtener el código javascript sin ofuscar del html resultante?

Supongo que la idea de robalo es una alternativa al webview, probaré ambas y os cuento como ha ido.