如何使用python实现bt种子和磁力链接的相互转换

Python011

如何使用python实现bt种子和磁力链接的相互转换,第1张

相应的将BT种子转换为磁力链代码为:

import bencode, hashlib, base64, urllib

torrent = open('ubuntu-12.04.2-server-amd64.iso.torrent', 'rb').read()

metadata = bencode.bdecode(torrent)

hashcontents = bencode.bencode(metadata['info'])

digest = hashlib.sha1(hashcontents).digest()

b32hash = base64.b32encode(digest)

params = {'xt': 'urn:btih:%s' % b32hash,

'dn': metadata['info']['name'],

'tr': metadata['announce'],

'xl': metadata['info']['length']}

paramstr = urllib.urlencode(params)

magneturi = 'magnet:?%s' % paramstr

print magneturi

还有另外一个效率相对较高,而且更方便的方案是安装libtorrent,在ubuntu只需要apt-get install python-libtorrent即可对应转换磁力链的代码为:

import libtorrent as bt

info = bt.torrent_info('test.torrent')

print "magnet:?xt=urn:btih:%s&dn=%s" % (info.info_hash(), info.name())

转换磁力链接为bt种子文件

下面来看一个反过程,将磁力链转化为种子文件。

1、需要先安装python-libtorrent包 ,在ubuntu环境下,可以通过以下指令完成安装:

# sudo apt-get install python-libtorrent

2、代码如下:

#!/usr/bin/env python

import shutil

import tempfile

import os.path as pt

import sys

import libtorrent as lt

from time import sleep

def magnet2torrent(magnet, output_name=None):

if output_name and \

not pt.isdir(output_name) and \

not pt.isdir(pt.dirname(pt.abspath(output_name))):

print("Invalid output folder: " + pt.dirname(pt.abspath(output_name)))

print("")

sys.exit(0)

tempdir = tempfile.mkdtemp()

ses = lt.session()

params = {

'save_path': tempdir,

'duplicate_is_error': True,

'storage_mode': lt.storage_mode_t(2),

'paused': False,

'auto_managed': True,

'duplicate_is_error': True

}

handle = lt.add_magnet_uri(ses, magnet, params)

print("Downloading Metadata (this may take a while)")

while (not handle.has_metadata()):

try:

sleep(1)

except KeyboardInterrupt:

print("Aborting...")

ses.pause()

print("Cleanup dir " + tempdir)

shutil.rmtree(tempdir)

sys.exit(0)

ses.pause()

print("Done")

torinfo = handle.get_torrent_info()

torfile = lt.create_torrent(torinfo)

output = pt.abspath(torinfo.name() + ".torrent")

if output_name:

if pt.isdir(output_name):

output = pt.abspath(pt.join(

output_name, torinfo.name() + ".torrent"))

elif pt.isdir(pt.dirname(pt.abspath(output_name))):

output = pt.abspath(output_name)

print("Saving torrent file here : " + output + " ...")

torcontent = lt.bencode(torfile.generate())

f = open(output, "wb")

f.write(lt.bencode(torfile.generate()))

f.close()

print("Saved! Cleaning up dir: " + tempdir)

ses.remove_torrent(handle)

shutil.rmtree(tempdir)

return output

def showHelp():

print("")

print("USAGE: " + pt.basename(sys.argv[0]) + " MAGNET [OUTPUT]")

print(" MAGNET\t- the magnet url")

print(" OUTPUT\t- the output torrent file name")

print("")

def main():

if len(sys.argv) <2:

showHelp()

sys.exit(0)

magnet = sys.argv[1]

output_name = None

if len(sys.argv) >= 3:

output_name = sys.argv[2]

magnet2torrent(magnet, output_name)

if __name__ == "__main__":

main()

3、用法如下

# python Magnet_To_Torrent2.py <magnet link>[torrent file]

什么是BT?

BitTorrent(中文全称比特流,简称BT,又称变态下载)是一个多点下载的P2P软件。不象FTP那样只有一个发送源,BT有多个发送点,当你在下载时,同时也在上传,使大家都处在同步传送的状态。

BT的工作原理?

BT首先在上传者端把一个文件分成了多个部分,客户端甲在服务器随机下载了第N部分,客户端乙在服务器随机下载了第M部分。

这样甲的BT就会根据情况到乙的电脑上去拿乙已经下载好的第M部分,乙的BT就会根据情况去到甲的电脑上去拿甲已经下载好的第N部分。

BT下载会比http、FTP快吗?

从原理上来说,由于BT先进的下载方式减轻了服务器端的负荷,同时加快了客户端的下载速度。所以BT下载的人越多,速度越快。而传统的服务器下载方式,速度取决于你的带宽和服务器分给你的带宽。

什么叫种子?

BitTorrent适合于提供10M以上的文件下载,小的文件可集中于同一目录统一提供下载

RMVB、AVI等类型的电影文件最适合通过BitTorrent方式共享,经一个多月的测试,对于600M以上电影,50K上传带宽(如ADSL)的服务器,同时提供下载的文件不要多于2个,100K上传带宽同时提供3、4个文件下载最合适,100K以上上传带宽可按此类推

A)

下载python(约8M)

http://www.python.org/ftp/python/2.3/Python-2.3a2.exe

安装到c:\python23

B)

安装BitTorrent服务器程序(约130k)

http://bitconjurer.org/BitTorrent/BitTorrent-3.1.zip

解压到c:\bittorrent-3.1

C)

在c:\bittorret-3.1目录建立三个批处理文件:

1.bat

c:\python23\python bttrack.py --port 6969 --dfile dstate

2.bat

c:\python23\python btmakemetafile.py c:\avi\demo.avi

http://myiporhostsname:6969/announce

3.bat

c:\python23\python btdownloadheadless.py --url

http://myiporhostsname/demo.avi.torrent --saveas c:\avi\demo.avi

D)

如果没有安装或运行WEB服务器,安装或运行WEB服务器

E)

假设本机的域名是demo.vip.com,WEB服务器目录是c:\httpd

要将c:\movies\thehours目录里的avi电影和字幕文件进行共享,执行如下步骤:

a.

执行1.bat

b.

将2.bat中的c:\avi\demo.avi改成c:\movies\thehours,将http://myiporhostsname/改成http://demo.vip.com/

执行2.bat

如果执行正常,应在c:\movies目录下生成thehours.torrent文件,将此文件拷到c:\httpd

c.

将3.bat中的http://myiporhostsname/demo.avi.tor...vi改成c:\movies

执行3.bat

如果执行正常,程序将读取文件,完成后显示percent done: 100.0的信息并不断刷新

执行完上述三步后你就可以发布你的共享文件,

http://demo.vip.com/thehours.torren...�馗粗葱?、3步

BitTorrent工作原理,BitTorrent分为tracker和client两部分。

以发布一个软件为实例:

先安装一个tracker服务器,此服务器需要相对稳定的为client提供服务。

然后将要发布的软件打包成一个,或多个文件。用<btmakemetafile>程序对该文件进行分析

btmakemetafile,会将该文件分成多个段和创建checksum信息以保证下载数据的正确性,

btmakemetafile,会创建一个包含tracker服务器信息,文件分段和checksum信息的,以.torrent

为扩展名的很小的文件,然后用<btdownloadheadless.py>程序发布第一个client, 每个client都

会和tracker建立连接,因为第一个client为起始client,所以他必须包含完整的文件。

现在你可以发布.torrent文件了,当二个人(client2)开始下载的时候,会和tracker服务器建立联系,

已取得已有client的信息(如client1),他会依照.torrent的文件划分规则开始向client1下载数据。

比如将发布的文件分为10段,这时他开始下在第一段,当client3下载的时候tracker会自动告诉他从

client2下载文件的第一段,而从client1下载文件的其他段,以次类推,每个client可以同时从其他

client那里下在他们已有的数据段,而下载的同时,也向其他client提供自己已下载的数据段,从而

不仅提高了大家的下载速度也减轻了第一个release者的带宽压力。

现在人们对于BT下载的硬盘损坏情况,主要有三个方面,分别是:高温、反复读写、扇区阻塞。

1、由于BT对硬盘的反复读写作用会产生高温,使硬盘的温度升高,直接影响硬盘的使用寿命。下载的人越多,同时读取硬盘的人就越多,大量的硬盘重复读写动作,加速消耗。同时,由于下载的东西太多,使得扇区的编组混乱,读写的数据要在不同扇区中读取,增加了读写的数量,加快了硬盘的消耗。

事实是,硬盘的高温是由于硬盘的高速旋转,加上与空气的摩擦,读写动作的热量是非常微小的。即使你不使用BT,如果你让电脑长时间运行,听音乐,玩3D游戏,它会使硬盘高温。而硬盘速度越快,温度越高,这是硬件本身,而软件与操作问题无关。因此,与其用BT来保护硬盘,更实用的是改善机箱的通风状态。

2、有人说,BT就像一面燃烧的木头要折断两三段火,大量的读写动作会大大加快硬盘的消耗,燃烧硬盘的寿命。这话有道理,但有点夸张。

事实上,不仅仅是BT使重复读写的增加,和坏习惯不消耗任何不到硬盘使用BT。通过增加读写缓冲区BT项目,BT的读写时间可以大大减少,可以减少硬盘的消费。并且改正不良的硬盘使用习惯可以增加硬盘的使用寿命。因此,只要进行适当的调整,BT的重复读写操作就不会消耗大量的硬盘寿命。

3、扇区块的情况类似。不可否认,BT下载会产生很多块,但是任何运行了一段时间的计算机都会有很多块。块本身是扇区的记录,不影响硬盘驱动器。许多断块都会损坏硬盘,是每次执行一个程序或文件时,为了寻找不同的块来执行,

减慢了操作速度,同时也增加了CPU和磁头的工作量,间接消耗了硬盘的寿命。但是这种情况可以通过定期重组硬盘来解决,所以硬盘的寿命是由使用习惯决定的,而不是由一两个软件决定的。

结论:BT的操作和使用习惯是加速硬盘消耗的两种方式。BT伤害硬盘的主要原因,不是没有缓存的问题,因为新的BT程序,已经提供了调整缓存的功能,怕硬盘损坏,将缓存设置为10MB,20MB就好了。

扩展资料:

用BT下载时保护硬盘的方法:

1、使用专用的硬盘驱动器

如果你想要有额外的硬盘,比如升级到淘汰小硬盘,那就没问题。在机器上安装那个硬盘,做一个分区,专门保存BT下载的文件,下载完后再复制到其他分区上。这样,如果BT真的“吃”硬盘,也是“吃”你的“剩菜”,损失不大。

2、不要花太长时间来启动和下载

BT下载的狂热者常常让机器整天整夜地开着,让他们自己下载,通常是让机器开三到五天。这种情况导致磁盘温度过高,加速其老化和疲劳,

而目前7200转的高速磁盘热是非常大的。如果箱子的热条件不是很好,那就更糟了。所以我在下载BT资源时原则上连续时间一般不超过12个小时,同时可以考虑在硬盘上添加一个好的风扇。

3、打开较少的下载窗口

很多人在下载的时候喜欢同时做5到6个直接加载的任务,希望下载可以更快,减少硬盘的负担,我发现这是有害的,更多的连接会有更频繁的访问硬盘。而带宽是固定的,打开几个任务就会使每个任务平均分配的带宽减少,速度也不快。