Es más fácil de entender con un ejemplo. Por ejemplo, quiero descargar el video http://v.youku.com/v_show/id_XNDM2Mjc0MzAw.html. Lo que queremos obtener aquí es la identificación del video, que es la parte XNDM2Mjc0MzAw. Esto es exclusivo de un video, por lo que definitivamente se usará al analizar.
Para ver claramente el proceso de reproducción de los videos de Youku, puede usar el complemento Firebug de Firefox para rastrear la página web, como se muestra a continuación.
Puedes ver que hay muchos GET. Lo que buscamos debería ser el GET con este id como parámetro. A continuación podemos encontrar este enlace.
http://v.youku.com/player/getPlayList/VideoIDS/XNDM2Mjc0MzAw/timezone/+08/version/5/source/video?ran=3545&password=&n=3
Este es el GET de youku para obtener la lista de reproducción y abrir su respuesta. Este es un json. El contenido que necesitamos es semilla, streamfileids y segs. Segs contiene la clave de segmentación del video, streamfileids es una cadena de caracteres confusos y debe decodificarse usando semilla. A continuación, intercepté una parte del descargador para ilustrar el proceso de decodificación. El json-lib-2.4-jdk15 se utiliza para analizar json.
Copie el código de código de la siguiente manera:
Lista<Video> videos = new ArrayList<Video>();
JSONDatos del objeto;
//json es la respuesta recién obtenida, el tipo es String.
datos = JSONObject.fromObject(json).getJSONArray("datos").getJSONObject(0);
doble semilla = Double.valueOf(data.getString("semilla"));
Título de cadena = data.getString("título");
String fileid = data.getJSONObject("streamfileids").getString("flv");//Si desea descargar en formato mp4
String realFileid = getFileID(fileid, seed); //Cambiar flv a mp4 (siempre que este nodo exista)
String fileid1 = realFileid.substring(0, 8);// La identificación decodificada se divide en dos partes y el segmento de video debe insertarse en el medio
Cadena fileid2 = realFileid.substring(10);
JSONArray segs = data.getJSONObject("segs").getJSONArray("flv");//Análisis parcial de segs
for (Iterador iterador = segs.iterator(); iterator.hasNext();) {
Objeto JSONObject = (JSONObject) iterador.next();
orden int = object.getInt("no");
Tamaño de cadena = object.getString("tamaño");
int segundos = object.getInt("segundos");
Clave de cadena = object.getString("k");
Número de cadena = String.format("%1$02x", orden);
Cadena tuUrl = "http://f.youku.com/player/getFlvPath/sid/" + "00_"
+ no + "/st/flv/fileid/" + fileid1 + no + fileid2 + "?K="
+ clave;
videos.add(new Video(orden, segundos, youUrl, tamaño, clave, título));
}
youUrl es la dirección del video que queremos. Por ejemplo, el primer párrafo del video de arriba es:
http://f.youku.com/player/getFlvPath/sid/134434081131213125530_00/st/flv/fileid/030001 090050201D77EDBC04650AC2DD6027D5-ED5F-27F6-8E73-DEF478121887&K=b499f3d5df944cfc2827e2ec
Los azules se generan aleatoriamente y se pueden reemplazar por 00.
flv indica el formato de vídeo a descargar, también puedes elegir mp4, si está disponible.
Los dos 00 amarillos son códigos de segmento, hexadecimal, por ejemplo, el primer segmento es 00, el segundo segmento es 01 y el decimoquinto segmento es 0f.
El siguiente es el ID de archivo, que debe descifrarse a través de los archivos semilla y streamfile. Es el mismo para todos los videos.
La última K se obtiene en segundos, no es necesario crackear, cada vídeo es diferente.
Las dos funciones de decodificación son:
Copie el código de código de la siguiente manera:
cadena privada getFileID (ID de archivo de cadena, doble semilla) {
Cadena mixta = getFileIDMixString(semilla);
Cadena[] ids = fileid.split("//*");
StringBuilder realId = nuevo StringBuilder();
int idx;
para (int i = 0; i < ids.length; i++) {
idx = Integer.parseInt(ids[i]);
realId.append(mixed.charAt(idx));
}
devolver realId.toString();
}
cadena privada getFileIDMixString (doble semilla) {
StringBuilder mixto = nuevo StringBuilder();
Fuente StringBuilder = nuevo StringBuilder (
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ///:._-1234567890");
índice int, len = fuente.longitud();
para (int i = 0; i < len; ++i) {
semilla = (semilla * 211 + 30031) % 65536;
índice = (int) Math.floor(seed / 65536 * source.length());
mixto.append(source.charAt(index));
fuente.deleteCharAt(índice);
}
devolver mixto.toString();
}
El código finalmente obtendrá una Lista de tipos de videos. El orden en Video es el número del video, los segundos son la duración del tiempo, el tamaño es la longitud del byte, su URL es la dirección real del video y el título del video. Hay algunos otros contenidos que se pueden obtener de json.