洗白BT文件

寫在前面

接着上篇文章,torrent文件編碼.在torrent文件編碼這篇文章的開始我就說過,種子文件對於青年男士有着巨大的誘惑力。我也不例外,由於國內文化教育方面抓的比較緊,所以某些領域的文件信息無法通過種子文件離線下載、進入高速通道。這個實現的原理很簡單,直接通過掃描種子文件的tracker、服務器地址顯然不可取,那就遍歷torrent包含的文件名吧,這些文件往往會有很多露骨的字眼,淨網行動進行了這麼多年,文化教育領域對付這一套顯然很有心得。

下面我們就先看一下torrent文件包含的文件吧,當然不是通過BT下載器:)

libtorrent

不造輪子,從我做起。網絡上已經有大牛們製作的torrent庫,其中最流行的應該就是libtorrent。

LibTorrent 是一個C++ 語言的 BitTorrent 開發庫,支持 Linux/Unix 系統。旨在提供高性能和良好代碼風格的 BT 開發包。該開發包與其他包不同的是,它直接通過網絡堆棧抓取文件頁,因此性能是官方客戶端的三倍。

libtorrent的python版本:

Building the libtorrent python bindings will produce a shared library (DLL) which is a python module that can be imported in a python program.

libtorrent API的中文翻譯戳這裏,當然沒有python版本的API文件,不過既然已經安裝了libtorrent的python binding,熟悉C++的API也是必做的一步。有條件的筒子們還是建議去讀英文版的API吧Here,雖然我也不知道爲什麼這樣推薦。

torrent_info

上篇文章已經介紹了torrent文件包含的基本結構,一般來講,簡單的torrent文件有以下內容:

  • info

包含文件的信息files、torrent顯示的文件名name、發行商publisher-url。注意這裏torrent文件名並不是那個我們可以簡單通過重命名定義的name,而是torrent指向的那個大的文件或者文件夾名。

  • comment

種子文件的註釋

  • encoding

目前一般爲utf-8

  • creation date

該關鍵字對應的值存放的是種子文件創建的時間

  • announce-list

存放的是備用Tracker的URL

  • created by

值存放生成種子文件的BT客戶端軟件的信息,如客戶端名、版本號

  • nodes

包含一系列ip和相應端口的列表,是用於連接DHT初始node。

  • announce

Tracker的URL

其中我們最常用的信息就是info字段,裏面包含我們需要的大部分信息。

種子文件分爲單文件種子以及多文件種子:

單文件

  • name

要下載的文件名字

  • length

要下載文件的大小(單位爲byte)

  • piece length

要下載文件按照piece length指定大小分片,此處指明單個分片大小。

  • pieces

存儲每個分片的SHA1值(每個SHA1的hash長度爲20byte)

多文件

  • files

表示該torrent爲多文件形式,每個文件都是dictionary類型數據表示。

  • name

表示多個文件存儲在以name命名的文件夾。

  • length

要下載文件的大小(單位爲byte)

  • path

指出要下載文件存儲相對於name字段表示的文件夾的位置。

假設name爲dir1,此時:

  1. 如果path值爲file1.rmvb,表示file1.rmvb的存儲路徑爲dir1\file1.rmvb

  2. 如果path值爲dir2\file1.rmvb,表示file1.rmvb的存儲路徑爲dir1\dir2\file1.rmvb

    • piece length

要下載文件安裝piece length指定大小分片,此處指明單個分片大小。

  • pieces

存儲每個分片的SHA1值(每個SHA1的hash長度爲20字節)

下面是子啊python下使用libtorrent庫對torrent文件的操作:

# -*- coding: utf-8 -*-
import libtorrent as lt

bt=lt.torrent_info(filepath)

bt.files()
#返回一個包含文件的列表

bt.nodes()
#返回DHT初始node

bt.name()
#返回torrent文件名

bt.pieces()
#分片SHA1值

洗白

s= lt.bdecode(open(filepath, 'rb').read())
#通過對應的解碼算法獲取torrent文件的內容

# 修改說明文件
for item in s:
    if len(re.findall('comment.*?',item)):
        s[item]=str(s[item].__hash__())

#修改torrent文件名,保持了原來的文件格式
def alertFileName(dic):
     for i in dic:
        if len(re.findall('(name).*?',i)):
            if dic[i].find('.')<0:
                        dic[i]='[peihao.space]'+str(b'x')+str(path.__hash__())
            else :
                tem=dic[i].split('.')
                tem[len(tem)-1]=(re.findall('(\w+).*?',tem[len(tem)-1]))[0]
                dic[i]='[peihao.space]'+str(b'a')+str(tem[0].__hash__())+"."+tem[len(tem)-1]

#判斷種子文件是否是多文件結構
def isMultiFiles(dict):
    for i in dict['info']:
        if i=='files':
            return True
    return False


#深度修改所有包含文件的名字 並保持原有文件格式
def deepSetFilesName(dict):
    for item in dict:#item是一個個包含文件信息的序列
        for info in item:
            if len(re.findall('(path).*?',info)):
                for i in range(0,len(item[info])):
                    path=item[info][i]
                    if path.find('.')<0:
                        item[info][i]='[peihao.space]'+str(b'x')+str(path.__hash__())
                    else :
                        tem=path.split('.')
                        tem[len(tem)-1]=(re.findall('(\w+).*?',tem[len(tem)-1]))[0]
                        item[info][i]='[peihao.space]'+str(b'a')+str(tem[0].__hash__())+"."+tem[len(tem)-1]

# 種子轉磁力鏈
def bt2mag(name):
    bt=lt.torrent_info(name)
    return "magnet:?xt=urn:btih:%s&dn=%s" % (bt.info_hash(), bt.name())

效果

將生成的種子洗白程序用Tk造了一個殼子,效果如下

原來的torrent內容:

generate之後內容:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章