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个直接加载的任务,希望下载可以更快,减少硬盘的负担,我发现这是有害的,更多的连接会有更频繁的访问硬盘。而带宽是固定的,打开几个任务就会使每个任务平均分配的带宽减少,速度也不快。