Загрузка видео с YouTube с помощью PHP - все еще возможно? - PullRequest
0 голосов
/ 01 августа 2010

Мне было интересно, есть ли способ, после всех изменений в YouTube за последние месяцы, написать скрипт, который позволяет загружать видео?

Мне известно о том, что методы, которые работалигод назад уже не актуальны.

1 Ответ

3 голосов
/ 02 августа 2010

Да, есть еще способ. Я не собираюсь писать весь сценарий для вас, но я по крайней мере напишу вам функцию, которая обеспечивает ссылку для скачивания с 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, который очень удобен для подобных инструментов.

Пожалуйста, подтвердите, что, как указано, YouTube всегда меняет свои алгоритмы, и вы используете этот инструмент на свой страх и риск. Я не несу ответственности за любой ущерб, нанесенный YouTube.

Надеюсь, это установит для вас хорошую границу, потратив некоторое время на это.

...