android youtube下载url 403禁止

有一些video无法下载

我使用这个下载url

http://www.youtube.com/get_video_info?video_id=itGNQbJwRSk 

有没有人为什么下面的URL不可用?

总url:

 http://r1---sn-a5m7lnek.googlevideo.com/videoplayback?expire=1391267516&ms=au&source=youtube&sver=3&upn=OzZzFV_-2o4&id=8ad18d41b2704529&itag=22&mt=1391243224&ipbits=0&ratebypass=yes&fexp=935622%2C914924%2C926515%2C916623%2C936910%2C936913&sparams=gcr%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&mv=m&ip=183.101.166.55&key=yt5&gcr=kr&signature=F303D0C863C27A6A46124A09E40F308BB67181E013.3FA3E17460DDF6ECA004D9E48B1356849534EBFFFF 

与每个参数分隔的url:

 http://r1---sn-a5m7lnek.googlevideo.com/videoplayback? expire=1391267516& ms=au& source=youtube& sver=3& upn=OzZzFV_-2o4& id=8ad18d41b2704529& itag=22& mt=1391243224& ipbits=0& ratebypass=yes& fexp=935622%2C914924%2C926515%2C916623%2C936910%2C936913& sparams=gcr%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire& mv=m& ip=183.101.166.55& key=yt5& gcr=kr& signature=F303D0C863C27A6A46124A09E40F308BB67181E013.3FA3E17460DDF6ECA004D9E48B1356849534EBFFFF 

我在开放stream中使用了以下代码

  u = new URL(url); HttpURLConnection huc = (HttpURLConnection)u.openConnection();//to know the size of video huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36"); huc.setRequestProperty("Accept","*/*"); huc.setRequestMethod("GET"); huc.setDoOutput(false); int size = huc.getContentLength(); int status = huc.getResponseCode(); Log.e("download", status+ huc.getResponseMessage()); is = new BufferedInputStream(huc.getInputStream()); 

但是它返回status = 403,size = -1。 我找不到任何帮助。

有没有人有一个想法?

Solutions Collecting From Web of "android youtube下载url 403禁止"

此video正在使用密码信号,您可以在http://www.youtube.com/get_video_info?video_id=itGNQbJwRSk返回的信息中看到

 'use_cipher_signature=True' 

要下载这种types的video,首先你必须解码它的签名。 解码algorithm存在于播放器文件(HTML5player或Flash播放器)

解码后,您必须使用相同的IP地址从您已经获取所有信息的地方下载video。 (您可以使用代理绕过相同的IP限制)

它最好使用抓取那个video的网页search;ytplayer.config = {(.*?)}; 。 这包含所有需要的信息。

如果你不想刮,那么你可以使用下面的方法来获取JSON对象

 https://www.youtube.com/watch?v=<Video-ID>&spf=prefetch 

请检查此API以获得简单的解决scheme: CipherAPI

另一个很酷的API: YTstream API

简而言之: https //github.com/lure/YoutubeGrabber

长篇故事:每个YouTubevideo页面都包含一个初始化html5播放器的js块。 当然,也有一个Flash Player,但是JS更容易理解。

位于两个参数中的stream:用于video+audio的url_encoded_fmt_stream_map和用于video或audio分离stream的adaptive_fmts 。 每个链接都由两个部分组成:

  1. url=https:和之前的一切
  2. 从这一点到分隔河stream的(逗号)。

你应该了解的有关初始化块的知识是:有些参数可能会出现两次,你只能在请求中只保留一个副本。 您无法预测哪些参数可能会被删除,因此尽量在“原始”链接中包含您find的所有内容。 所有这一切的特殊部分是后端所要求的签名。 请注意,该签名可能出现在链接的第一或第二部分。

目前有三种types的签名:

  • signature – 这是一个简单的,不需要破译,不需要处理。
  • sig – encryption
  • s – encryption

有了这个块,玩家应该准备好每一个链接,并要求后端的streamselect。 这是通过连接所有现有的参数,不包括重复,并附加准备签名。

虽然您可以仔细查找所有可能的播放器版本,但这可能不是最佳解决scheme。 从应用程序下载播放器似乎更好,并从中提取精确的解码function。 这种方法将与任何YouTubevideo页面。

尽pipe你的决定,你仍然需要的function。 大多数情况下,这个function可能在这个RegEx中find

 set\("signature",\s*(?:([^(]*).*)\); 

使用任何格式化工具来阅读它的来源。 你会发现主函数使用一个加法,所以你应该提取它。 之后,在java或(我更喜欢)中实现函数是很容易的提取解码函数,并保持它。

简而言之:1.提取url_encoded_fmt_stream_mapadaptive_fmts 2.分割, 3.在播放器中find解码函数,并用你select的语言或解压缩和重新实现。

例如,这里是一个从http://s.ytimg.com/yts/jsbin/html5player-new-en_US-vflhlPTtB/html5player-new.js中提取的函&#x6570;

 var fs = { Q2: function (a, b) { a.splice(0, b) }, cK: function (a) { a.reverse() }, yy: function (a, b) { var c = a[0]; a[0] = a[b % a.length]; a[b] = c } }; function gs(a) { a = a.split(""); fs.yy(a, 40); fs.Q2(a, 3); fs.yy(a, 53); fs.yy(a, 11); fs.Q2(a, 3); fs.cK(a, 8); fs.Q2(a, 3); fs.yy(a, 16); fs.cK(a, 75); return a.join("") }; 

您无法从YouTube上下载video。 这是非法的。 您只能使用播放服务。

第4c节您同意不通过除本服务本身的video播放页面,embedded式播放器或YouTube指定的其他明确授权的方式以外的任何技术或手段访问内容。

我也search同types的东西,并find一些有用的链接,在一些video他们不是很好,但希望经过debugging或看到代码,你可以很容易地了解他们如何工作

我们了解:

1 – 这些代码下载观看video的基本元数据的链接2 – 根据格式(videoURL,质量)parsing该文件3-Decrypturl

http://www.codeproject.com/Tips/323771/YouTube-Downloader-Using-Csharp-NET https://github.com/flagbug/YoutubeExtractor