使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器]
先直接上程序界面,了解整體工作流程是什么樣子的,求服務器進行掛機測試,需要固定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的抓取速度也不會很快.
另外求服務器進行程序測試,需要有固定IP,10G的WIN服務器空間,h31h31@163.com,謝謝.
由于DHT獲取的種子內容帶AV內容的多很多,所以不提供ASP網站查詢的代碼工作,如果提供境外服務器測試,可以提供ASP網站查詢代碼.
希望有興趣的朋友一起把這個后臺管理程序修改得更加完美一些.
由于第一次開源作品,希望大家推薦.
?
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
總結
以上是生活随笔為你收集整理的使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gzdeflate函数_php 压缩函数
- 下一篇: bch纠错码 码长8_BCH码-BCH码