使用PHP下载Youtube视频

21

我正在寻找一种使用PHP下载YouTube视频的方法。我已经搜索了几个小时,但是不幸的是,我找到的所有谷歌结果都已过时,不再起作用。

如果有人能够解释如何做到这一点,或者提供一篇详细介绍的最新文章链接,我将不胜感激。

非常感谢。


使用此链接:https://www.phpclasses.org/package/9092-PHP-Download-files-of-given-YouTube-videos.html,下载指定YouTube视频的文件。 - Milad Ghiravani
这个脚本将帮助您在PHP中实现YouTube下载器。https://github.com/rintoug/Simple-YouTube-Downloader - Rinto George
3个回答

19
你应该首先获取像Fiddler这样的工具,并访问YouTube视频页面。在Fiddler中,您将看到组成该页面的所有文件,包括FLV本身。现在,您知道视频不是CSS文件之一,也不是图像文件。可以忽略它们。寻找一个大文件。如果查看URL,它以/videoplayback开头。
现在,一旦找到它,请弄清浏览器是如何知道获取该文件的。在会话中进行搜索(Ctrl + F),并查找“videoplayback”。您将在您所访问的第一个页面上看到一个匹配项,例如http://www.youtube.com/watch?v=123asdf。如果你深入研究那个文件,你会看到一个ID为“watch-player”的DIV标签。其中有一个设置Flash播放器的脚本标签,其中包含所有Flash参数。在其中是该视频的URL。
所以现在您知道如何使用工具来找出浏览器是如何获取它的。如何在PHP中复制此行为?
对引用视频的页面执行file_get_contents()。忽略不在watch-player div中的所有内容。解析代码,直到找到包含URL的变量。从那里,您可能需要取消转义该URL。一旦您获得它,您可以执行file_get_contents()(或其他下载方法,具体取决于您要做什么)来获取URL。如此简单。您的HTML解析代码将是最复杂的。
最后,请记住,您即将执行的操作可能是非法的。检查用户许可协议(EULA)。

3
谢谢你提供如此详细的答案! - gyaani_guy
我卡在了file_get_contents()这个函数上。之后该怎么做?你能再解释一下吗? - Bhaumik Bhatt

2
没有人会写每四周就过时的手册或教程。你能做到的最接近的是检查当代实现中的实际提取方法。相当易读:

http://bitbucket.org/rg3/youtube-dl/raw/2010.08.04/youtube-dl

如果你不想阅读/重新实现它,显然它不是简单的,你可以直接从PHP运行它:
  system("youtube-dl '$url'");

1

上次我在修复一个损坏的Chrome扩展程序,以便下载YouTube视频。我通过修改脚本部分(JavaScript)来解决它。

var links = new String();
var downlink = new String();
var has22 = new Boolean();
has22 = false;
var Marked=false;

var FMT_DATA = fmt_url_map;//This is html text that you have to grab. In case of extension it was readily available through:document.getElementsByTagName('script');

var StrSplitter1='%2C', StrSplitter2='%26', StrSplitter3='%3D'; 
if (FMT_DATA.indexOf(',')>-1) { //Found ,
    StrSplitter1=','; 
    StrSplitter2=(FMT_DATA.indexOf('&')>-1)?'&':'\\u0026'; 
    StrSplitter3='='; 
}

var videoURL=new Array(); 
var FMT_DATA_PACKET=new Array();
var FMT_DATA_PACKET=FMT_DATA.split(StrSplitter1); 

for (var i=0;i<FMT_DATA_PACKET.length;i++){
    var FMT_DATA_FRAME=FMT_DATA_PACKET[i].split(StrSplitter2); 
    var FMT_DATA_DUEO=new Array(); 

    for (var j=0;j<FMT_DATA_FRAME.length;j++){
        var pair=FMT_DATA_FRAME[j].split(StrSplitter3); 
        if (pair.length==2) { 
            FMT_DATA_DUEO[pair[0]]=pair[1]; 
        } 
    } 

    var url=(FMT_DATA_DUEO['url'])?FMT_DATA_DUEO['url']:null; 

    if (url==null) continue; 
        url=unescape(unescape(url)).replace(/\\\//g,'/').replace(/\\u0026/g,'&'); 
        var itag=(FMT_DATA_DUEO['itag'])?FMT_DATA_DUEO['itag']:null; 
        var itag=(FMT_DATA_DUEO['itag'])?FMT_DATA_DUEO['itag']:null; 
    if (itag==null) continue; 
        var signature=(FMT_DATA_DUEO['sig'])?FMT_DATA_DUEO['sig']:null; 
        if (signature!=null) { 
        url=url+"&signature="+signature; 
    } 
    if (url.toLowerCase().indexOf('http')==0) { // validate URL 

        if (itag == '5') {
            links += '<a href="' + url + '&title=' + username + title + quality240 + '"style="text-decoration:none"><span class="yt-uix-button-menu-item" id="v240p">FLV (240p)</span></a>';
        }
        if (itag == '18') {
            links += '<a href="' + url + '&title=' + username + title + quality360 + '"style="text-decoration:none"><span class="yt-uix-button-menu-item" id="v360p">MP4 (360p)</span></a>';
        }
        if (itag == '35') {
            links += '<a href="' + url + '&title=' + username + title + quality480 + '"style="text-decoration:none"><span class="yt-uix-button-menu-item" id="v480p">FLV (480p)</span></a>';
        }
        if (itag == '22') {
            links += '<a href="' + url + '&title=' + username + title + quality720 + '"style="text-decoration:none"><span class="yt-uix-button-menu-item" id="v720p">MP4 HD (720p)</span></a>';
        }
        if (itag == '37') {
            links += ' <a href="' + url + '&title=' + username + title + quality1080 + '"style="text-decoration:none"><span class="yt-uix-button-menu-item" id="v1080p">MP4 HD (1080p)</span></a>';
        }
        if (itag == '38') {
            links += '<a href="' + url + '&title=' + username + title + quality4k + '"style="text-decoration:none"><span class="yt-uix-button-menu-item"  id="v4k">MP4 HD (4K)</span></a>';
        }

        FavVideo();
        videoURL[itag]=url; 
        console.log(itag);
    } 
} 

你可以从videoURL[itag]数组中获取单独的视频链接。 上述逻辑可以轻松转换为PHP。
该扩展程序可从http://www.figmentsol.com/chrome/ytdw/下载。
希望这能帮助到某些人。这是可行的解决方案(日期:06-04-2013)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接