分析过后,我们接着来做一下代码实现

三、获取流程实现

近期正巧看到了木鱼在自己博客里发布的一个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

一木禾网盘下载分析及批量获取下载地址的实现(下)相关推荐

  1. 一木禾网盘下载分析及批量获取下载地址的实现(上)

    最近因为一些个人原因用到了一木禾网盘,这个收费网盘虽然较一些国外的倒数30秒网盘容易了一些,也没有十分钟只能下载一个的限制,但如果下载资源较多还是显得十分麻烦 网上搜索了很长时间,找到一个52破解 c ...

  2. 百度网盘资源怎么分享群链接下载?

    百度网盘是很多小伙伴都在使用的一款云存储软件,功能丰富且齐全,用户经常都会在这里分享交流文件资源,那要怎么在百度网盘分享群链接下载呢?下面小编就给大家带来详细的教程. 百度网盘资源怎么分享群链接下载? ...

  3. 百度网盘再次回收免费空间!21日前赶紧登录下!网友评:想钱想疯了?

    周末在家闲来无事,拿出一本三国又品了品,读到其中有关鸡肋的那一段. 某夜行军打仗,杨修在曹营帐中,恰遇将领请示曹操行军令,曹操此时正食一鸡肋,烦躁的他扬了下手重的鸡肋说,"就拿这个做行军令吧 ...

  4. 百度网盘不开通会员5M/S下载方法

    如果不设置的的话百度网盘下载的速度只有100多KB每秒限速十分严重.所以怎样不开通会员来获得高速下载呢? 首先打开百度网盘上的设置图标 点击进入设置 点击传输 然后点击开启下载提速(因为我是已经开启过 ...

  5. 【IDM+百度网盘助手】突破百度云下载限速,适用于谷歌浏览器【图文+附下载地址】

    百度云下载限速实在是太坑了,能吃好多速度啊!话不多说,方法如下: 1.安装IDM--网址https://www.52pojie.cn/thread-681117-1-1.html 2.安装" ...

  6. 绝对良心提供百度网盘的jdk1.8源码下载包含sun包的

    jdk目录下是有源码的,但是源码不包含sun包, 但是openjdk网站有提供的: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/6bfaecb8ff ...

  7. 2023 诚通网盘在线解析无广告高速下载网站源码

    对于用户来说,上传下载应该是网盘最大的痛点.而上传资源网盘肯定不会做限制,因为上传的资源越多,网盘占的市场份额会越大,所以只能从下载方面入手. 1.所以现在除了阿里外,其他的网盘不付费那就是给你几十K ...

  8. 这可能是我使用百度网盘以来最好用的高速下载器了

    我最近在Github上面发现了一个不错的下载器,走的是P2P的方法,所以不用担心被封号,而且下载速度和超级会员的下载速度几乎没有区别.今天就给大家来分享一下,大家可以偷偷藏起来以备不时之需. 「enf ...

  9. php获取百度真实网址,怎么从百度网盘的外链中获取真实的下载地址

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 第一步 http://pan.baidu.com/share/list?channel=chunlei&clienttype=0&web= ...

最新文章

  1. 旷视提Circle Loss,统一优化视角,革新深度特征学习范式 | CVPR 2020
  2. sdut 2087 离散事件模拟-银行管理
  3. Oracle日期函数和循环总结
  4. 关于input的change事件触发多次发解决
  5. 17-chmod命令
  6. 话筒增益_话筒啸叫怎么办?教你四个解决话筒啸叫的方法!
  7. tomcat如何部署.net程序_.NET 程序员如何学习Vue
  8. easyUI表单验证扩展
  9. struts mysql乱码_Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决
  10. 将自己电脑的SSH key添加到GitHub上
  11. Asp.Net母版页元素ID不一致的体现
  12. java 替换所有中文_java 替换中文
  13. Linux下的编辑器整理
  14. 打开并读取npy文件,查看文件内容
  15. 通达信软件里php文件在哪,通达信股票交易软件使用秘籍
  16. [Chrome插件开发]监听网页请求和响应
  17. 12款响应式 Lightbox(灯箱)效果插件
  18. Qt播放视频0x8007000e报错 DirectShowPlayerService::doPlay: Unresolved error code 0x8007000e
  19. 如何评价区块链论文?区块链相关学术会议级别大科普
  20. 逻辑回归实例,特征预处理

热门文章

  1. 华为云Stack在政务云市场,稳!
  2. Error LNK2005:_main already defined in test.obj
  3. Cocos2d-x 游戏中子弹的设计 (一)
  4. 看最近国内名人们对四川地震灾区的捐款
  5. 编译原理 实验2 语法分析器的构造
  6. android 判断是否为系统应用
  7. 全国计算机一级第七套试题及答案,计算机一级考试第七套试卷及答案.doc
  8. 小谈 - web模仿手机打电话与正则表达式
  9. 1D/1D动态规划学习总结
  10. BatchNorm1d