使用Python实现BT种子和磁力链接的相互转换


Posted in Python onNovember 09, 2015

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

BT种子文件相对磁力链来说存储不方便,而且在网站上存放BT文件容易引起版权纠纷,而磁力链相对来说则风险小一些。而且很多论坛或者网站限制了文件上传的类型,分享一个BT种子还需要改文件后缀或者压缩一次,其他人需要下载时候还要额外多一步下载种子的操作。

所以将BT种子转换为占用空间更小,分享更方便的磁力链还是有挺大好处的。

首先一个方案是使用bencode这个插件,通过pip方式安装或者自行下载源文件https://pypi.python.org/pypi/bencode/1.0通过python setup.py install方式安装均可。

相应的将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]
Python 相关文章推荐
Python socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
python多线程用法实例详解
Jan 15 Python
python相似模块用例
Mar 04 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
python使用tkinter实现简单计算器
Jan 30 Python
浅谈python中requests模块导入的问题
May 18 Python
Python全排列操作实例分析
Jul 24 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
python深copy和浅copy区别对比解析
Dec 26 Python
python各层级目录下import方法代码实例
Jan 20 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
Python必须了解的35个关键词
Jul 16 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 #Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 #Python
Python实现模拟时钟代码推荐
Nov 08 #Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 #Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 #Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 #Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 #Python
You might like
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
express启用https使用小记
2019/05/21 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
python多线程扫描端口示例
2014/01/16 Python
一则python3的简单爬虫代码
2014/05/26 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
对Python _取log的几种方式小结
2019/07/25 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
环境工程毕业生自荐信
2013/11/17 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
《长城》教学反思
2014/02/14 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
检讨书范文300字
2015/01/28 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
教师节慰问信
2015/02/15 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android