2012-07-08 109 views
8

我想还有Vimeo与PHP脚本直接链接到视频。 我设法找到他们手动,但我的PHP脚本不起作用。 这里是举措: 比如我把这个视频:http://vimeo.com/22439234获得来自Vimeo的直接链接的视频在PHP

当你走在页面上,Vimeo的产生与目前的时间戳和这部影片相关联的签名。该信息被存储在一个JavaScript变量,周围线520刚过: window.addEvent ('domready', function() {

然后当你点击播放,HTML5播放器读取该变量,并发送一个HTTP请求:

http:// player.vimeo.com/play_redirect?clip_id=37111719&sig={SIGNATURE}&time={TIMESTAMP}&quality=sd&codecs=H264,VP8,VP6&type=moogaloop_local&embed_location= 

但它也适用搭配:

http:// player.vimeo.com/play_redirect?clip_id=37111719&sig={SIGNATURE}&time={TIMESTAMP}&quality=sd 

如果此URL不与开http://vimeo.com/22439234 IP地址打开,将返回一个错误消息的HTTP代码200。

如果此URL被打开了正确的IP地址,标题“位置”重定向到链接到视频文件: http://av.vimeo.com/XXX/XX/XXXX.mp4?aksessionid=XXXX&token=XXXXX_XXXXXXXXX

当我建立这个链接http://player.vimeo.com/play_redirect?...手动(“右键”>“源代码“>”line 520“)它的工作原理。

但是使用PHP和正则表达式,它会返回带有错误消息的HTTP code 200

为什么?

从我的观察,Vimeo的不检查HTTP请求的标头http:// player.vimeo.com/play_redirect?... GETHEAD,有饼干,没有cookies,引用等等......不会改变。

使用PHP,我使用功能file_get_contents()get_headers()

<?php 
    function getVimeo($id) { 

    $content = file_get_contents('http://vimeo.com/'.$id); 

    if (preg_match('#document\.getElementById\(\'player_(.+)\n#i', $content, $scriptBlock) == 0) 
     return 1; 

    preg_match('#"timestamp":([0-9]+)#i', $scriptBlock[1], $matches); 
    $timestamp = $matches[1]; 
    preg_match('#"signature":"([a-z0-9]+)"#i', $scriptBlock[1], $matches); 
    $signature = $matches[1]; 

    $url = 'http://player.vimeo.com/play_redirect?clip_id='.$id.'&sig='.$signature.'&time='.$timestamp.'&quality=sd'; 

    print_r(get_headers($url, 1)); 
    } 

回答

0

尝试为每个请求的标题添加一个有效的用户代理。 为此,您必须使用cURL或HttpRequest代替file_get_contents()。

这样的操作后,我有一个工作链接下载视频文件。

这里我的代码:

function getVimeo($id) { 
    // get page with a player 
    $queryResult = httpQuery('http://vimeo.com/' . $id); 
    $content = $queryResult['content']; 

    if (preg_match('#document\.getElementById\(\'player_(.+)\n#i', $content, $scriptBlock) == 0) 
     return 1; 

    preg_match('#"timestamp":([0-9]+)#i', $scriptBlock[1], $matches); 
    $timestamp = $matches[1]; 
    preg_match('#"signature":"([a-z0-9]+)"#i', $scriptBlock[1], $matches); 
    $signature = $matches[1]; 

    $url = 'http://player.vimeo.com/play_redirect?clip_id=' . $id . '&sig=' . $signature . '&time=' . $timestamp . '&quality=sd'; 

    // make the request for getting a video url 
    #print_r(get_headers($url, 1)); 
    $finalQuery = httpQuery($url); 
    return $finalQuery['redirect_url']; 
} 
// make queries via CURL 
function httpQuery($url) { 
    $options = array(
     CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.168 Chrome/18.0.1025.168 Safari/535.19', 
     CURLOPT_RETURNTRANSFER => true, 
    ); 
    $ch = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $info = curl_getinfo($ch); 
    curl_close($ch); 
    $result = $info; 
    $result['content'] = $content; 

    return $result; 
} 

echo getVimeo(22439234); 
+0

不在这里工作,我总是得到1的结果 – Magico 2013-12-06 10:30:49

+0

我有相同的结果时,我对代码进行测试。 – 2015-01-14 14:40:04

4

的算法是这样的:

  • 输入数据:vimeoUrl。
  • 含量= getRemoteContent(vimeoUrl)。
  • 解析内容以查找并提取data-config-url 属性的值。
  • 导航到data-config-url并将内容加载为JSON对象: $ video = json_decode($ this-> getRemoteContent($ video-> getAttribute('data-config-url')));
  • 返回$ video-> request-> files-> h264-> sd-> url - 这将返回一个 直接链接SD质量的视频。

这是我的简单课程,为此刻工作。

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

} 

使用:

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