您的位置:首页 > 编程语言 > C#

Btspread Search Assistant的开发过程

2016-01-29 23:28 513 查看
-————————————————2016年3月1日更新————————————————

现在btspread已经不能用了,哥准备换掉神器里面的btspread搜索方法,换上btdigg和torrentkitty的搜索函数,大家敬请期待.

————————————————2016年1月30日更新————————————————

其实这货有个bug.

文件名File Name没办法显示中文字符,有时候还提取不到.真是日了狗了.

大家有空的话可以到github上面follow一下不,帮我解决掉这个bug.

————————————————2016年1月30日更新————————————————

上次我不是在我的博客里面弄了发布了一个用C#写的搜片神器么,说起这货的诞生,我还得感谢我那巨懒得老爸。

皇上曰:我要看片!

于是有了片。(略过途中各种艰难的手动搜片过程)

怎么可以这么麻烦啊,于是我就写了个软件,专门为搜片而生。

————————————————我是萌萌哒的分割线————————————————

其实上面只是一个开头,大家不要认为我写个文章就是专门来吐槽父皇大人的。

放代码才是最关键的事情好不。

————————————————我是萌萌哒的分割线————————————————

先上设计流程:

1.从搜索框得到搜索关键字

        |

2.得到btspread的链接数组

        |

3.分析此数组所指向的各个网页的源代码,得到包含磁链链接的那个网页

        |

4.分析这些网页,得到磁力链啊接

        |

5.么么哒

————————————————我是萌萌哒的分割线————————————————

这个案例的核心就在于获取网页源代码,以及获取网页源代码之后用正则表达式匹配得到所需的磁力链接.

重点一,提取网页链接列表:

我们先看看怎么获取上图步骤二的链接:

我们在这个网站下面就可以搜索片源:

http://www.bt2mag.com/search/
(不要告诉我你这个都不知道怎么找到的)

我以搜007幽灵党为例,我们能在网页源代码里面找到以下语句:

<a href="http://www.bt2mag.com/magnet/detail/hash/568901DB746FA104341C76908DBD5A733C8732A2" title="[www.hdmayi.com][007:幽灵党][1080P.BD-RMVB][中英文字幕]">

这里
<a href="到"之间的内容就是我们要提取的第一个网址

那我们可以用正则表达式:

@"(?<=hash/).*?(?="")"

来得到hash嘛,之后就把:

http://www.bt2mag.com/magnet/detail/hash/

加在前面就可以了.所有的搜索链接都提取到一个字符数组里面,方便提取下一步的网页源代码

重点二,提取列表里面每一个网页所包含的磁力链接:

我们分析一下所有的网页源代码,都可以发现一段类似于:

<a id="magnetDownload" href="magnet:?xt=urn:btih:568901DB746FA104341C76908DBD5A733C8732A2&dn=%5Bwww.hdmayi.com%5D%5B007%EF%BC%9A%E5%B9%BD%E7%81%B5%E5%85%9A%5D%5B1080P.BD-RMVB%5D%5B%E4%B8%AD%E8%8B%B1%E6%96%87%E5%AD%97%E5%B9%95%5D"

的语句.这就是我们所要提取的磁力链接.

那么,我们就可以用正则表达式匹配

<a id="magnetDownload" href="magnet:?xt=urn:btih:到"之间的内容


正则表达式:

@"(?<=readonly>).*?(?=</textarea>)"

把提取到某一个字符数组里面放好.

同理:

用@"(?<=Content Size:</div><div class=""col-md-10 col-sm-9 value"">).*?(?=</div>)"得到File Size

用@"(?<=</div>        <h3>).*?(?=</h3>)"得到File Name

之后就是显示了,这就不在赘述.

————————————————我是萌萌哒的分割线————————————————

参考资料,感谢以下资料的原作者

正则表达式学习网址:
http://www.cnblogs.com/youring2/archive/2009/11/07/1597786.html
获取源代码的三种方法:
http://www.cnblogs.com/zjfree/archive/2011/03/10/1980325.html
————————————————我是萌萌哒的分割线————————————————

面的大家又要上Github,又要开VS,我就在这里上代码了:

Github地址:https://github.com/K9A2/BtSpread_Assistant

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace 疯狗的神器
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public static string BTS_Link = "http://www.bt2mag.com/search/";                         //btspread的搜索地址
public static string BTS_Hash_Reg = @"(?<=hash/).*?(?="")";                              //求hash的正则表达式
public static string BTS_Hash_Link = "http://www.bt2mag.com/magnet/detail/hash/";        //包含磁力链接的网页的开头
public static string BTS_Mag_Reg = @"(?<=readonly>).*?(?=</textarea>)";                  //求mag的正则表达式
public static string BTS_Get_File_Size = @"(?<=Content Size:</div><div class=""col-md-10 col-sm-9 value"">).*?(?=</div>)";
//求文件大小
public static string BTS_Get_File_Name = @"(?<=</div>		<h3>).*?(?=</h3>)";          //求文件名

private void button1_Click(object sender, EventArgs e)
{
textBox2.Clear();                                                                    //清除结果框里面的所有搜索结果
string key = textBox1.Text.ToString();                                               //获取搜索关键字
string searchlink = BTS_Link + key;                                                  //获取搜索链接
string[] links = getLinksList(searchlink);                                           //获取网页链接列表
string[] maglinks = getFinalLinks(links);
4000
//获取磁力链接列表
for (int i = 0; i < maglinks.Length; i++)                                            //输出磁力链接列表
{
textBox2.AppendText(maglinks[i] + Environment.NewLine + Environment.NewLine);
}
}

public static string[] getFinalLinks(string[] linklist)
{
//用于在指定的页面获取磁力链接
//获取网页源代码
string[] finallinks = new string[linklist.Length];
string strHtml = "";
for (int i = 0; i < linklist.Length; i++)
{
//得到网页源代码
strHtml = getHtmlCode(linklist[i]);
//正则表达式匹配,得到文件名
Match name = Regex.Match(strHtml, BTS_Get_File_Name);
finallinks[i] = finallinks[i] + "----File Name:" + Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(name.ToString())) + "----";
//正则表达式匹配.得到文件大小
Match size = Regex.Match(strHtml, BTS_Get_File_Size);
finallinks[i] = finallinks[i] + "File Size:" + size.ToString() + "----" + Environment.NewLine;
//正则表达式匹配,得到磁力链接
Match link = Regex.Match(strHtml, BTS_Mag_Reg);
finallinks[i] = finallinks[i] + link.ToString();
}
return finallinks;
}

public static string[] getLinksList(string link)
{
//用于在搜索页面获取包含磁力链接的所有网页链接列表
//获得网页源代码
string strHTML = getHtmlCode(link);
//正则表达式匹配hash,获得此资源所有磁力链接页面
MatchCollection mc = Regex.Matches(strHTML, BTS_Hash_Reg);
//获得对应的网页数组
string[] linklist = new string[mc.Count];
for (int i = 0; i < mc.Count; i++)
{
linklist[i] = BTS_Hash_Link + mc[i];
}
return linklist;
}

public static string getHtmlCode(string link)
{
//获取指定页面的源代码,并返回包含此页面源代码的一个字符串
string strHTML;
Uri uri = new Uri(link);
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);
myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
myReq.Accept = "*/*";
myReq.KeepAlive = true;
myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
HttpWebResponse result = (HttpWebResponse)myReq.GetResponse();
Stream receviceStream = result.GetResponseStream();
StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("gb2312"));
strHTML = readerOfStream.ReadToEnd();
readerOfStream.Close();
receviceStream.Close();
result.Close();
//返回网页源代码
return strHTML;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息