1. 程式人生 > >【P2P網路】磁力連結轉換為種子檔案 magnet to torrent

【P2P網路】磁力連結轉換為種子檔案 magnet to torrent

作者:zxx 1.前言   將種子檔案轉換為磁力連結很簡單,只需要在種子檔案的infohash碼前面加上magnet:?xt=urn:btih:即可,相信大家在迅雷,utorrent等主流軟體上也都能發現這個功能。       但是將磁力連結轉換為種子檔案就不那麼簡單了,因為sha-1演算法是不可逆的,但是BT協議確提供了這個功能,但是我在網上沒有找到中文的介紹,這裡就將自己的研究心得貢獻一下。
     下面還想廢話2句,告訴大家使用磁鏈和種子的優缺點。其實磁力連結本身是沒什麼用的,不管在任何軟體的磁鏈下載中,都必須要先通過磁鏈得到種子檔案,再使用種子檔案進行常規下載。因為種子檔案才有分片資訊,檔案大小,檔名等必要資訊。所以可以看出,種子其實是必不可少的,那你可能會覺得奇怪,為什麼還需要磁鏈呢?這是因為現在對BT的封鎖太嚴重,傳播種子並不是那麼簡單的事了,動不動就被和諧了,所以磁鏈的作用就是便於傳輸,因為磁鏈就是一個小小的文字,而種子確是一個檔案呢~所以總結一下他們的優缺點:
A.種子:穩定性高,資訊多,不便於傳播擴散
B.磁力連結:仍需要先獲得種子,不穩定,可能在某時刻不能獲取,但是很便於擴散。


2.磁力連結到種子轉換的策略


本人現在的研究共發現3種策略:
A.利用BT的官方協議獲取
B.從迅雷的種子庫獲取
C.從位元彗星的種子庫獲取

下面對三種策略做簡單介紹:

第一種,利用BT的官方協議獲取

效能特色:
這種策略可以獲取最多的種子,但是速度最慢,因為是官方的協議,所以很穩定,但是如果這個種子是個冷門種子時,很可能會獲取不到,因為當前沒有DHT使用者線上,所以當使用迅雷,utorrent等客戶端軟體提示無法獲取種子時,你可以待會再試,過陣子可能有對應種子的使用者上線,她如果加入了DHT網路,我們就可以獲取種子了。

實現原理:
這個方法需要閱讀官方的2個擴充套件協議:
http://www.bittorrent.org/beps/bep_0010.html

http://www.bittorrent.org/beps/bep_0009.html            


理解並實現這2個協議後就可以獲取種子了,下面是2個協議的翻譯稿。


好訊息!我發現這個網站 http://btdigg.org/ 是使用extend協議進行解析,大家可以試用下~速度可能會很慢,但是應該可以解析很多庫裡面沒有的種子。

第二種,從迅雷的種子庫獲取

效能特色:
這種策略獲取種子的速度很快,當你有一批磁力連結時,可以先使用這種方法來獲取大部分種子,對迅雷種子庫沒有的部分,再使用第一種方法獲取。

實現原理:
非常簡單,在瀏覽器中輸入
http://bt.box.n0808.com/05/A5/05153F611B337A378F73F0D32D2C16D362D06BA5.torrent


即可獲取種子,其中的 05153F611B337A378F73F0D32D2C16D362D06BA5是對應種子檔案的infohash碼,也就是磁鏈的btih:欄位,/05/A5是hash的第一個和最後一個位元組。
當你需要大規模獲取時,就自己用C++構造一個報文內從去請求吧。

第三種,從位元彗星的種子庫獲取

效能特色:同第二種的效能特色,但是位元彗星的庫裡面種子更多。因為位元彗星可以製作種子,在製作的同時可能就上傳到庫裡面了。

實現原理:
我還沒有解析出來,大家可以參見文章:
http://www.cnblogs.com/UMU618/articles/2568579.html,但是這位牛人也忘記了hash欄位是怎樣加密的,我不知道怎樣從hash到key。如果有人發現了,希望您能告訴我,謝謝!

攻城詩賦:
第三種位元彗星成功率也很高,而且貌似不淨網。至於hash的演算法是

hash轉回20位元組形式前加“bc”後加"torrent"共29位元組做SHA1得到20位元組轉回可讀40位元組形式

第四種,從Vuze的種子庫獲取

這個也蠻厲害的,我搞了半天才搞出來......

比如對於infohash為03621694F0E8B2CE87216C99CB5CA3AF23029E37的磁力連結,構造下面的URL:

http://magnet.vuze.com/magnetLookup?hash=ANRBNFHQ5CZM5BZBNSM4WXFDV4RQFHRX

其中的ANRBNFHQ5CZM5BZBNSM4WXFDV4RQFHRX是03621694F0E8B2CE87216C99CB5CA3AF23029E37的base32碼,但是不能直接去網上base32轉,因為轉碼要用03621694F0E8B2CE87216C99CB5CA3AF23029E37的二進位制資料

linux下可以這樣轉

echo -n 03621694F0E8B2CE87216C99CB5CA3AF23029E37 | xxd -r -p|./perl_32.pl

其中的perl_32.pl是一個原始檔,內容如下:
#!/usr/bin/perl

use MIME::Base32 qw( RFC );

undef $/;  # in case stdin has newlines
$string = <STDIN>;

$encoded = MIME::Base32::encode($string);

print "$encoded\n";

如果許可權不對記得要
chmod 777 perl_32.pl


補充一些種子庫:

http://torrage.com/torrent/66B106B04F931DA3485282C43CF66F6BD795C8C4.torrent

http://torcache.net/torrent/66B106B04F931DA3485282C43CF66F6BD795C8C4.torrent

http://zoink.it/torrent/66B106B04F931DA3485282C43CF66F6BD795C8C4.torrent

http://mag2tor.com/static/torrents/05/15/3f/05153f611b337a378f73f0d32d2c16d362d06ba5.torrent 快取的種子很少