事实上流程大致是:调用飞驴下载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频繁调用会失效 大概server自己也要解析一会才有返回值...

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能够自行搜索 是一个非常迷你的视频处理工具

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

  1. 视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频

      视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频  2018-07-11 |  标签»下载, 下载工具, 视频 又是视频下载,老生常谈的话题.阿刚同学已在乐软博客多次与大家分享推荐 ...

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

    我们一般都在优酷里看一些好玩的视频,有时候看到精彩的就想下载到本地保存起来留作纪念,在win下可以用维棠等软件下载,但苦了用linux的孩子们.尽管chrome和firefox的一些插件可以下载,但有 ...

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

    昨天和今天上午,优酷站点视频全然没有办法播放,可是我是获取的优酷视频的视频原地址,所以app还是能够正常播放而且有下载功能.今天下午開始,优酷视频网页能够訪问了,可是视频原地址却不在了.我全部的app ...

  4. 破解优酷VIP视频

    目录 一 破解优酷VIP视频 一 破解优酷VIP视频 import requests import re import json HEADERS = { 'user-agent': 'Mozilla/ ...

  5. dede后台添加优酷等视频iframe链接时被替换成了图片

     添加文章时 添加优酷视频 :<iframe height=498 width=510 src='http://player.youku.com/embed/XNDAzNTAzODE4OA==' ...

  6. 优酷1080p的kux格式文件怎么转换为MP4格式?

    直接使用优酷自己的FFMPEG解码! 格式为:"优酷ffmpeg.exe的安装地址" -y -i ".kux文件储存地址" -c:v copy -c:a cop ...

  7. 优酷1080p的kux格式文件转码

    @echo off for /r . %%i in (*.kux) do ( "C:\Program Files (x86)\YouKu\YoukuClient\nplayer\ffmpeg ...

  8. 爬虫(三)解析js,抓取优酷免费视频的真实播放地址

    工具:google浏览器 + fiddler抓包工具 说明:这里不贴代码,[只讲思路!!!] 原始url = https://v.youku.com/v_show/id_XMzIwNjgyMDgwOA ...

  9. 在html里网页中嵌入优酷的视频

    <html> <embed src="http://player.youku.com/player.php/sid/XMjAzOTk4NjI4/v.swf" qu ...

随机推荐

  1. 1.lombok系列1:初识lombok

    转自:https://www.imooc.com/article/18156 初识lombok 官网:https://projectlombok.org/ 什么是lombok 连官网都懒得废话,只给出 ...

  2. mahout算法库(四)

    mahout算法库 分为三大块 1.聚类算法 2.协同过滤算法(一般用于推荐) 协同过滤算法也可以称为推荐算法!!! 3.分类算法 算法类 算法名 中文名 分类算法               Log ...

  3. JavaScript的字符串、数组以及DOM操作总结

    (一)JavaScript字符串操作 JavaScript的字符串就是用' '或" "括起来的字符表示,日常的学习中有时候需要对字符串进行相关的操作.例如要获取字符串某个指定位置的 ...

  4. atxserver2安装与使用

    atxserver2的使用 1.首先clone atxserver2代码,此时使用pip3 install requirements后执行python main.py 会提示“ [WinError 1 ...

  5. Direct2D 图形计算

    D2D不仅可以绘制,还可以对多个几何图形对象进行空间运算.这功能应该在GIS界比较吃香. 这些计算包括: 合并几何对象,可以设置求交还是求并,CombineWithGeometry 边界,加宽边界,查 ...

  6. 洛谷 P1032 字符变换

    洛谷 P1032 字符变换 题目描述 已知有两个字串 A,B 及一组字串变换的规则(至多 6 个规则): A1​ -> B1​ A2​ -> B2​ 规则的含义为:在 A 中的子串 A1​ ...

  7. method initializationerror not found:JUnit4单元測试报错问题

           今天使用JUnit 4进行单元測试时,測试程序一直执行不起来,报method initializationerror not found错误.例如以下:            网上说版本 ...

  8. HDU 3584 Cube (三维树状数组)

    Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the nu ...

  9. GIT,SVN,CVS的区别比较

    Git .CVS.SVN比较 项目源代码的版本管理工具中,比较常用的主要有:CVS.SVN.Git 和 Mercurial  (其中,关于SVN,请参见博客:SVN常用命令 和 SVN服务器配置) 目 ...

  10. Centos7安装.Net Core 2.2环境以及部署.Net Core MVC程序(Apache+Jexus环境)

    原文:Centos7安装.Net Core 2.2环境以及部署.Net Core MVC程序(Apache+Jexus环境) 1.双11抢购***VPS.配置如下: CPU:2 核 内存:2048 M ...