2011-12-06 3 views
12

Все текущие учебники по созданию собственного загрузчика видео YouTube устарели. Вставка всего токена из видеоинформации не работает, и также не используется метод javascript. Кто-нибудь знает способ сделать это сейчас, не загружая чужие программы? Я просто хочу знать, как это сделать, поэтому я могу программировать свои собственные (для удовольствия: D)Как получить прямой url для видео youtube

Заранее благодарим!

+0

Я не совсем положительным он все еще работает, но http://rg3.github.com/youtube-dl/ это очень просто для анализа (являющегося скриптом Python). – Viruzzo

+0

Использование видеопроигрывателя HTML5 было бы ужасно простым. Просто найдите тег «video» и проверьте его источник. –

+0

Я рад, если кто-то может показать рабочий обходной путь для этого сегодня – eapo

ответ

15

На сегодняшний день 15/06/2012 является очень просто,., но вы должны быть часы для будущих изменений Здесь (в Javascript)

try{ 
    var urls = document.body.innerHTML.match(/"url_encoded_fmt_stream_map": "url=([^"]+)/)[1] 
    urls = decodeURIComponent(urls).replace(/\\u0026/g,'&') 
    urls = urls.replace(/&quality.+?(?=,url)/g,'');; 
    urls = urls.split(',url=') 
    // urls is an array of all the possible qualities 
    // To download one you could use something like: 
    // document.location = urls[0] 
    // The first one is usually in the highest quality available 
} catch(e){ 
    console.error("Youtube may have changed its API") 
} 
+1

Пробовал это 17/12/2012, и он не работает. YT недавно изменил свой внешний вид ... – Bikush

+0

Он по-прежнему существует, только то, что 'url =' изменено положение ... Необходим эксперт Regex :) – brasofilo

1

Почему вы хотите изобрести колесо? используйте скрипт Rapidleech!

Btw, если вам все еще нужно изобретать велосипед, вот исходный код плагина Youtube из Rapidleech (это очень читаемый:


class youtube_com extends DownloadClass { 

    /* 
    Some blah blah about the age verification and erroneous URLs 
    $fmt is quality/format number and is an integer 
    */ 
    public function Download($link) { 
     $this->fmts = array(38,37,22,45,35,44,34,43,18,5,17); 
     $yt_fmt = empty($_REQUEST['yt_fmt']) ? '' : $_REQUEST['yt_fmt']; 
     $this->fmturlmaps = $this->GetVideosArr($fmt_url_maps); 

     if (empty($yt_fmt) && !isset($_GET["audl"])) return $this->QSelector($link); 
     elseif (isset($_REQUEST['ytube_mp4']) && $_REQUEST['ytube_mp4'] == 'on' && !empty($yt_fmt)) { 
      //look for and download the highest quality we can find? 
      if ($yt_fmt == 'highest') { 
       foreach ($this->fmts as $fmt) { 
        if (array_key_exists($fmt, $this->fmturlmaps)) { 
         $furl = $this->fmturlmaps[$fmt]; 
         break; 
        } 
       } 
      } else { //get the format the user specified (making sure it actually exists) 
       if (!$furl = $this->fmturlmaps[$yt_fmt]) html_error ('Specified video format not found'); 
       $fmt = $yt_fmt; 
      } 
     } else { //just get the one Youtube plays by default (in some cases it could also be the highest quality format) 
      $fmt = key($this->fmturlmaps); 
      $furl = $this->fmturlmaps[$fmt]; 
     } 

     if (preg_match ('%^5|34|35$%', $fmt)) $ext = '.flv'; 
     elseif (preg_match ('%^17$%', $fmt)) $ext = '.3gp'; 
     elseif (preg_match ('%^18|22|37|38$%', $fmt)) $ext = '.mp4'; 
     elseif (preg_match ('%^43|44|45$%', $fmt)) $ext = '.webm'; 
     else $ext = '.flv'; 

     if (!preg_match('#<title>(.*)\s+-\sYouTube[\r|\n|\t|\s]*</title>#Us', $this->page, $title)) html_error('No video title found! Download halted.'); 
     if (!preg_match ('/video_id=(.+?)(\\\|"|&|(\\\u0026))/', $this->page, $video_id)) html_error('Video id not found.'); 

     $FileName = str_replace (Array ("\\", "/", ":", "*", "?", "\"", "<", ">", "|"), "_", html_entity_decode(trim($title[1]), ENT_QUOTES)) . "-[{$video_id[1]}][f$fmt]$ext"; 

     if (stristr($furl, '|')) { 
      $u_arr = explode('|', $furl); 
      $furl = preg_replace('#://([^/]+)#', "://".$u_arr[2], $u_arr[0]); 
     } 
     if (isset($_REQUEST['ytdirect']) && $_REQUEST['ytdirect'] == 'on') 
     { 
      echo "<br /><br /><h4><a style='color:yellow' href='" . urldecode($furl) . "'>Click here or copy the link to your download manager to download</a></h4>"; 
      echo "<input name='dlurl' style='width: 1000px; border: 1px solid #55AAFF; background-color: #FFFFFF; padding:3px' value='" . urldecode($furl) . "' onclick='javascript:this.select();' readonly></input>"; 
     } 
     else 
     { 
      $this->RedirectDownload (urldecode($furl), $FileName, $this->cookie, 0, 0, $FileName); 
     } 
    } 
33

по 1/1/2018, старый метод, описанный ниже делает похоже, не работают надежно. Структура переменной на странице Youtube, похоже, изменилась, и я не смог найти обновленную версию.

Это обновленная версия (июнь 2017 года), которая работает непосредственно с консоли разработчика, доступной в любом браузере. В настоящее время он должен работать для любого типа мультимедиа Youtube, включая до 4k, если он доступен.

https://gist.github.com/geuis/8b1b2ea57d7f9a9ae22f80d4fbf5b97f

// ES6 version 
const videoUrls = ytplayer.config.args.adaptive_fmts 
    .split(',') 
    .map(item => item 
    .split('&') 
    .reduce((prev, curr) => (curr = curr.split('='), 
     Object.assign(prev, {[curr[0]]: decodeURIComponent(curr[1])}) 
    ), {}) 
) 
    .reduce((prev, curr) => Object.assign(prev, { 
    [curr.quality_label || curr.type]: curr 
    }), {}); 

console.log(videoUrls); 

// ES5 version 
var videoUrls = ytplayer.config.args.adaptive_fmts 
    .split(',') 
    .map(function (item) { 
    return item 
     .split('&') 
     .reduce(function (prev, curr) { 
     curr = curr.split('='); 
     return Object.assign(prev, {[curr[0]]: decodeURIComponent(curr[1])}) 
     }, {}); 
    }) 
    .reduce(function (prev, curr) { 
    return Object.assign(prev, { 
     [curr.quality_label || curr.type]: curr 
    }); 
    }, {}); 

console.log(videoUrls); 

Пример вывода для https://www.youtube.com/watch?v=9bZkp7q19f0

{ 
    "1080p": { 
    "itag": "248", 
    "xtags": "", 
    "lmt": "1440215955569849", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=248&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "video/webm;+codecs=\"vp9\"", 
    "bitrate": "1733724", 
    "index": "243-1977", 
    "size": "1920x1080", 
    "projection_type": "1", 
    "fps": "30", 
    "clen": "31192903", 
    "init": "0-242", 
    "quality_label": "1080p" 
    }, 
    "720p": { 
    "itag": "247", 
    "xtags": "", 
    "lmt": "1440215905109639", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=247&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "video/webm;+codecs=\"vp9\"", 
    "bitrate": "726076", 
    "index": "243-1933", 
    "size": "1280x720", 
    "projection_type": "1", 
    "fps": "30", 
    "clen": "15801933", 
    "init": "0-242", 
    "quality_label": "720p" 
    }, 
    "480p": { 
    "itag": "244", 
    "xtags": "", 
    "lmt": "1440215890236689", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=244&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "video/webm;+codecs=\"vp9\"", 
    "bitrate": "396541", 
    "index": "243-1933", 
    "size": "854x480", 
    "projection_type": "1", 
    "fps": "30", 
    "clen": "7928237", 
    "init": "0-242", 
    "quality_label": "480p" 
    }, 
    "360p": { 
    "itag": "243", 
    "xtags": "", 
    "lmt": "1440215888783441", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=243&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "video/webm;+codecs=\"vp9\"", 
    "bitrate": "223695", 
    "index": "243-1933", 
    "size": "640x360", 
    "projection_type": "1", 
    "fps": "30", 
    "clen": "5127362", 
    "init": "0-242", 
    "quality_label": "360p" 
    }, 
    "240p": { 
    "itag": "242", 
    "xtags": "", 
    "lmt": "1440215900971640", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=242&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "video/webm;+codecs=\"vp9\"", 
    "bitrate": "113952", 
    "index": "242-1931", 
    "size": "426x240", 
    "projection_type": "1", 
    "fps": "30", 
    "clen": "2597162", 
    "init": "0-241", 
    "quality_label": "240p" 
    }, 
    "144p": { 
    "itag": "278", 
    "xtags": "", 
    "lmt": "1440215900119192", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=278&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "video/webm;+codecs=\"vp9\"", 
    "bitrate": "60303", 
    "index": "242-1930", 
    "size": "256x144", 
    "projection_type": "1", 
    "fps": "15", 
    "clen": "1798744", 
    "init": "0-241", 
    "quality_label": "144p" 
    }, 
    "audio/mp4;+codecs=\"mp4a.40.2\"": { 
    "bitrate": "128266", 
    "itag": "140", 
    "xtags": "", 
    "lmt": "1440578358539132", 
    "index": "592-1271", 
    "clen": "8482615", 
    "projection_type": "1", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=140&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "audio/mp4;+codecs=\"mp4a.40.2\"", 
    "init": "0-591" 
    }, 
    "audio/webm;+codecs=\"vorbis\"": { 
    "bitrate": "118499", 
    "itag": "171", 
    "xtags": "", 
    "lmt": "1440215938192462", 
    "index": "4452-5366", 
    "clen": "6383456", 
    "projection_type": "1", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=171&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "audio/webm;+codecs=\"vorbis\"", 
    "init": "0-4451" 
    }, 
    "audio/webm;+codecs=\"opus\"": { 
    "bitrate": "154966", 
    "itag": "251", 
    "xtags": "", 
    "lmt": "1440215889283443", 
    "index": "272-1186", 
    "clen": "9526605", 
    "projection_type": "1", 
    "url": "https://r16---sn-n4v7kn7r.c.youtube.com/videoplayback?itag=251&keepalive=ye…2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csc%2Csource%2Cexpire&mt=1498245944", 
    "type": "audio/webm;+codecs=\"opus\"", 
    "init": "0-271" 
    } 
} 
+0

знаете ли вы, что есть способ доступа к конфигурации игрока, а именно (ytplayer.config.args .url_encoded_fmt_stream_map) через API-интерфейс проигрывателя YouTube для вложений iframe? – lukejacksonn

+2

@ lukejacksonn Не в обычном браузере. Любой сайт, загруженный в iframe (youtube.com в этом случае), изолирован. Это делается для предотвращения проблем безопасности, таких как межсайтовый скриптинг и т. Д. Таким образом, вы практически не имеете доступа к среде javascript страницы в iframe. Вам нужно будет добавить свой собственный скрипт на страницу iframe, чтобы иметь возможность общаться. И вы не можете этого сделать на youtube.com – Geuis

+0

Я боялся, что это может быть ответ, но это имеет смысл. Спасибо, что нашли время ответить – lukejacksonn

Смежные вопросы