PHP

2012-07-08 26 views
8

में Vimeo से सीधे लिंक वीडियो प्राप्त करें मैं एक PHP स्क्रिप्ट के साथ Vimeo से वीडियो के लिए एक सीधा लिंक चाहते हैं। मैं उन्हें मैन्युअल रूप से ढूंढने में कामयाब रहा, लेकिन मेरी PHP स्क्रिप्ट काम नहीं करती है। यहाँ पहल है: उदाहरण के लिए मैं इस वीडियो में ले लिया: http://vimeo.com/22439234PHP

जब आप पृष्ठ पर जाने, Vimeo वर्तमान टाइमस्टैम्प और इस वीडियो से संबद्ध एक हस्ताक्षर उत्पन्न करता है। यह जानकारी JavaScript वैरिएबल में संचित होता है, लाइन 520 के आसपास बस के बाद: जब आप खेलने के लिए क्लिक करें window.addEvent ('domready', function() {

फिर, एचटीएमएल 5 खिलाड़ी इस चर पढ़ता है और एक 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 खोला साथ नहीं खोलता है, यह एक त्रुटि संदेश के साथ HTTP कोड 200 देता है। http://av.vimeo.com/XXX/XX/XXXX.mp4?aksessionid=XXXX&token=XXXXX_XXXXXXXXX

जब मैं इस लिंक http://player.vimeo.com/play_redirect?... मैन्युअल रूप से बनाने ("राइट क्लिक करें"> "स्रोत कोड:

इस URL सही आईपी पते के साथ खोला जाता है, शीर्ष लेख" स्थान "वीडियो फ़ाइल से लिंक पर रीडायरेक्ट ">" रेखा 520 ") यह काम करता है।

लेकिन PHP और regex के साथ यह एक त्रुटि संदेश के साथ HTTP code 200 देता है।

क्यों?

मेरी टिप्पणियों से, Vimeo के लिए http:// player.vimeo.com/play_redirect?... GET, HEAD HTTP अनुरोध का शीर्षक देख नहीं है, कुकीज़ के साथ, कुकीज़, संदर्भ आदि के बिना ... नहीं बदलता है।

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

+0

के रूप में मैं एक ही परिणाम है। –

4

एल्गोरिथ्म इस तरह दिखता है:

  • इनपुट डेटा: vimeoUrl।
  • सामग्री = getRemoteContent (vimeoUrl)।
  • डेटा-कॉन्फ़िगर-यूआरएल विशेषता से मूल्य खोजने और निकालने के लिए पार्स सामग्री।
  • डेटा-कॉन्फ़िगर-यूआरएल पर नेविगेट करें और सामग्री को JSON ऑब्जेक्ट के रूप में लोड करें: $ वीडियो = json_decode ($ this-> getRemoteContent ($ video-> getAttribute ('data-config-url'));
  • $ वीडियो-> अनुरोध-> फ़ाइलें-> h264-> sd-> url - यह एसडी गुणवत्ता वीडियो के लिए सीधा लिंक लौटाएगा।

यहां मेरी सरल कक्षा है, जो इस पल के लिए काम कर रही है।

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'));