一木禾网盘下载分析及批量获取下载地址的实现(下)
分析过后,我们接着来做一下代码实现
三、获取流程实现
近期正巧看到了木鱼在自己博客里发布的一个HTTP客户端库,困扰于原生HttpWebRequest的我立马就下来用了用,效果果然不错,所以本项目的HTTP请求就由
FSLib.Network 类库来完成,语法差别不大,不太懂的地方可以回复。
添加类库可以使用nuget:
Install-Package network.fishlee.net
下面来写通过展示地址来获得下载连接的方法:
private async void GetDownLoadUrl(string fileUrl) {//建立HTTP客户端var client = new HttpClient();//用于接收验证码 StringBuilder Result;//验证码的字符数组byte[] bytes;//用于接收下载链接string downPath = string.Empty;//通过正则匹配到链接中的 fileidint id = Convert.ToInt32(Extract(fileUrl, "\\d{7,}"));//有时会出现一级域名为ymhwp的情况,这里先做一下替换,以防不测fileUrl = fileUrl.Replace("ymhwp", "yimuhe");//创建展示页面请求var filecontext = client.Create<string>(HttpMethod.Get, fileUrl);//发送请求await filecontext.SendTask();if (filecontext.IsValid())//如果请求成功 {//替换链接中的fil为down,使其成为下载页面地址fileUrl = fileUrl.Replace("file", "down");//创建下载页面请求var downcontext = client.Create<string>(HttpMethod.Get, fileUrl);await downcontext.SendTask();if (downcontext.IsValid()){//设置初始返回值为0,表示验证码输入错误,即识别失败int response = 0;while (response == 0)//循环识别,直到识别成功 {//创建验证码图片请求var vcode = client.Create<Byte[]>(HttpMethod.Get, "http://www.yimuhe.com/n_downcode.php");await vcode.SendTask();if (vcode.IsValid()){//将获取到的验证码图片存入字节数组中bytes = vcode.Result;Result = new StringBuilder('\0', 256);//识别验证码GetVcodeFromBuffer(1, bytes, bytes.Length, Result);//创建检验验证码请求var resp = client.Create<string>(HttpMethod.Post,"http://www.yimuhe.com/n_downcode.php", data: "action=yz&id=" + id + "&code=" + Result);await resp.SendTask();if (resp.IsValid()){//返回验证码校验值、成功为1失败为0response = Convert.ToInt32(resp.Result);}}}//创建获取下载地址请求var h1 = client.Create<string>(HttpMethod.Post,"http://www.yimuhe.com/n_dd.php?file_id=" + id + "&ser=99", refer: "http://www.yimuhe.com/down-2546737.html", data: id.ToString());await h1.SendTask();if (h1.IsValid()){//通过HtmlAgilityPack库完成html解析,获得下载地址HtmlDocument html = new HtmlDocument();html.LoadHtml(h1.Result);downPath = html.GetElementbyId("downs").Attributes["href"].Value;tBAfter.AppendText(downPath + NewLine);}}} }
通过以上方法即可实现单个文件下载地址的获取。
四、批量获取实现
我的批量实现思路为将要获取的链接加入一个队列当中,线程从队头移出数据一条进行地址获取,获取成功不进行操作,失败则将地址添回到队尾。循环获取直到队列为空。另一个队列储存正在处理的数据,仅当两个线程均为空时才会陆续结束所有线程。线程执行的方法在上边的方法基础上又做了一些修改。
具体实现代码如下:
private async void GetDownLoadUrl() {//当链接队列和正在处理队列存在不为空时,循环执行以下代码while (_pathList.Count > 0 || _pathReady.Count > 0){//当链接队列不为空时if (_pathList.Count > 0){//从队头取出一条数据string fileUrl = _pathList[0];_pathList.RemoveAt(0);_pathReady.Add(fileUrl);//建立HTTP客户端var client = new HttpClient();//用于接收验证码 StringBuilder Result;//验证码的字符数组byte[] bytes;//用于接收下载链接string downPath = string.Empty;//通过正则匹配到链接中的 fileidint id = Convert.ToInt32(Extract(fileUrl, "\\d{7,}"));//有时会出现一级域名为ymhwp的情况,这里先做一下替换,以防不测fileUrl = fileUrl.Replace("ymhwp", "yimuhe");//创建展示页面请求var filecontext = client.Create<string>(HttpMethod.Get, fileUrl);//发送请求await filecontext.SendTask();if (filecontext.IsValid())//如果请求成功 {//替换链接中的fil为down,使其成为下载页面地址fileUrl = fileUrl.Replace("file", "down");//创建下载页面请求var downcontext = client.Create<string>(HttpMethod.Get, fileUrl);await downcontext.SendTask();if (downcontext.IsValid()){//设置初始返回值为0,表示验证码输入错误,即识别失败int response = 0;while (response == 0)//循环识别,直到识别成功 {//创建验证码图片请求var vcode = client.Create<Byte[]>(HttpMethod.Get, "http://www.yimuhe.com/n_downcode.php");await vcode.SendTask();if (vcode.IsValid()){//将获取到的验证码图片存入字节数组中bytes = vcode.Result;Result = new StringBuilder('\0', 256);//识别验证码GetVcodeFromBuffer(1, bytes, bytes.Length, Result);//创建检验验证码请求var resp = client.Create<string>(HttpMethod.Post,"http://www.yimuhe.com/n_downcode.php", data: "action=yz&id=" + id + "&code=" + Result);await resp.SendTask();if (resp.IsValid()){//返回验证码校验值、成功为1失败为0response = Convert.ToInt32(resp.Result);}}}//创建获取下载地址请求var h1 = client.Create<string>(HttpMethod.Post,"http://www.yimuhe.com/n_dd.php?file_id=" + id + "&ser=99", refer: "http://www.yimuhe.com/down-2546737.html", data: id.ToString());await h1.SendTask();if (h1.IsValid()){//通过HtmlAgilityPack库完成html解析,获得下载地址HtmlDocument html = new HtmlDocument();html.LoadHtml(h1.Result);downPath = html.GetElementbyId("downs").Attributes["href"].Value;//将获取到的地址显示到界面tBAfter.AppendText(downPath + NewLine);}}}//如果downPath为空,则请求失败if (string.IsNullOrWhiteSpace(downPath)){//将请求链接添回队尾 _pathList.Add(path);}//处理完毕,移出当前处理队列 _pathReady.Remove(path);}} }
到此程序就基本完成了,其他的细节,如识别类库载入等也不再赘述,有问题可以回复问我,新人发博客,排版很差,不好意思。
转载于:https://www.cnblogs.com/WayneShao/p/5175567.html
一木禾网盘下载分析及批量获取下载地址的实现(下)相关推荐
- 一木禾网盘下载分析及批量获取下载地址的实现(上)
最近因为一些个人原因用到了一木禾网盘,这个收费网盘虽然较一些国外的倒数30秒网盘容易了一些,也没有十分钟只能下载一个的限制,但如果下载资源较多还是显得十分麻烦 网上搜索了很长时间,找到一个52破解 c ...
- 百度网盘资源怎么分享群链接下载?
百度网盘是很多小伙伴都在使用的一款云存储软件,功能丰富且齐全,用户经常都会在这里分享交流文件资源,那要怎么在百度网盘分享群链接下载呢?下面小编就给大家带来详细的教程. 百度网盘资源怎么分享群链接下载? ...
- 百度网盘再次回收免费空间!21日前赶紧登录下!网友评:想钱想疯了?
周末在家闲来无事,拿出一本三国又品了品,读到其中有关鸡肋的那一段. 某夜行军打仗,杨修在曹营帐中,恰遇将领请示曹操行军令,曹操此时正食一鸡肋,烦躁的他扬了下手重的鸡肋说,"就拿这个做行军令吧 ...
- 百度网盘不开通会员5M/S下载方法
如果不设置的的话百度网盘下载的速度只有100多KB每秒限速十分严重.所以怎样不开通会员来获得高速下载呢? 首先打开百度网盘上的设置图标 点击进入设置 点击传输 然后点击开启下载提速(因为我是已经开启过 ...
- 【IDM+百度网盘助手】突破百度云下载限速,适用于谷歌浏览器【图文+附下载地址】
百度云下载限速实在是太坑了,能吃好多速度啊!话不多说,方法如下: 1.安装IDM--网址https://www.52pojie.cn/thread-681117-1-1.html 2.安装" ...
- 绝对良心提供百度网盘的jdk1.8源码下载包含sun包的
jdk目录下是有源码的,但是源码不包含sun包, 但是openjdk网站有提供的: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/6bfaecb8ff ...
- 2023 诚通网盘在线解析无广告高速下载网站源码
对于用户来说,上传下载应该是网盘最大的痛点.而上传资源网盘肯定不会做限制,因为上传的资源越多,网盘占的市场份额会越大,所以只能从下载方面入手. 1.所以现在除了阿里外,其他的网盘不付费那就是给你几十K ...
- 这可能是我使用百度网盘以来最好用的高速下载器了
我最近在Github上面发现了一个不错的下载器,走的是P2P的方法,所以不用担心被封号,而且下载速度和超级会员的下载速度几乎没有区别.今天就给大家来分享一下,大家可以偷偷藏起来以备不时之需. 「enf ...
- php获取百度真实网址,怎么从百度网盘的外链中获取真实的下载地址
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 第一步 http://pan.baidu.com/share/list?channel=chunlei&clienttype=0&web= ...
最新文章
- 旷视提Circle Loss,统一优化视角,革新深度特征学习范式 | CVPR 2020
- sdut 2087 离散事件模拟-银行管理
- Oracle日期函数和循环总结
- 关于input的change事件触发多次发解决
- 17-chmod命令
- 话筒增益_话筒啸叫怎么办?教你四个解决话筒啸叫的方法!
- tomcat如何部署.net程序_.NET 程序员如何学习Vue
- easyUI表单验证扩展
- struts mysql乱码_Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决
- 将自己电脑的SSH key添加到GitHub上
- Asp.Net母版页元素ID不一致的体现
- java 替换所有中文_java 替换中文
- Linux下的编辑器整理
- 打开并读取npy文件,查看文件内容
- 通达信软件里php文件在哪,通达信股票交易软件使用秘籍
- [Chrome插件开发]监听网页请求和响应
- 12款响应式 Lightbox(灯箱)效果插件
- Qt播放视频0x8007000e报错 DirectShowPlayerService::doPlay: Unresolved error code 0x8007000e
- 如何评价区块链论文?区块链相关学术会议级别大科普
- 逻辑回归实例,特征预处理