广东技术师范学院校园网电影下载器

环球面试完了,等通知中。。。怕怕。。。看书看不下去,想下电影珍藏,无奈校园网可看不可下,既然他不仁,那我也不义了。。。

打开网页,想分析他网页的源码,竟然禁止了右键菜单。。。哈哈,没关系,我有强大的Firefox。。。

图片

文件的地址一览无遗。。。但是,却发现有两个服务器地址?到底是哪个呢?(感谢小明,直接告诉了我,哈哈),如图。

文件的地址由两个URL各取一部分组成。

我们可以用正则表达式来把URL取出并拼凑(很多网络爬虫用此方法抓取url),代码如下:

 

        //根据URL获取网页的源码,并根据网页编码自动转码

        private string getHtmlScourse(string url)

        {

            try

            {

                WebClient wc = new WebClient();

                wc.Credentials = CredentialCache.DefaultCredentials;

                byte[] pageDate = wc.DownloadData(txtURL.Text.Trim());

                string strWebData = Encoding.Default.GetString(pageDate);

                Match charSetMatch = Regex.Match(strWebData, "<meta([^<]*)charset=([^<]*)\"",RegexOptions.IgnoreCase | RegexOptions.Multiline);

                string webCharSet = charSetMatch.Groups[2].Value;

                if (Encoding.GetEncoding(webCharSet) != Encoding.Default)

                    strWebData = Encoding.GetEncoding(webCharSet).GetString(pageDate);

                return strWebData;

            }

            catch (Exception e)

            {

                return "URL无法连接";

            }

        }

 

        //取出网页中资源的地址

        private List<string> getUrls(string html)

        {

            string regex = "(/)[^>]*[^/].(?:jpg|bmp|gif|rmvb|avi|mov|wmv|3gp|flv|mp4|mp3)(?:\"|\')";

            Regex rg = new Regex(regex);

            MatchCollection mc = rg.Matches(html);

            System.Collections.IEnumerator enu = mc.GetEnumerator();

            List<string>urls=new List<string>();

            while (enu.MoveNext() && enu.Current != null)

            {

                Match match=(Match)(enu.Current);

                urls.Add(match.Value);

            }

            return urls;

        }

这两个方法能取出两个URL(一个为服务器地址,一个有文件名),接下来对两个URL进行处理,代码如下:

 

 

  List<string> urls=getUrls(getHtmlScourse(txtURL.Text.Trim()));

 

  if (urls.Count > 2)

 

  {

 

        string serviceAdd=urls[0];

 

        string filmName=urls[1];

 

        serviceAdd = serviceAdd.Substring(2, serviceAdd.LastIndexOf('/')-2);

 

        int filmLenght=filmName.LastIndexOf('/');

 

        filmName = filmName.Substring(filmLenght,filmName.Length-filmLenght-1);

 

        llbUrl.Text = "http://" + serviceAdd + filmName;

 

   }

 

将拼凑好的URL给一个LinkLabel控件,并给该LinkLabel控件加点击事件:

 

 

 

  private void llbUrl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)

 

        {          

 

      string target = llbUrl.Text;

 

            if (target != null && target.StartsWith("http://"))

 

            {

 

                System.Diagnostics.Process.Start(target);

 

            }

 

            else

 

            {

 

                MessageBox.Show("Item clicked: " + target);

 

            }

 

        }

 

点击LinkLabel时,就可以直接调用浏览器来下载文件(但仅在chrome,filefox,opera,ie8上试过,其他浏览器不详)

 

图片

 

点击直接下载。如下图:

 

图片

 

你没装浏览器?OK,有备用方案。

 

图片

 

 

 

 

 

根据上图提示,填入相应参数,点击下载就可以,如下图:

 

图片

 

 

哈哈。这样就可以肆无忌惮的狂下校园网的资源啦~~下载的代码也分享一下:

 

    // <summary>

        /// 下载带进度条代码(普通进度条)

        /// </summary>

        /// <param name="URL">网址</param>

        /// <param name="Filename">文件名</param>

        /// <param name="Prog">普通进度条ProgressBar</param>

        /// <returns>True/False是否下载成功</returns>

        public bool DownLoadFile(string URL, string strLocalDirPath,int Velocity, ProgressBar Prog)

        {

            try

            {

                string fileName = URL.Substring(URL.LastIndexOf("/"));

                string Path = strLocalDirPath + fileName;

                System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); //URL地址得到一个WEB请求  

                System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); //WEB请求得到WEB响应  

                long totalBytes = myrp.ContentLength; //WEB响应得到总字节数  

                Prog.Maximum = (int)totalBytes; //从总字节数得到进度条的最大值  

                System.IO.Stream st = myrp.GetResponseStream(); //WEB请求创建流(读)  

                System.IO.Stream so = new System.IO.FileStream(Path, System.IO.FileMode.Create); //创建文件流(写)  

                long totalDownloadedByte = 0; //下载文件大小  

                int V = 1024 * Velocity;

                byte[] by = new byte[V];

                int osize = st.Read(by, 0, (int)by.Length); //读流  

                while (osize > 0)

                {

                    totalDownloadedByte = osize + totalDownloadedByte; //更新文件大小  

                    Application.DoEvents();

                    so.Write(by, 0, osize); //写流  

                    Prog.Value = (int)totalDownloadedByte; //更新进度条  

                    osize = st.Read(by, 0, (int)by.Length); //读流  

                }

                so.Close(); //关闭流

                st.Close(); //关闭流

                return true;

            }

            catch

            {

                return false;

            }

        }

 

下载按钮的点击事件:

 

        private void button1_Click(object sender, EventArgs e)

        {

            int V = 5;

            if (txtV.Text != "" && txtV.Text != null)

            {

                try

                {

                    V = Convert.ToInt32(txtV.Text);

                }

                catch (Exception ex)

                {

                    V = 5;

                }

            }

            if (DownLoadFile(llbUrl.Text, txtDir.Text, V, pbDownload))

            {

                MessageBox.Show("下载完成!");

            }

        }

 

当然,因为下载速度太大(实验最高为20M/s左右),所以如果每个人都使用的话校园网服务器一定承受不了,所以,下载要选在夜深人静的时候(建议是2~3点)。。。

有同学使用后跟我说,没有取消的功能,所以改进了这个不足,对程序进行了修改,增加了取消的功能:

图片

代码也做了调整,将读写流,文件全路径定义为全局变量,使得它们的生命周期可控,下面是取消按钮的单击事件:

 

    try

 

            {

 

                so.Close(); //关闭流

 

                st.Close(); //关闭流

 

                if (File.Exists(Path))

 

                {

 

                    File.Delete(Path);

 

                }

 

                pbDownload.Value = 0;

 

                MessageBox.Show("下载以停止,并成功删除下载文件");

 

            }

 

            catch (Exception ex)

 

            {

 

                MessageBox.Show("下载无法停止,可先关闭窗口,并在任务管理器中结束该进程");

 

            }

 

 

呵呵,希望同学们下载愉快~~

下载地址:http://www.rayfile.com/zh-cn/files/2ee345e3-a9f6-11e0-8965-0015c55db73d/

posted @ 2011-07-31 20:41  三度空间  阅读(683)  评论(2编辑  收藏  举报