2010-12-16 83 views
20

Vi que hoy el vimeo cambió la forma en que están transmitiendo los videos y ya no puedo transmitir sus videos. Vi que cuando genero el enlace al video, que era, por ejemplo:¿Cómo puedo encontrar enlaces de descarga para videos vimeo?

http://vimeo.com/moogaloop/play/clip:6649390/1eab2a25f30f1aadaf5e306d0f40fd6c/1292498602/?q=hd 

Me está redirigiendo a un dicho página "Permiso denegado". Intenté usar curl, pero sin éxito. Olí el tráfico y vi que se streaming desde algo como:

http://av.vimeo.com/02047/623/34209065.mp4?token=1292496582_34de09a6d13212cf26af08357d311c30 

¿Alguien sabe cómo obtener la URL de trabajo para el archivo de vídeo?

La forma en que estoy recibiendo los videos en este momento es:

  1. Elige enlace http://vimeo.com/video_id.
  2. Obtenga solo video_id.
  3. Obtenga el XML para el video http://vimeo.com/moogaloop/load/clip:video_id;.
  4. analizar el XML y encontrar la información necesaria:

    • request_signature
    • request_signature_expires
    • ISHD
  5. generar 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 lo hace.

+0

enlaces de moogalooop no funciona ahora. – Asghar

+0

Este método no es oficialmente compatible con Vimeo y puede romperse en cualquier momento sin previo aviso. La única forma oficialmente admitida para acceder mediante programación a archivos de video es a través de [API] (https://developer.vimeo.com/api) – Dashron

Respuesta

8

Después de pasar unas horas buscando 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 vídeo:

  1. elegir enlace http://vimeo.com/video_id
  2. reciben sólo el video_id
  3. obtener el código XML para el video http://vimeo.com/moogaloop/load/clip:video_id;
  4. analizar el XML y me encuentro con la información necesaria Necesito:

    • request_signature
    • request_signature_expires
    • isHD
  5. Entonces generar el enlace:

    $video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality.""; 
    
  6. Entonces, si usted es dev php, se llama a comando wget a través ejecutivo de esta manera

    exec("wget -b '$video_link' -a 'wget.log' -O -");

  7. Luego de leer el registro y encontrar el enlace que está buscando. Simplemente puede analizar el archivo de registro. El enlace directo es entre "Ubicación:" y "[siguiente]"

  8. que devuelva el enlace directo y limpiar el archivo de registro :)

NOTA: tenga en cuenta una vez más que esto no se trabaja para siempre Tarde o temprano bloquearán tu ip :).

+0

el enlace: $ video_link = "http://vimeo.com/moogaloop/play/clip : ". $ video_id."/". $ request_signature."/". $ request_signature_expires." /? q = ". $ quality." "no se puede usar ahora – xtr

+1

enlaces moogaloop no funciona ahora. – Asghar

+1

Ahora puede usar 'http://vimeo.com/api/v2/video/ {video_id} .xml' para obtener la información básica, pero ** no * contiene * request_signature * o * request_signature_expires * – Hunger

1

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; 
    } 
+0

enlaces moogaloop no funciona ahora. – Asghar

3

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>"; 

source

0

Un enfoque rápido y sucio sería: página

$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); 
    } 
} 
0

El algoritmo tiene el siguiente aspecto: los datos

  • de entrada: vimeoUrl.
  • content = getRemoteContent (vimeoUrl).
  • Analizar 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')));
  • Devolver $ video-> solicitud-> archivos-> h264-> sd-> url - esto devolverá un enlace directo para video de calidad SD.

Aquí es mi clase simple, que trabaja 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; 
    } 

} 

Usando:

$video = new VideoController; 
var_dump($video->getVimeoDirectUrl('http://vimeo.com/90747156')); 
3

Advertencia Los métodos descritos anteriormente no son admitidos por 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 archivos de video es a través del API.

Si intenta acceder a las URL de los videos que posee, debe tener una cuenta PRO.

Si está intentando acceder a las URL de los videos que no le pertenecen, debe embed the video o open it with the Vimeo iOS app.

1

No es necesario ningún script, menos aún PHP.

Quería descargar video protegido (incrustado en un sitio web específico), que incluso en vimeo.com no se puede reproducir debido a "Configuraciones de privacidad".

Herramientas para desarrolladores Simplemente fuego-up (Opera Dragonfly, herramientas para desarrolladores de Chrome, lo que sea), seleccionar Red y ahí lo tienes:

http://pdl.vimeocdn.com/23062/181/302074466.mp4?token2=1424299768_bbeb6039c037cd429cd560d668ec851e&aksessionid=1f4d289cd1a3abe1
Método: Obtener texto
Estado: 206 Contenido parcial
Tipo: video/mp4

Simplemente copie esa primera URL y descárguela con alguna herramienta (utilicé "wget").
Guardado.

+0

Es posible que deba presionar "Reproducir" después de abrir el panel de red en Herramientas del desarrollador. – Akom

0

Las respuestas para esto en superusuario estaban fuera de fecha, así que pensé que iba a publicar aquí (no hay suficiente reputación para colocar allí)

Así que acaba de grabar peticiones XHR con devtools Chrome y la primera solicitud era para el el archivo json que contiene el enlace al video alojado de akamai CDN junto con el token 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 de 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 entonces sólo buscó el objeto más alta calidad en el JSON (1080p) y descarga el 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 sustituí para mayor privacidad.

Cuestiones relacionadas