如何使用Youtube v3 API获取Youtube视频的mp4链接

36

我该如何在我的应用程序中使用除Youtube之外的其他来源获取完整的mp4 URL以播放视频。由于gdata / youtube API已被弃用,因此我遇到了麻烦。任何帮助将不胜感激。谢谢。


[PHP] 这个解决方案是基于最新的YouTube网站更新(2019年)的。 https://dev59.com/eLLma4cB1Zd3GeqPaWcN#55079527 - Anass
5个回答

22

我制作了一个非常简单的API:https://gist.github.com/egyjs/9e60f1ae3168c38cc0f0054c15cd6a83

例如:YouTube视频链接:https://www.youtube.com/watch?v=YGCLs9Bt_KY

现在要获取直接链接,您需要调用API,像这样(将example.com更改为您的站点):

https://example.com/?url=https://www.youtube.com/watch?v=YGCLs9Bt_KY

返回结果:

[
    {
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&signature=81D86D3BC3D34D8A3B865464BE7BC54F34C1B0BC.7316033C2DD2F65E4D345CFA890257B63D7FE2A2&mt=1522999783&expire=1523021537&sparams=dur%2Cei%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&requiressl=yes&ei=gSLHWvuxDMOUVYaTqYgB&dur=244.204&pl=22&itag=22&ip=185.27.134.50&lmt=1522960451860848&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&ratebypass=yes&ms=au%2Conr&fvip=2&source=youtube&mv=m&ipbits=0&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&mime=video%2Fmp4&c=WEB&initcwndbps=710000",
        "quality": "hd720",
        "itag": "22",
        "type": "video\/mp4; codecs=\"avc1.64001F, mp4a.40.2\""
    },
    {
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&mt=1522999783&gir=yes&expire=1523021537&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&itag=43&ratebypass=yes&fvip=2&ipbits=0&mime=video%2Fwebm&initcwndbps=710000&signature=71DC48B9BF4B2E3ED46FE0A4CD36FE027DACF31E.4624B7B4BCB947336CEB029E9958B136F79759EB&clen=24203231&requiressl=yes&dur=0.000&pl=22&ip=185.27.134.50&lmt=1522961642553275&ei=gSLHWvuxDMOUVYaTqYgB&ms=au%2Conr&source=youtube&mv=m&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&c=WEB",
        "quality": "medium",
        "itag": "43",
        "type": "video\/webm; codecs=\"vp8.0, vorbis\""
    },
    {
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&mt=1522999783&gir=yes&expire=1523021537&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&itag=18&ratebypass=yes&fvip=2&ipbits=0&mime=video%2Fmp4&initcwndbps=710000&signature=C83DE33E3DC80981A65DB3FE4E6B3A48BF7500E4.361D0EE6210B30D3D3A80F43228DEF1BD20691A4&clen=15954979&requiressl=yes&dur=244.204&pl=22&ip=185.27.134.50&lmt=1522960340235683&ei=gSLHWvuxDMOUVYaTqYgB&ms=au%2Conr&source=youtube&mv=m&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&c=WEB",
        "quality": "medium",
        "itag": "18",
        "type": "video\/mp4; codecs=\"avc1.42001E, mp4a.40.2\""
    },
    {
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&mt=1522999783&gir=yes&expire=1523021537&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csource%2Cexpire&itag=36&fvip=2&ipbits=0&mime=video%2F3gpp&initcwndbps=710000&signature=3E993D911492DA039A16BB26182ACDC6C6A04FCC.BFB9728C71CD03970B0F15AFD51A7355F9D3F899&clen=6759799&requiressl=yes&dur=244.273&pl=22&ip=185.27.134.50&lmt=1522957367267598&ei=gSLHWvuxDMOUVYaTqYgB&ms=au%2Conr&source=youtube&mv=m&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&c=WEB",
        "quality": "small",
        "itag": "36",
        "type": "video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
    },
    {
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&mt=1522999783&gir=yes&expire=1523021537&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csource%2Cexpire&itag=17&fvip=2&ipbits=0&mime=video%2F3gpp&initcwndbps=710000&signature=810D13A2C507A4EA220E6DA895B39B237FA22DAF.898D020851087CF3C10BC6E3ED7360736A239904&clen=2443931&requiressl=yes&dur=244.273&pl=22&ip=185.27.134.50&lmt=1522957365473654&ei=gSLHWvuxDMOUVYaTqYgB&ms=au%2Conr&source=youtube&mv=m&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&c=WEB",
        "quality": "small",
        "itag": "17",
        "type": "video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
    }
]

更新:

源代码可在以下链接查看:

GIST: https://gist.github.com/egyjs/9e60f1ae3168c38cc0f0054c15cd6a83


1
为什么你的API不能拉取1080或4K链接? - ColorCodin
2
将来最好直接在此处粘贴您的代码,而不是链接到带有自己广告的网页。 - Space Devin
7
如果您在 GitHub Gist 上看到广告,那么我可能有一些关于您的计算机上可能运行的软件类型的不好消息。 - spacer GIF
1
很遗憾,我没有服务器来上传代码。 - A. El-zahaby
1
Gist是404,网站重定向到骗局。 - PLASMA chicken
显示剩余4条评论

7
抱歉,您无法在Youtube API V3中完成此操作。您必须使用一个不是API的Youtube网址,但是在这里您可以获取与此相关的所有视频。 请参见http://www.youtube.com/get_video_info?&video_id='。$my_id.'&asv=3&el=detailpage&hl=en_US

或者您可以获取所有视频的下载链接,即使它是私有的或不允许您的国家 第一步:转到任何YouTube视频链接的网页https://www.youtube.com/watch?v=9mdJV5-eias 第二步:查看该页面的源代码
第三步:在第188或187行找到源JavaScript代码,其中还提供了带有mp4格式的视频的位置。
您可以通过simplehtmldom和一些php函数完成第二个想法。而使用curl可以获得第一个,这种方法相对容易,但稍微有点难以用php实现。谢谢,希望这会对您有所帮助。

4

对于本地到Java / Android的情况,以下是我实现此功能的方法,功劳归于@abdo-el-zahaby,我将其PHP脚本转换为等效的Java代码,它使用OkHttp客户端获取URL。

final String videoInfoUrl = "http://www.youtube.com/get_video_info?video_id=some_video_id&el=embedded&ps=default&eurl=&gl=US&hl=en";
                Request request = new Request.Builder()
                        .cacheControl(CacheControl.FORCE_NETWORK)
                        .url(videoInfoUrl)
                        .build();
                final Response response = okHttpClient.newCall(request).execute();
                InputStream inputStream = response.body().byteStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                final StringBuilder contentBuilder = new StringBuilder();
                while ((line = bufferedReader.readLine()) != null) {
                    contentBuilder.append(line);
                }

                final String streamKey = "url_encoded_fmt_stream_map";
                final Map<String, String> map = new HashMap<>();
                final String content = contentBuilder.toString();
                String[] ampSplit = content.split("&");
                for (String s : ampSplit) {
                    printDivider();
                    final String[] equalsPlit = s.split("=");
                    if (equalsPlit.length >= 2) {
                        String key;
                        String value;
                        key = equalsPlit[0];
                        value = equalsPlit[1];
                        map.put(key, value);
                    }
                    printDivider();
                }
                int count = 0;
                if (map.containsKey(streamKey)) {
                    String[] streams = map.get(streamKey).split(",");
                    for (String stream : streams) {

                        String[] streamSplit = stream.split("&");
                        for (String s : streamSplit) {
                            printDivider();
                            final String urlDecoded = URLDecoder.decode(s, "UTF-8");
                            String[] details = urlDecoded.split(",");
                            for (String detail : details) {
                                System.out.println("Detail " + URLDecoder.decode(detail, "UTF-8"));
                                final String urlContent= URLDecoder.decode(detail, "UTF-8");
                                final String url = urlContent.substring(urlContent.indexOf("http"), urlContent.indexOf(";"));
                                mp4Url.put(Integer.toString(count++), url);
                            }

                        }
                        printDivider();
                    }
                }

这是我用来下载并存储到SD卡/内部存储的代码。
Request request = new Request.Builder()
              .cacheControl(CacheControl.FORCE_NETWORK)
              .url(url)
              .build();
          final Response response = okHttpClient.newCall(request).execute();
          InputStream inputStream = response.body().byteStream();
          final File newFile = new File(location);
          boolean created = newFile.createNewFile();
          System.out.println(location + " new file created: " + created);

          byte[] buff = new byte[4096];
          long downloaded = 0;
          long target = response.body().contentLength();

          System.out.println("File size is: " + Long.toString(target));
          OutputStream outStream = new FileOutputStream(newFile);
          while (true) {

            int read = inputStream.read(buff);
            if (read == -1) {
              break;
            }
            outStream.write(buff, 0, read);
            //write buff
            downloaded += read;
          }

          System.out.println("Target: " + target +", Downloaded: " + downloaded);
          outStream.flush();

让我们把它变成一个真正的项目,你觉得怎么样 :) - A. El-zahaby
1
你好,你确定它能正常工作吗?我得到了一个越界异常。你能把它放在 gist 上吗? - Alexius DIAKOGIANNIS

0

这很简单,在MSEDGE中,打开网络请求面板,然后输入:

videoplayback

你会得到一个视频播放列表,进入前三个红色的视频中,选择第一个,然后复制URL,进入该URL,然后复制并粘贴出现的原始URL,就完成了!例如: https://www.youtube.com/watch?v=kyCJ17oq6kI 被翻译成 https://rr5---sn-4g5lznek.googlevideo.com/videoplayback?expire=1681055644&ei=PIsyZLKiDf2pxN8Pycma6Ac&ip=197.133.92.36&id=o-AG5C0lZuVpm9QTlY3-bdsnaxXFDmYWZNMfSnHEevldCX&itag=244&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C271%2C278%2C313%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401&source=youtube&requiressl=yes&spc=99c5CQGgativKiOByrtN4P3IwKXbF2U&vprv=1&mime=video%2Fwebm&ns=GZQIER86iMv1E06YUDtOUIUM&gir=yes&clen=51126864&dur=930.629&lmt=1661735478649394&keepalive=yes&fexp=24007246&c=WEB_EMBEDDED_PLAYER&txp=5537434&n=60EJG2vTL7kL_A&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIhAKOA0iAqWrySUp9NpkpcxJNJQ6C1_BWfa6b91zStEu5TAiA80wiRQvGJFEd-4iuq4fjM5r7SAc1zPjr4xv6PweEgxw%3D%3D&alr=yes&cpn=pDl8mDxKkx62PK2k&cver=1.20230402.00.00&range=0-245662&rn=1&rbuf=0&pot=MmQ1aC1VTvzpGTVQZjSBWLyWnbiGJ0bOAtQgoIovIYrGI3nBfAVO60KmMbRKcRxq5ySqI9TAJ4rqBnfcuoXzj7CAgJAA24AmShxWJhrSkAoI0LrSFPC_N6FCyu6xkeOf38wpoFXa&altitags=243%2C242&redirect_counter=1&cm2rm=sn-8vq54voxxb-j5pd7d&req_id=9c5d1ec279bcda59&cms_redirect=yes&cmsv=e&mh=Yy&mm=29&mn=sn-4g5lznek&ms=rdu&mt=1681033985&mv=m&mvi=5&pl=22&lsparams=mh,mm,mn,ms,mv,mvi,pl&lsig=AG3C_xAwRQIgcOPSyxayGZHivxtPhZzhmckywIeotUdp0Ny6sepZS-4CIQD52bhTS6Xu_GOWGg_GCIIl2ZcXXaQpy-mMMzhZaB2Mbg%3D%3D

试试看。


-6

我不知道它是如何工作的,但是看看https://podsync.net/

当您输入YouTube播放列表链接时,它会执行一些魔法并生成一个MP4链接,供播客捕捉器使用。检查返回的XML文件,您将看到每个视频播放列表中的类似于以下行:

<enclosure url="http://podsync.net/download/[random-letters]/[video-id].mp4" length="x" type="video/mp4"></enclosure>

根据我的经验,无论你使用什么视频ID,该URL都可以正常工作。

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