使用PHP从youtube下载视频 - 仍然可以吗?

时间:2010-08-01 19:44:06

标签: php download youtube video

我想知道在过去几个月youtube中的所有更改之后是否有办法编写一个可以下载视频的脚本?

我知道一年前使用的方法不再具有相关性。

1 个答案:

答案 0 :(得分: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造成的任何损害,我不承担任何责任。

希望它为你设定一个好的边界,花了一段时间制作它。