.net下载优酷1080P视频

其实流程大致是:调用飞驴下载API+js解析+文件下载+调用flvBind合并这样一个流程而已_(:з」∠)_

貌似是不用太多的说明。。嗯。。

起先的需求是从优酷上下载一些视频

不过网络上的各种软件 甚至是优酷自己的APP 都没有提供高清视频下载的功能

而且1080P视频本身对于优酷就是一种付费功能

只好自己DIY解决了=w=

一些模型类

class Youku {
	public string Url;
	public string Title;
	public string Quality;
	public int Count;
	public List<YoukuFlvFile> FlvUrls = new List<YoukuFlvFile>();
}

class YoukuFlvFile {
	public string FileName;
	public string FileUrl;
	public string LocalFileName;
}

调用API

这里本来想找飞驴的开发者中心要权限来的_(:з」∠)_ 可惜被拒了..

只好截获网站自带的ajaxAPI...

这里要首先把页面地址转化为base64url 转化方法可以参考飞驴的开发文档

函数返回的是一串js代码 做进一步解析

顺带 这个api频繁调用会失效 大概服务器自己也要解析一会才有返回值...

CookieContainer cookie = new CookieContainer();
string getJS(string videoUrl) {
	string vUrl64 = Base64Url(videoUrl);
	string urlTop = "http://www.flvxz.com/?url="+vUrl64;

	//访问API
	HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://www.flvxz.com/getFlv.php?url="+vUrl64);
	req.Referer = urlTop;
	req.Method = "get";
	req.Accept = "application/javascript, */*;q=0.8";
	req.Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-Hans-CN,zh-Hans;q=0.7,ja;q=0.3");
	req.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
	req.Host = "www.flvxz.com";
	//req.CookieContainer = cookie;
	HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
	StreamReader sr = new StreamReader(resp.GetResponseStream(),Encoding.UTF8);
	string result = sr.ReadToEnd();
	resp.Close();

	return result;
}

string Base64Url(string url) {
	url = url.Replace("://",":##");
	string vUrlBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(url));
	vUrlBase64 = vUrlBase64.Replace('+','-').Replace('=','_');
	return vUrlBase64;
}

JS解析获取flv下载地址

这个很蛋疼...返回的js是一大段eval语句 由多个flvout(html, id)函数调用组成

原本的飞驴页面则是直接执行这段js  而我们不得不用正则表达式解析...

事实上我的思路是使用Regex解析,结合SgmlReader对html格式化,最后用LINQ2XML进行抓取

算是很节省代码的一系列过程了。。

这里想仔细研究的话就自行分析DOM结构吧=w=

函数返回一个Youku实例 包含子flv文件的文件名和下载地址

Youku GetYoukuFiles(string youkuUrl) {
	Youku youku = new Youku();
	youku.Url = youkuUrl;
	string js = getJS(youkuUrl);
	Regex regex = new Regex(@"flvout\('(.+?)','(.+?)'\)");
	int idx = 0;
	foreach(Match m in regex.Matches(js)) {
		string html = string.Format("<html>{0}</html>", m.Result("$1"));
		MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(html));
		Sgml.SgmlReader r = new Sgml.SgmlReader();
		r.DocType = "html";
		r.StripDocType = true;
		r.InputStream = new StreamReader(ms);
		var xml = XElement.Load(r);

		var h4 = xml.XPathSelectElements("./div/div/h4").FirstOrDefault();
		if (h4 != null) {
			youku.Title = h4.Value;
		}
		string qua = xml.Elements("span").Skip(1).First().Value;
		if (qua.Contains("1080P")) {
			string count = xml.Elements("span").Skip(2).First().Value;
			youku.Quality = qua;
			youku.Count = Convert.ToInt32(count);

			var items = xml.Elements("a").Where(elem=> {
				var attrRel = elem.Attribute("rel");
				return attrRel != null && attrRel.Value=="noreferrer";
			}).Select(elem=>new {title = elem.Value, href = elem.Attribute("href").Value});

			foreach(var item in items) {
				var f = new YoukuFlvFile();
				f.FileName = item.title;
				f.FileUrl = item.href;
				youku.FlvUrls.Add(f);
			}
		}
		idx++;
	}

	return youku;
}

下载文件

直接WebClient的干活 它的好处是如果出现exception会自动删除下载一半的文件...

如果想支持断点续传请自己编写更多文字_(:з」∠)_

void Download0(Youku m) {
	var client = new WebClient();
	if(m.FlvUrls.Count>0) {
		string dir = Path.Combine(downloadDir, m.Title);
		if (!Directory.Exists(dir)) {
			Directory.CreateDirectory(dir);
		}

		//下载
		foreach(var file in m.FlvUrls) {
			file.LocalFileName = Path.Combine(dir, file.FileName);
			if (!File.Exists(file.LocalFileName)) {
				client.DownloadFile(file.FileUrl, file.LocalFileName);
				Console.WriteLine(file.FileName+" 下载完毕");
			} else {
				Console.WriteLine(file.FileName+" 文件已存在");
			}
		}
	}
}

合并flv

直接用flvBind命令行工具 省时省力

原来想用ffmpeg直接转成mp4来的 我已经疯了=w=

因为windows上使用管道的恶心程度和参数的问题只好放弃...

如果知道怎么调教ffmpeg解决“多个x264流合并而且不二次编码”的旷世难题一定教教我_(:з」∠)_ 简直虐心

void Combine0(Youku m) {
	ProcessStartInfo ps = new ProcessStartInfo(@"E:\Program files\ffmpeg-win64\bin\FlvBind.exe");
	ps.Arguments = string.Join(" ",
		new[]{ m.Title+".flv"}
		.Concat(m.FlvUrls.Select(f=>f.LocalFileName))
		.Select(str=>"\""+str+"\"")
	);
	ps.WorkingDirectory = downloadDir;
	var p = Process.Start(ps);
	p.WaitForExit();
	Console.WriteLine(m.Title+" 合并完成");
}

最后把上面的代码连上即可=w=

void Main()
{
	string url = "http://v.youku.com/v_show/id_XNzU4OTM0Njg0.html";
	for(int t=0;t<5;t++) {
		var m = GetYoukuFiles(url);
		if (m.FlvUrls.Count>0) {
			Download0(m);
			if (!File.Exists(Path.Combine(downloadDir, m.Title+".flv"))) {
				Combine0(m);
			}
		} else {
			Console.WriteLine("获取失败...3秒后重试");
			Thread.Sleep(3000);
		}
	}
}

string downloadDir = @"D:\2014Cj";

以上代码可以在win8x64 .net4.5  LINQPAD 4.48中正常执行

SgmlReader可以在csdn下载频道中找到

flvBind可以自行搜索 是一个很迷你的视频处理工具

时间: 2024-10-12 03:53:49

.net下载优酷1080P视频的相关文章

优酷视频下载,优酷真实地址解析

最近想下载优酷的视频,发现无法下载,,将经验共享,经过研究解决. 1.以前下载优酷上的视频,只需要到IE的临时文件夹里取.flv文件.在这方面进行了调整现在发现优酷,IE的临时文件里没有.flv文件了.那怎么办呢? 2.利用HttpAnalyzer查看视频的播放页面,获取视频源的下载地址,例如:http://202.102.77.150/020064030147B2AFEEBF4E001A2BBDA3AFA485-7E57-619D-5D47-D478FD50C857.flv,不过直接访问下载,

python3自动下载优酷视频小程序

我们一般都在优酷里看一些好玩的视频,有时候看到精彩的就想下载到本地保存起来留作纪念,在win下可以用维棠等软件下载,但苦了用linux的孩子们.尽管chrome和firefox的一些插件可以下载,但有时候下载下来是分段的视频,还要手动用ffmpeg合成一个视频太繁琐,而且用插件下载要点击好多次鼠标,太不符合linuxer的性格了哈~于是我用python3写了一个youkuDown.py,代码如下: [python] view plain copy import re import urllib.

优酷视频下载|优酷播放器下载

优酷网从上周开始,全站视频已经开始完美支持iPad和iPhone 4的在线视频播放服务.采用HTML5和HTTP Live Streaming技术,对苹果iOS系统实现全面的支持,并达到和PC上一样流畅而清晰的体验.这个举动势必掀起国内各大视频网站对HTML5支持的新高潮,同时对于为数众多的iPhone 4和iPad用户来说,绝对是个振奋人心的好消息.优酷视频下载链接软件介绍优酷视频是一个很好的视频软件在这个软件上支持在线和本地两种播放方式优酷中有视频的推荐和视频的搜索播放下载等很多的强大的功能

怎么用硕鼠下载优酷专辑

大家都有在优酷或者土豆上下载视频教程的经历吧?想自学或者补习某一科目的人很多,可是优酷上的专辑和土豆上的豆单这样的一大堆视频还是很不容易下载到手的.今天就给大家介绍一个比较有效率的办法,至少不用一个地址一个地址地获取然后右键另存为了. 方法/步骤 1 以在优酷上下载电子科大47集的<电路分析基础>为例.其专辑页面地址为http://www.youku.com/playlist_show/id_2312805.html(注意:一定是专辑首页地址,别弄第一集的播放地址)   复制下来之后前往FLV

手动抓取爱奇艺和优酷等视频网站的视频

今天就给大家讲讲怎么手动抓取爱奇艺和优酷等视频网站的视频该方法适用于很多视频网站.因为有的网站不支持我们用一些软件比如硕鼠和维棠等的解析下载,所以我就找到了这个方法,本来优酷之前是可以的,不过现在优酷还是不支持硕鼠和维棠的解析了.这两个网页是原帖的地址,其实我之前知道这个方法,不过这个人提供了一个软件比较好用,我把他录制的视频提取出来了,下面看看吧. 其实原理都是一样,这些视频网站为了让视频更快的缓存,当然也有很多其他原因,把视频分成了很多段,所以我们只需要单独下载好每一段视频,然后把这些视频合

优酷m3u8视频源地址获取失败

昨天和今天上午,优酷网站视频完全没有办法播放,但是我是获取的优酷视频的视频原地址,所以app还是可以正常播放并且有下载功能.今天下午开始,优酷视频网页可以访问了,但是视频原地址却不在了.我所有的app的视频目前都是播放不了了.求办法,可以获取优酷目前视频原地址的办法.不是之前的那视频ID就是可以了,希望得到有用的答案,谢谢, 另外告诉将要做优酷视频下载的伙伴们,目前网上的教程全部失效,目前我还木有找到合适的办法,找到了会继续公布, 优酷m3u8视频源地址获取失败

从手淘搜索到优酷短视频,阿里巴巴是如何在搜索推荐领域下应用深度学习的?

摘要:深度学习是一个既可以处理特征.学习特征又可以实现最后的排序打分的一套整体解决方案,借助深度学习的解决方案,搜索推荐的工作方式将发生巨大的变化.想知道阿里巴巴如何将在搜索推荐领域下应用深度学习技术的吗?想知道手淘和优酷搜索结果的个性化又是如何实现的吗?本文不容错过! 本节视频地址:http://click.aliyun.com/m/48161/ PDF下载:http://click.aliyun.com/m/49207/ 演讲嘉宾简介: 孙修宇(花名:翎翀),阿里巴巴机器智能技术实验室算法专

优酷真实视频地址解析2015-11-24

11月24日起优酷视频破解算法又发生了变化,相比以前几个月改一次,这个算法维持了1年多,也算是蛮良心的,23333. 今早起来发现优酷的视频都播不了了,一查究竟,原来是算法中的一步又改了.目前优酷视频源算法基本还是沿用3shi和这位大大的思路,请详细阅读<优酷真实视频地址解析——2014年10月7日> 当然,到2015年11月24日,算法中第二步“获取视频元信息”的请求API: http://v.youku.com/player/getPlayList/VideoIDS/{vid}/Pf/4/

ios UIWebView 播放优酷土豆视频

将下面的代码嵌套在html里,然后webView加载这个网页.或这段html码,就行了,无需要使用像网上说的html5去兼容 ios UIWebView 播放优酷土豆视频