2012-07-08 33 views
8

Tôi muốn có một liên kết trực tiếp tới các video từ Vimeo bằng một tập lệnh PHP. Tôi đã quản lý để tìm chúng theo cách thủ công, nhưng tập lệnh PHP của tôi không hoạt động. Đây là sáng kiến: Ví dụ: tôi đã quay video này: http://vimeo.com/22439234Nhận các video liên kết trực tiếp từ Vimeo bằng PHP

Khi bạn đi trên trang, Vimeo tạo chữ ký được liên kết với dấu thời gian hiện tại và video này. Thông tin này được lưu trữ trong một biến JavaScript, xung quanh dòng 520 chỉ sau: window.addEvent ('domready', function() {

Sau đó, khi bạn click Play, người chơi HTML5 đọc biến này và gửi một yêu cầu 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= 

Nhưng nó cũng làm việc với:

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

Nếu URL này không mở ra với địa chỉ IP mà mở http://vimeo.com/22439234, này trả về mã HTTP 200 với một thông báo lỗi.

Nếu URL này được mở ra với địa chỉ IP chính xác, tiêu đề "Vị trí" chuyển hướng đến liên kết đến tập tin video: http://av.vimeo.com/XXX/XX/XXXX.mp4?aksessionid=XXXX&token=XXXXX_XXXXXXXXX

Khi tôi xây dựng liên kết này http://player.vimeo.com/play_redirect?... bằng tay ("click chuột phải"> "mã nguồn ">" dòng 520 ") nó hoạt động.

Nhưng với PHP và regex nó trả về HTTP code 200 với thông báo lỗi.

Tại sao?

Từ quan sát của tôi, Vimeo không kiểm tra các tiêu đề của yêu cầu HTTP cho http:// player.vimeo.com/play_redirect?... GET, HEAD, với các tập tin cookie, mà không cần cookie, giới thiệu vv ... không thay đổi.

Với PHP, tôi sử dụng hàm 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)); 
    } 

Trả lời

0

Thử thêm tác nhân người dùng hợp lệ vào tiêu đề cho mỗi yêu cầu. Đối với điều này, bạn phải sử dụng cURL hoặc HttpRequest thay vì file_get_contents().

Sau thao tác như vậy, tôi có liên kết hoạt động để tải xuống tệp video.

Ở đây mã của tôi:

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

Không làm việc ở đây, tôi luôn luôn có 1 kết quả – Magico

+0

Tôi có kết quả tương tự khi tôi kiểm tra mã. –

4

Thuật toán như sau: dữ liệu

  • Input: vimeoUrl.
  • content = getRemoteContent (vimeoUrl).
  • Nội dung phân tích cú pháp để tìm và trích xuất giá trị từ thuộc tính data-config-url .
  • Điều hướng đến data-config-url và tải nội dung dưới dạng JSON Đối tượng: $ video = json_decode ($ this-> getRemoteContent ($ video-> getAttribute ('data-config-url')));
  • Trả lại $ video-> request-> files-> h264-> sd-> url - điều này sẽ trả về một liên kết trực tiếp cho video có chất lượng SD.

Đây là lớp đơn giản của tôi, hoạt động trong thời điểm này.

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

} 

Sử dụng:

$video = new VideoController; 
var_dump($video->getVimeoDirectUrl('http://vimeo.com/90747156')); 
Các vấn đề liên quan