2010-08-01 146 views
0

我想知道在過去幾個月裏,在YouTube的所有變化之後是否有辦法編寫一個可以下載視頻的腳本?使用PHP從YouTube上下載視頻 - 仍有可能嗎?

我意識到一年前工作的方法不再相關的事實。

+2

注意:這樣做違反了Youtube使用條款。 – 2010-08-01 19:45:10

回答

3

是的,還有一種方法。我不會爲您編寫整個腳本,但我至少會爲您提供從YouTube提供下載鏈接的功能。

好吧,您將需要安裝CURL來執行此操作。

/* Developed by User - WebEntrepreneur @ StackOverlow.com */ 

function ___get_youtube_video($youtube_url) 
{ 
    if(eregi('youtube.com', $youtube_url)) 
    { 
     preg_match('/http:\/\/(.+)youtube.com\/watch(.+)?v=(.+)/', $youtube_url, $youtube_id_regex); 
     $youtube_id = ($youtube_id_regex[3]) ? $youtube_id_regex[3] : ''; 

     if(!$youtube_id) 
     { 
      return INVALID_YOUTUBE_ID; 
     } 

     if(eregi('\&', $youtube_id)) 
     { 
      $youtube_id_m = explode('&', $youtube_id); 
      foreach($youtube_id_m as $slices) 
      { 
       $youtube_id = $slices; 
       break; 
      } 
     } 

    } else { 
     $youtube_id = ($youtube_url); 
    } 

    $ping = ___get_curl("http://www.youtube.com/watch?v={$youtube_id}&feature=youtu.be"); 

    if(!$ping) 
    { 
     return YOUTUBE_UNAVAILABLE; 
    } 

    $ping_scan = nl2br($ping); 
    $ping_scan = explode('<br />', $ping_scan); 

    if(eregi('= null', $ping_scan[36]) or !$ping_scan[36]) 
    { 
     return YOUTUBE_TOO_MANY_REQUESTS; 
    } 

    $ping_scan = str_replace("\n", "", $ping_scan[36]); 
    $ping_scan = str_replace("    img.src = '", "", $ping_scan); 
    $out[1] = str_replace("';", "", $ping_scan); 

    $sub_ping = ___get_curl("http://gdata.youtube.com/feeds/api/videos/{$youtube_id}"); 

    preg_match('/<title type=\'text\'>(.+)<\/title>/', $sub_ping, $inout); 

    $inout = $inout[1]; 

    if(!$out[1]) 
    { 
     return VERSION_EXPIRED; 
    } 

    $out[1] = str_replace("generate_204", "videoplayback", $out[1]); 
    $out[1] = str_replace("\\/", "/", $out[1]); 
    $out[1] = rawurldecode($out[1]); 

    if($inout) 
    { 
     $out[1] .= "&file=".urlencode($inout).".mp4"; 
     $filename = urlencode($inout).".mp4"; 
    } 

    header("Content-Disposition: attachment; filename=\"".$filename."\""); 
    flush(); 
    return ___get_curl($out[1]); 
} 

function ___get_curl($url) 
{ 

    if(!function_exists("curl_setopt")) 
    { 
     return CURL_NOT_INSTALLED; 
    } 

    $ch=curl_init(); 
    curl_setopt($ch,CURLOPT_USERAGENT, "YouTube Video Downloader"); 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); 
    curl_setopt($ch,CURLOPT_HEADER,0); 
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); 
    curl_setopt($ch,CURLOPT_TIMEOUT,100000); 

    $curl_output=curl_exec($ch); 
    $curlstatus=curl_getinfo($ch); 
    curl_close($ch); 

    return $curl_output; 

} 

現在讓我來談談代碼。經過大約30分鐘的研究後,我設法破解了他們的算法,但它確實有非常嚴格的界限,他們現在已經設定了。

由於每個視頻下載請求都只與IP綁定,因此您需要將其從您的帶寬中流出,這正是上述腳本的作用。但是,像keepvid.com這樣的站點使用Java來獲取下載URL並將其傳輸給用戶。我還加入了自己的YouTube ID獲取器,這對於這些工具非常方便。

請注意,如上所述,YouTube會一直更改其算法,使用此工具需自擔風險。對於對YouTube造成的任何損害,我不承擔任何責任。

希望它爲你設定了一個很好的邊界,花了一段時間。

+0

謝謝你。這就是我正在尋找的東西 – Alex1987 2010-08-02 14:59:44

+0

好吧,我試過這段代碼,它下載了html文件。這是我如何使用腳本 echo ___ get_youtube_video(「http://www.youtube.com/watch?v=dDwKPGUIVME」); 它下載Alizee + - + Moi + Lolita.mp4.html – Alex1987 2010-08-03 08:43:02

+0

它可能是你的服務器,試圖調試它,看看會發生什麼。 – 2010-08-07 22:28:28