有些视频无法下载。
我使用此
获得了下载网址http://www.youtube.com/get_video_info?video_id=itGNQbJwRSk
有没有人为什么下面的网址无法下载?
总网址:
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
每个参数分隔的网址:
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
我在开放流中使用了以下代码
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。 我还找不到任何帮助。
有没有人有想法?
答案 0 :(得分:12)
此视频正在使用密码signatrue,您可以在http://www.youtube.com/get_video_info?video_id=itGNQbJwRSk返回的信息中看到
'use_cipher_signature=True'
要下载此类视频,首先必须解码它的签名。 解码算法存在于播放器文件(HTML5player或Flash播放器)
中解码后,您必须使用相同的IP地址从您获取所有信息的位置下载视频。 (您可以使用代理绕过相同的IP限制)
最好使用抓取特定视频的网页并搜索;ytplayer.config = {(.*?)};
。这包含所有必需的信息。
如果您不想刮擦,则可以使用以下方法获取JSON对象
https://www.youtube.com/watch?v=<Video-ID>&spf=prefetch
请检查此API以获得简单的解决方案:CipherAPI
另一个很酷的API:YTstream API
答案 1 :(得分:3)
简而言之: https://github.com/lure/YoutubeGrabber
长篇故事: 每个youtube视频页面都包含一个初始化html5播放器的js块。当然,也有一个Flash播放器,但JS更容易理解。
Streams位于两个参数中:url_encoded_fmt_stream_map
用于视频+音频合并,adaptive_fmts
用于视频或音频单独视频流。每个链接都由两个叫它的部分组成:
url=https:
和,
(逗号)的所有内容。 关于初始化块你应该知道的是:一些参数可能会出现两次,你必须在你的请求中只保留一个副本。您无法预测哪些参数可能会被淘汰,因此请尝试包含您在&#34; raw&#34;中找到的所有内容。链接。所有这些的特殊部分是后端所需的签名。请注意,该签名可能出现在链接的第一部分或第二部分中。
当前时间有三种类型的签名:
signature
- 这个很简单,不需要破译,不需要处理。sig
- 加密s
- 加密有了这个块,玩家应准备每个链接并请求后端选择流。它是通过连接所有现有的params(不包括重复项)并附加准备好的签名来完成的。
虽然您可以仔细查找所有可能的播放器版本,但这可能不是最佳解决方案。从您的应用程序下载播放器并从中提取精确的解码功能似乎更好。此方法适用于任何YouTube视频页面。
尽管你的决定,你仍然需要这个功能。大多数情况下,此功能可以通过此RegEx找到
set\("signature",\s*(?:([^(]*).*)\);
使用任何格式化工具来读取它。您会发现主要功能使用一个添加,因此您也应该提取它。之后,很容易在java中实现这个功能或者(我更喜欢)提取解密函数并保留它。
简短步骤:
1.提取url_encoded_fmt_stream_map
和adaptive_fmts
2.按,
分割
3.在播放器中找到解密功能,并用您选择的语言重新实现或提取eval
。
例如,这是从http://s.ytimg.com/yts/jsbin/html5player-new-en_US-vflhlPTtB/html5player-new.js
中提取的函数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("")
};
答案 2 :(得分:1)
您无法从youtube下载视频。这是非法的。您只能使用播放服务。
第4c条您同意不通过本服务视频播放页面,嵌入式播放器或YouTube可能指定的其他明确授权方式之外的任何技术或方式访问内容。
答案 3 :(得分:1)
我也搜索同样的东西并找到一些有用的链接,在某些视频上它们不是那么好但希望在调试后或看到代码你可以很容易地理解它们是如何工作的
我们理解:
1 - 这些代码从链接下载观看网址,这是视频的基本元数据 2 - 根据格式解析该文件(视频URL,质量) 3-Decrypt Urls
http://www.codeproject.com/Tips/323771/YouTube-Downloader-Using-Csharp-NET https://github.com/flagbug/YoutubeExtractor