[搜片神器]使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器:http://www.sosobta.com 大家可以给提点意见...
出售商业网站代码,万元起,非诚勿扰,谢谢. 联系h31h31 at 163.com
先直接上程序界面,了解整体工作流程是什么样子的,求服务器进行挂机测试,需要固定IP,空间大概需要10G左右(主要是BT种子占用空间过大),最好有SQLSERVER来做为存储数据库,目前采用的是ACCESS数据库做为测试,怕后期数据过百万,对网站进行查询操作很慢。
如果程序运行的时间够长,基本上网络上的种子都会过来,相当于搜片神器了.
开源地址:https://github.com/h31h31/H31DHTMgr
程序下载:H31DHT下载

也提供ASP网站的访问模式:

正在运行中的状态:

本次主要介绍对DHT磁力搜索的HASH文件进行处理操作流程。
后台处理程序主要采用C#里面读取文件类来进行读取,目前文件格式分为两种,一种是从http://torrage.com/sync下载回来的文件进行处理,

另外一种是采用C++程序对DHT网络中的HASH文件进行搜索存储的自定义文件,

里面有HASH值和时间IP等信息,可以通过这些IP值分析出对方电脑上有哪些BT文件,当然这里面的HASH值对应的文件对应的可是当前活跃在网络上的文件,与上面网站上下载的固定的文件值有区别,
有了这些IP值,个人也可以做些行为分析方面的工作,比如哪些城市的IP在下载些什么类型的文件。
下面介绍下数据库方面的设计工作:
1.初步考虑到SQLSERVER对自己电脑工作速度会有影响,没有安装SQLSERVER数据库,采用ACCESS来进行处理操作;
2.ACCESS数据库每个表的大小最好控制不要超过4G,所以设计每表不超过100百万条数据;
3.对BT种子文件进行解析后,提取里面的文件名字,按照文件类型存储到不同的表中,主要分为6大类,电影,音乐,图片,书箱,程序,其它类,
4.由于BT种子里面语言对应的不一样,有中文,英文,日文,韩国等语言,对于搜索界面如果全部存储到一块,没有什么问题,但会影响查询速度,因为中国人一般喜欢用中文查询,如果想查日文,对选项进行选择一下,这样会对所有的表查询都会有很大提高,因为每个表的文件都基本上针对几种语言;
5.对于BT种子里面的文件列表直接采用100百万一个表,如果超过了,直接存储第二块表,因为主表里面有存储自己的文件列表在哪个表的关键字段;
6.另外对数据库信息也比较严谨一些,由于种子文件里面有很多广告信息,比如视频种子里面经常有网站URL,TXT,MHT等信息链接,程序经过初步判断直接不存储到文件表数据库中,占用数据库空间,影响查询速度,另外查询出来显示列表也不好看.
7.对于一个种子里面经常有>200多个的种子文件也没有进行存储,一个种子有很多文件也比较浪费空间,再说这种种子保存下来基本上都没什么意义,直接PASS;
8.对于文件名里面有网站信息的也采取的过滤措施,对查询有很好帮助.
数据库表设计列表:

存储DHT文件名字的表:

存储种子文件列表:

--------------------------下面先介绍一下DHT的工作原理--------------------------------
DHT网络本质上是一个用于查询的网络,其用于查询一个资源有哪些计算机正在下载。每个资源都有一个20字节长度的ID用于标示,称为infohash。当一个程序作为DHT节点加入这个网络时,就会有其他节点来向你查询,当你做出回应后,对方就会记录下你。对方还会询问其他节点,当对方开始下载这个infohash对应的资源时,他就会告诉所有曾经询问过的节点,包括你。这个时候就可以确定,这个infohash对应的资源在这个网络中是有效的。
关于这个网络的工作原理,参看Kevin写的:P2P中DHT网络爬虫以及写了个磁力搜索的网页。
获取到infohash后能做什么?关键点在于,我们现在使用的磁力链接(magnet url),是和infohash对应起来的。也就是拿到infohash,就等于拿到一个磁力链接。但是这个爬虫还需要建立资源的信息,这些信息来源于种子文件。种子文件其实也是对应到一个资源,种子文件包含资源名、描述、文件列表、文件大小等信息。获取到infohash时,其实也获取到了对应的计算机地址,我们可以在这些计算机上下载到对应的种子文件。
在获取到infohash后,从一些提供映射磁力链到种子文件服务的网站上直接下载了对应的种子。
http://torrage.com
https://zoink.it
http://bt.box.n0808.com
-------------------------我们后台处理程序就从上面进行种子的下载工作---------------------------
下面重点介绍下我们程序的模块设计:

1.H31SQL类主要方面进行ACCESS和SQLSERVER数据库操作进行初步封装的一个类;
2.H31Debug主要是日志输出类
3.H31Down主要是下载BT种子文件进行的类;
4.TorrentFile类是用来解析BT种子文件类,由于目前可能有的BT种子格式对不上,有些文件解析不上;
5. MainForm主程序界面。
------------------------------------
下面介绍程序处理数据的主要流程:
1.读取本地文件,采用正则表达式对数据进行提取
/// <summary>
/// 正则表达式取出内容 2013-07-16
/// </summary>
private int GetHashLineContent(string hashline, ref HASHITEM item1)
{
if (hashline.Length < 50)
{
if (hashline.Length == 40)
{
item1.hashKey = hashline.Trim();
item1.recvTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
item1.recvIp = "127.0.0.1";
item1.recvPort = 8080;
return 1;
}
else
{
int a = 0;
}
}
else
{
string pattern = @"ash\[(.*)\] Time\#(.*)\# ip\:(.*)\:(.*)\.";
Match usermatch = Regex.Match(hashline, pattern, RegexOptions.IgnoreCase);
if (usermatch.Groups.Count == 0)
{
pattern = @"ash\[(.*)\] Time\#(.*)\# ip\:(.*)\:(.*)\.(.*)\#";
usermatch = Regex.Match(hashline, pattern, RegexOptions.IgnoreCase);
}
if (usermatch.Groups.Count >= 4 && recvthreadison)
{
item1.hashKey = usermatch.Groups[1].Value.ToString();
item1.recvTime = Convert.ToDateTime(usermatch.Groups[2].Value.ToString());
item1.recvIp = usermatch.Groups[3].Value.ToString();
item1.recvPort = Convert.ToInt32(usermatch.Groups[4].Value.ToString());
return 1;
}
}
return 0;
}
2.从网站下载BT种子文件来进行处理
private int DownLoadFileToSaveFile(string strURL, string fileName,int timeout1)
{
Int32 ticktime1 = System.Environment.TickCount;
try
{
Int32 ticktime2 = 0;
byte[] buffer = new byte[4096];
WebRequest wr = WebRequest.Create(strURL);
wr.ContentType = "application/x-bittorrent";
wr.Timeout = timeout1;
WebResponse response = wr.GetResponse();
int readsize = 0;
{
bool gzip = response.Headers["Content-Encoding"] == "gzip";
Stream responseStream = gzip ? new GZipStream(response.GetResponseStream(), CompressionMode.Decompress) : response.GetResponseStream();
using (MemoryStream memoryStream = new MemoryStream())
{
responseStream.ReadTimeout = timeout1*2;
int count = 0;
do
{
count = responseStream.Read(buffer, 0, buffer.Length);
memoryStream.Write(buffer, 0, count);
readsize += count;
Thread.Sleep(1);
} while (count != 0);
ticktime2 = System.Environment.TickCount;
byte[] result = memoryStream.ToArray();
Thread.Sleep(10);
using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
{
writer.Write(result);
}
}
Int32 ticktime3 = System.Environment.TickCount;
//H31Debug.PrintLn("下载成功" + strURL + ":" + readsize.ToString() + ":" + (ticktime2 - ticktime1).ToString() + "-" + (ticktime3 - ticktime2).ToString());
}
return 1;
}
catch (Exception e)
{
Int32 ticktime3 = System.Environment.TickCount;
//H31Debug.PrintLn("下载失败" + strURL + ":" + (ticktime3 - ticktime1).ToString());
return -2;
}
}
3.通过BT文件解析类来读取文件名和列表
4.通过正确正则表达式过滤掉WWW. BBS. 等网站信息,因为这样会影响搜索结果.
/// <summary>
/// 去掉标题中的网址信息
/// </summary>
private string GetOneGoodString(string title)
{
//去掉标题中的网址信息
string res = title;
try
{
//string pattern = @"\[(.*)([\w-]+://?|(www|bbs)[.])([^\]]*)\]";
string pattern = @"(\[|\@|\【|\s|\(|\{)(.*)([\w-]+://?|(www|bbs)[.])([^(\]|\@|\】|\)|\})]*)(\]|\@|\】|\)|\})";
Match usermatch = Regex.Match(title, pattern, RegexOptions.IgnoreCase);
if (usermatch.Groups.Count > 1)
{
res = res.Replace(usermatch.Groups[0].Value.ToString(), " ");
res = res.Trim();
}
pattern = @"(\[|\@|\【|\s|\(|\{)(.*)\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk|cc|me|cm)([^(\]|\@|\】|\)|\}|\s)]*)(\]|\@|\】|\)|\}|\s)";
//pattern = @"(\[|\@|\【)(.*)([\w-]+://?|(www|bbs)[.])([^(\]|\@|\】)]*)(\]|\@|\】)";
usermatch = Regex.Match(res, pattern, RegexOptions.IgnoreCase);
if (usermatch.Groups.Count > 1)
{
res = res.Replace(usermatch.Groups[0].Value.ToString(), " ");
res = res.Trim();
}
pattern = @"(www|bbs)(.*)(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk|cc|me|cm)";
usermatch = Regex.Match(res, pattern, RegexOptions.IgnoreCase);
if (usermatch.Groups.Count > 1)
{
res = res.Replace(usermatch.Groups[0].Value.ToString(), " ");
res = res.Trim();
}
if (res.Length <= 5 && res.Length<title.Length)
{
int a = 0;
res = title;
}
}
catch (System.Exception ex)
{
H31Debug.PrintLn(ex.Message);
res = title;
}
return res;
}
5.判断文件名是中英文,日文等信息存储到不同的表中;
//判断是否是中文,如果是日文等,则存储到另外一个表中
private int ISChineseAndEnglist(string title)
{
try
{
string pattern = @"[\uac00-\ud7ff]+";//判断韩语
Match usermatch = Regex.Match(title, pattern, RegexOptions.IgnoreCase);
if (usermatch.Groups.Count >= 1 && usermatch.Groups[0].Value.Length >= 1)
return 0;
pattern = @"[\u0800-\u4e00]+";//判断日语
usermatch = Regex.Match(title, pattern, RegexOptions.IgnoreCase);
if (usermatch.Groups.Count >= 1 && usermatch.Groups[0].Value.Length >= 1)
return 0;
pattern = @"[\u4e00-\u9fa5]+";//判断汉字
usermatch = Regex.Match(title, pattern, RegexOptions.IgnoreCase);
if (usermatch.Groups.Count >= 1 && usermatch.Groups[0].Value.Length >= 1)
return 1;
//判断英文,数字
byte[] byte_len = System.Text.Encoding.Default.GetBytes(title);
if (byte_len.Length == title.Length)
return 1;
}
catch (System.Exception ex)
{
H31Debug.PrintLn(ex.Message);
}
return 0;
}
开源地址:https://github.com/h31h31/H31DHTMgr
程序下载:H31DHT下载

下一文章准备对DHT的研究进行文章介绍.如果大家推荐度比较高,我下一步过两天就开源C++写的H31DHT数据抓取数据的程序,程序都是采用VS2005编写.
第一次运行H31DHTMgr程序可能没有数据,可以先从从 http://torrage.com/sync 下载一个TXT文件回来进行处理 ;
第一次运行H31DHT数据抓取程序可能很久才有几要数据回来,DHT网络好像对固定IP的比较喜欢,返回信息比较多,所以ADSL的抓取速度也不会很快.
由于DHT获取的种子内容带AV内容的多很多,所以不提供ASP网站查询的代码工作,如果提供境外服务器测试,可以提供ASP网站查询代码.
希望有兴趣的朋友一起把这个后台管理程序修改得更加完美一些.
由于第一次开源作品,希望大家推荐.
[搜片神器]使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)的更多相关文章
- 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源) 先直接上程序界面,了解整体工作流程是什么样子的,求服务器进行挂机测试,需要固定IP,空间大概需要10G左右(主要是BT种子占用空间 ...
- [C#搜片神器] 之P2P中DHT网络爬虫原理
继续接着上一篇写:使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器] 昨天由于开源的时候没有注意运行环境,直接没有考虑下载BT种子文件时生成子文件夹,可能导致有的朋友运行 ...
- 据磁力链获得BT种子
最近研究了一下磁力链magnet和BT种子torrent文件之间的相互转换.其实通过torrent文件获得磁力链实现起来比较简单,但反过来并非是一个可逆的过程,磁力链转BT种子理论上来说是不可能实现的 ...
- 磁力搜索网站 BT torrent search engine 推荐 2019/12/25日更新
btkitty 知名的BT磁力搜索,资源很多,中文友好 btdb 知名的BT磁力搜索,资源很多,中文友好 838888 不错的 BT 磁力搜索引擎,资源很多,中文友好 idope.se 资源丰富的BT ...
- DHT协议网络爬虫磁力链接和BT种子搜索引擎
系统功能和用到的技术. 系统包括几个独立的部分: 使用 Python 的 Scrapy 框架开发的网络爬虫,用来爬取磁力链接和种子: 使用 PHP CI 框架开发的简易网站: 搜索引擎目前直接使用的 ...
- 利用迅雷提供的接口从磁力链得到bt种子文件
本地下载工具的磁力链下载速度不给力,而百度云盘有提供离线下载服务,相当于就是直接到服务器取个链接而已.但这需要bt文件,而我只有链力链.网上搜了一下,可以从磁力链构造一个bt文件的下载地址,用pyth ...
- 迅雷磁力链接转BT种子工具
种子文件目录:C:\Users\jifeng\AppData\Local\Temp\magnetex MagnetEx.exe 从迅雷5.8支持磁力链接的无视受限资源版提取 MagnetEx.exe ...
- [搜片神器]之DHT网络爬虫的代码实现方法
继续接着第一篇写:使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器] 谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器: http://www.sosobta. ...
- [搜片神器]BT种子下载超时很多的问题分析
继续接着第一篇写:使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器] 谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器: h31bt.org 大家可以给提点意 ...
随机推荐
- 001.android初级篇之ToolBar
官方的最新support library v7中提供了新的组件ToolBar,用来替代之前的ActionBar,实现更为弹性的设计在 material design 也对之做了名称的定义:App ba ...
- Oracle中建立物化视图报错
Oracle中建立物化视图报错 今天在建立视图的时候,报了一个错:ORA-01723: zero-length columns are not allowed. 建视图的语句: create mate ...
- SDWebImage缓存清理
//计算缓存大小 [SDImageCache sharedImageCache] getSize] //清理缓存 SDImageCache *sd = [[SDImageCache alloc]ini ...
- Cocos2d-JS自定义粒子系统
除了使用Cocos2d-JS的11种内置粒子系统外,我们还可以通过创建ParticleSystem对象,并设置属性实现自定义粒子系统,通过这种方式完全可以实现我们说需要的各种效果的粒子系统.使用Par ...
- cocos2d-x中Node中重要的属性
Node还有两个非常重要的属性:position和anchorPoint. position(位置)属性是Node对象的实际位置.position属性往往还要配合使用anchorPoint属性,为了将 ...
- mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量
继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程. 打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同 ...
- 在MAC系统上进行屏幕录制
最近打算将一些软件操作过程进行屏幕录制进行视频分享,所以寻思着找一块能在MAC上使用的屏幕录制软件.google了一番,没想到MAC系统自带的QuickTime Player已经内置屏幕录像功能,而且 ...
- $(document).height()、$("body").height()、$(window).height()区别和联系
前言:在此以高度为示例,宽度问题可类推.在移动端开发中,经常遇到需要把一块内容定位于底部的情况,当页面内容不满一屏时,需要设为fixed,而超过 一屏时,需要设为static随页面顶到底部,此时就需要 ...
- 重绘panel控件,实现panel的阴影效果
最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下: 重绘代码如下: using System; using System.Co ...
- 从new Function创建函数联想到MVC模式
我们知道任何一个自定义函数都是Function构造器的实例,所以我们可以通过new Function的方式来创建函数,使用语法很简单, new Function(形参1, 形参2, ..., 形参N, ...