.net下載優酷1080P視頻

來源:互聯網
上載者:User

標籤:http   io   os   使用   ar   java   for   檔案   sp   

其實流程大致是:調用飛驢下載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;//訪問APIHttpWebRequest 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解析...

事實上我的思路是使用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可以自行搜尋 是一個很迷你的視頻處理工具

.net下載優酷1080P視頻

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.