1. 程式人生 > >用Bittorrent和PHP搭建BT Tracker伺服器和釋出頁

用Bittorrent和PHP搭建BT Tracker伺服器和釋出頁

這玩意可真是困擾了我好幾天,終於基本搞定了。

很早前就想整個BT伺服器玩玩,一直都是最後半途而廢。這次總算是把整個過程都弄明白了,其實根本就不是什麼難事情,就是資料太難找了,在GOOGLE搜的關於架設BT服務器的文章還是幾年前的那幾篇老掉牙的文章,英文又菜得不得了,看文章得用星際譯霸一個個翻譯。搞得頭大了好幾天。

現在國內網路上 比較常見的track主要是Bitcomettrack,94BT,還有個btmas,全都不開源,當然也就不在我的選擇範圍之內了

國外網路上的track主要是bittorrent,BNBT,還有一些完全用PHP做的tracker.

Bittorrent是最原版的BT track了,雖然除了一個 track的功能,但是你可以在上面做很輕易的擴充,也是我的最終選擇。


BNBT是用C++編寫的track,還帶了PHP的釋出頁面,但感覺發布系統做得太粗糙了,本來想拿過來改一下,看了看程式碼發現C的部分把很多功能都已經包括進去了,也懶得去研究它的程式碼,於是作罷。

至於純粹用PHP做的tracker和釋出系統,經過連續幾天在sf.net 上的搜尋,找到了一個非常優秀的,BT系統 :Tbsource 。做的超級優秀!其功能齊全程度幾乎相當於一個論壇了,看了下程式碼,好象主要是通過把種子和連線資訊寫入MYSQL種來實現的,種子資訊還好,但是連線資訊是時刻在變化的,這樣對資料庫的操作會不會太頻繁了?可能是我沒完全看懂它的原理。我經常上的www.filemp3.org 和bmtorrents.net就是用Tbsource作的,速度和穩定性都很好啊!但是正因為T bsource做的太完善了,我都不知道
如何去修改。以後有時間再詳細研究下,把其中核心的部分抽出來作成DISCUZ的BT外掛,應該是個好主意。
最後還是回到了bittorrent,就用個 tracke就可以了,自己用PHP寫個BT釋出索引頁,應該很簡單,省得去研究別人得程式碼。

安裝 Bittorrent

#apt-get install bittorrent

啟動 track

#bttrack –dfile downloadlogfile.txt –port 8099
意思就是啟動TRACKER,並在當前目錄建立日誌檔案, downloadlogfile.txt ,設定埠為8099

以折種方式啟動 tracker的話是不論誰都可以拿你的 tracker做伺服器的,如果你想限制只允許上傳到本站的種子才能用該伺服器的話,可以用下面這種方式啟動。


#bttrack –port 8099 –show_names l –allowed_dir /mytorrents –dfile downloadlog.txt

這樣的話就只對已經上傳到本站/mytorrents目錄下的種子提供track服務。

track這樣就 可以以了,下面的問題就是如何編寫釋出系統了

思路很簡單,上傳BT種子到制定的目錄,分析BT種子檔案,獲得檔名,檔案大小等資訊並插入資料庫,這些資訊都是很好搞定的。難搞定的是做種人數目,下載人數等資訊 ,這些資料都是即時的。是直接通過track插入資料庫好還是通過PHP 定時查詢tracker再在索引頁面現實。通過track直接插入資料庫的效率肯定要高一點,但覺得這樣的即時資訊有必要做這樣平凡的插入工作麼,還不如通過PHP定時查尋track並生成靜態頁面現時出來。

OK暫時就這麼幹了!

首先是BT種子檔案的分析問題 ,網路上有牛人用PHP編寫的兩個流傳甚廣的種子解析檔案,

BDecode.php 和BEncode.php.

把這兩個檔案 include 後

$array=BDecode(path/to/you/down.torrent);

$array返回的是你種子檔案資訊的陣列。

其中$array[”announce-list”]是該種子使用的 tracker 列表

$infohash=sha1(BEncode($array[”info”] )返回陣列的 hash資訊(hash要用sha1()解碼)

$filesize=$array[”info”][”length”]/1048576返回檔案大小

如果是用資料夾做的種子,可以通過下面的方法來獲得檔案大小

獲得檔名:$filename = $array[”info”][”name”]

把上面的種子資訊整理下就可以放到資料庫裡面去了

接下來的問題就是BT的即時資訊的獲得問題啦。

這些資訊可以通過向BT伺服器傳送GET請求來獲得

例如假如你用 bittorrent track 的地址是 http://www.mybt.com:8099/announcd

那麼你應該向這個地址傳送請求:http://www.mybt.com:8099/scrape

要取得一個種子的資訊你需要提供種子的info_hash(這在我們分析種子資訊時已得到了)

例如: http://www.mybt.com:8099/scrape?info_hash=……………..

一開始我不管怎麼樣都沒辦法取回返回資訊,在網上逛了好幾天才找到答案

原來在分析種子時得到的info_hash 不能直接用與傳送GET請求,還需要經過unicode編碼

演算法如下:

php種可以通過函式很簡單得實現

$s = ‘4686AA54744019E3B44C6E8F5E90F47F3E8E87F8′;

$t = pack(’H*’, $s);

$url_hash=urlencode($t);

ok 現在就可以向track 傳送請求了。

require_once (”BEncode.php”);

require_once (”BDecode.php”);

$info = BDecode(file_get_contents(”http://www.mybt.com:8099/scrape?info_hash=”.$url_hash));

返回來的$info是一個數組,我們可以從中取得想要的資訊

例如:

完成數:$info[’files’][0][’complete’];《/破》

下載數:$info[’files’][addslashes(hex2bin($hash))][’incomplete’];

其中 hex2bin()是一個16進位制轉2進位制的函式,網上有很多的。

核心內容就這麼多,擴充套件起來就很簡單了,可以就做一個索應頁面,也可以做個強大的釋出系統。

這裡有一篇比較詳細的結合MYSQL 的程式碼

http://www.norskwebforum.no/pastebin/976

完!


轉自瘋狂小強的部落格
原文地址:
http://my.donews.com/xiaoqiang/2 ... %e9%a1%b5%e3%80%82/
http://my.donews.com/xiaoqiang/2 ... %e4%b8%8b%ef%bc%89/