php - programas - video cyborg
¿Cómo puedo encontrar enlaces de descarga para videos de vimeo? (9)
Después de pasar unas horas para descubrir cómo puedo obtener el enlace directo a vimeo, encontré una buena solución. Así que aquí están los pasos para los usuarios que desean descargar y transmitir video src directamente desde vimeo. Tenga en cuenta que bloquean todas las direcciones IP y, probablemente, los hosts que están descargando los videos de esta manera, así que simplemente dejé de usar sus servicios y nunca los volveré a usar :).
Pasos para obtener las fuentes de video:
- elegir enlace
http://vimeo.com/video_id
- obtener solo el
video_id
- obtener el xml para el video
http://vimeo.com/moogaloop/load/clip:video_id;
analizar el xml y encontrar la información necesaria que necesito:
-
request_signature
-
request_signature_expires
-
isHD
-
Entonces genero el enlace:
$video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality."";
Entonces, si usted es php dev, llame comando wget a través de exec de esta manera
exec("wget -b ''$video_link'' -a ''wget.log'' -O -");
Luego, lee el registro y descubre el enlace que está buscando. Simplemente puede analizar el archivo de registro. El enlace directo está entre "Ubicación:" y "[siguiente]"
Usted devuelve el enlace directo y limpia el archivo de registro :)
NOTA: tenga en cuenta una vez más que esto no funcionará para siempre. Tarde o temprano bloquearán tu ip :).
Vi que hoy el vimeo cambió la forma en que transmiten los videos y ya no puedo transmitir sus videos. Lo vi cuando genero el enlace al video, que fue por ejemplo:
http://vimeo.com/moogaloop/play/clip:6649390/1eab2a25f30f1aadaf5e306d0f40fd6c/1292498602/?q=hd
Me está redirigiendo a una página que dice "Permiso denegado". Intenté usar curl, pero sin éxito. Olfateé el tráfico y vi que se transmitía de algo así como:
http://av.vimeo.com/02047/623/34209065.mp4?token=1292496582_34de09a6d13212cf26af08357d311c30
¿Alguien sabe cómo obtener la URL que funciona para el archivo de video?
La forma en que estoy recibiendo los videos en este momento es:
- Elija el enlace
http://vimeo.com/video_id
. - Obtenga solo el
video_id
. - Obtenga el XML para el video
http://vimeo.com/moogaloop/load/clip:video_id;
. analizar el XML y encontrar la información necesaria:
- request_signature
- request_signature_expires
- isHD
Genera el enlace:
$video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality."";
Si hago esto manualmente a través del navegador, funciona, pero si lo hago a través del script, no funciona.
El algoritmo se ve así:
- Datos de entrada: vimeoUrl.
- content = getRemoteContent (vimeoUrl).
- Analice el contenido para buscar y extraer el valor del atributo data-config-url.
- Navegue a data-config-url y cargue el contenido como objeto JSON: $ video = json_decode ($ this-> getRemoteContent ($ video-> getAttribute (''data-config-url'')));
- Devuelve $ video-> solicitud-> archivos-> h264-> sd-> url - esto devolverá un enlace directo para video de calidad SD.
Aquí está mi clase simple, que funciona para este momento:
class VideoController
{
/**
* @var array Vimeo video quality priority
*/
public $vimeoQualityPrioritet = array(''sd'', ''hd'', ''mobile'');
/**
* @var string Vimeo video codec priority
*/
public $vimeoVideoCodec = ''h264'';
/**
* Get direct URL to Vimeo video file
*
* @param string $url to video on Vimeo
* @return string file URL
*/
public function getVimeoDirectUrl($url)
{
$result = '''';
$videoInfo = $this->getVimeoVideoInfo($url);
if ($videoInfo && $videoObject = $this->getVimeoQualityVideo($videoInfo->request->files))
{
$result = $videoObject->url;
}
return $result;
}
/**
* Get Vimeo video info
*
* @param string $url to video on Vimeo
* @return /stdClass|null result
*/
public function getVimeoVideoInfo($url)
{
$videoInfo = null;
$page = $this->getRemoteContent($url);
$dom = new /DOMDocument("1.0", "utf-8");
libxml_use_internal_errors(true);
$dom->loadHTML(''<?xml version="1.0" encoding="UTF-8"?>'' . "/n" . $page);
$xPath = new /DOMXpath($dom);
$video = $xPath->query(''//div[@data-config-url]'');
if ($video)
{
$videoObj = json_decode($this->getRemoteContent($video->item(0)->getAttribute(''data-config-url'')));
if (!property_exists($videoObj, ''message''))
{
$videoInfo = $videoObj;
}
}
return $videoInfo;
}
/**
* Get vimeo video object
*
* @param stdClass $files object of Vimeo files
* @return stdClass Video file object
*/
public function getVimeoQualityVideo($files)
{
$video = null;
if (!property_exists($files, $this->vimeoVideoCodec) && count($files->codecs))
{
$this->vimeoVideoCodec = array_shift($files->codecs);
}
$codecFiles = $files->{$this->vimeoVideoCodec};
foreach ($this->vimeoQualityPrioritet as $quality)
{
if (property_exists($codecFiles, $quality))
{
$video = $codecFiles->{$quality};
break;
}
}
if (!$video)
{
foreach (get_object_vars($codecFiles) as $file)
{
$video = $file;
break;
}
}
return $video;
}
/**
* Get remote content by URL
*
* @param string $url remote page URL
* @return string result content
*/
public function getRemoteContent($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_USERAGENT, ''spider'');
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
}
Utilizando:
$video = new VideoController;
var_dump($video->getVimeoDirectUrl(''http://vimeo.com/90747156''));
Este javascript funciona para mí.
var player = document.getElementsByClassName("player")[0].getAttribute("id");
player = eval(player.replace("player_", "clip"));
var time = player.config.request.timestamp;
var sig = player.config.request.signature;
var clip_id = window.location.href.substring(17);
var url = "http://player.vimeo.com/play_redirect" +
"?clip_id=" + clip_id +
"&sig=" + sig +
"&time=" + time;
var v = document.getElementById("menu");
v.style.fontSize = "4em";
v.style.lineHeight = "1em";
v.innerHTML =
"<a href=''" + url + "''>SD</a>, " +
"<a href=''" + url + "&quality=hd''>HD</a>";
FYI, el ejemplo anterior no funcionará, pero está cerca. Debe enviar cookies falsas. Así que, básicamente, cuando visita la página con el XML, necesita tomar las cookies y luego enviar esas cookies que recibió previamente mientras visitaba la url final del video. Así que aquí está cómo lo haces en PHP (usando Yii) con curl:
public function actionVimeo($video_id)
{
$xml_url = "http://vimeo.com/moogaloop/load/clip:$video_id";
$ch = curl_init($xml_url);
$cookieFile = Yii::app()->basePath . ''/runtime/vimeocookie''. time().''.txt''; //replace this line with code to generate a writeable path in your application
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); //the cookie file will be populated with cookies received while viewing the xml page
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER[''HTTP_USER_AGENT'']); //you need to send a user agent here and it must be the same below when you visit the video url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
$xml = simplexml_load_string($output);
$request_signature = $xml->request_signature;
$request_signature_expires = $xml->request_signature_expires;
$vid_url = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=sd";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$vid_url);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER[''HTTP_USER_AGENT'']); //same user agent as on previous vimeo page you visited
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); //the cookies in that cookie file will be used while visiting the video URL
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); //vimeo changes the header location, so you gotta follow it
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$video = curl_exec($ch);
curl_close($ch);
unlink($cookieFile); //remove the temporary cookie file
$savePath = Yii::app()->basePath . ''/runtime/testvim.mp4''; //change this to a path your application can write the final video to
file_put_contents($savePath, $video);
exit;
}
La página de Vimeo es un poco lenta desde mi punto de vista, pero prueba este truco para descargar videos de cualquier sitio. http://www.youtube.com/watch?v=tWxY1JpdpNk
Las respuestas para esto en SuperUser no estaban actualizadas, así que pensé que lo publicaría aquí (no hay suficiente reputación para publicar allí)
Así que solo grabé las solicitudes de XHR con devtools de Chrome y la primera solicitud fue para el archivo json que contiene el enlace al video alojado de akamai CDN junto con el token que proporciona akamai. Esta ficha es importante. Es el hash que incluye una marca de tiempo, por lo que los enlaces de los videos aquí deberán descargarse rápidamente o se rechazarán las solicitudes.
El formato para este archivo JSON estaba en la forma:
https://player.vimeo.com/video/VIDEO_ID/config?byline=0&collections=1&context=Vimeo%5CController%5CClipController.main&default_to_hd=1&outro=nothing&portrait=0&share=1&title=0&watch_trailer=0&s=6cffff97fffffffffff4ffffffff679ec66ffff_14ffffffff
Y luego busqué el objeto de más alta calidad en el JSON (1080p) y descargué ese archivo. En el formato:
https://fpdl.vimeocdn.com/vimeo-prod-skyfire-std-us/01/XXXXX/8/XXXX/XXXXXXXX.mp4?token=XXXXXXX-0xXXXXXXXXXXXXX
Tenga en cuenta que las X son números que reemplacé por privacidad.
No hay necesidad de ningún script, menos PHP.
Quería descargar video protegido (incrustado en un sitio web específico), que incluso en vimeo.com no se puede reproducir debido a "Configuración de privacidad".
Simplemente arranque las herramientas de desarrollo (Opera Dragonfly, herramientas de desarrollo de Chrome, lo que sea), elija la red y listo:
http://pdl.vimeocdn.com/23062/181/302074466.mp4?token2=1424299768_bbeb6039c037cd429cd560d668ec851e&aksessionid=1f4d289cd1a3abe1
Método: obtener
Texto de estado: 206 Contenido parcial
Tipo: video / mp4
Simplemente copie esa primera URL y descárguela con alguna herramienta (utilicé "wget").
Salvado.
Un enfoque rápido y sucio sería:
$base = ''http://player.vimeo.com/play_redirect'';
$curl = curl_init(sprintf(''http://player.vimeo.com/video/%s'', $_GET[''id'']));
curl_setopt_array($curl, array(
CURLOPT_USERAGENT => $_SERVER[''HTTP_USER_AGENT''],
CURLOPT_RETURNTRANSFER => true
));
preg_match(''/g:(/{.*?/}),a/s'', curl_exec($curl), $match);
curl_close($curl);
$json = json_decode($match[1])->request;
$url = sprintf(''%s?quality=sd&clip_id=%s&time=%d&sig=%s'',
$base,
$_GET[''id''],
$json->timestamp,
$json->signature
);
$curl = curl_init($url);
curl_setopt_array($curl, array(
CURLOPT_HEADER => true,
CURLOPT_NOBODY => true,
CURLOPT_USERAGENT => $_SERVER[''HTTP_USER_AGENT''],
CURLOPT_RETURNTRANSFER => true
));
$headers = explode("/r/n", curl_exec($curl));
curl_close($curl);
foreach ($headers as $header) {
if ($header) {
header($header);
}
}
Advertencia Los métodos descritos anteriormente no son compatibles con Vimeo. No hay garantía de que funcionen en este momento, o continuarán trabajando en el futuro. Pueden (y probablemente lo harán) romperse en cualquier momento, sin previo aviso.
El único método oficialmente admitido para acceder a las URL de los archivos de video es a través de la API .
Si intenta acceder a las URL de los videos que posee, debe tener una cuenta PRO.
Si intenta acceder a las URL de videos que no le pertenecen, debe incrustar el video o abrirlo con la aplicación iOS de Vimeo .