使用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中enumerate的用法实例解析
Aug 18 Python
python通过shutil实现快速文件复制的方法
Mar 14 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
Python实现字符串格式化的方法小结
Feb 20 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
Python入门之三角函数atan2()函数详解
Nov 08 Python
Python方法的延迟加载的示例代码
Dec 18 Python
python3.6.3转化为win-exe文件发布的方法
Oct 31 Python
python面向对象法实现图书管理系统
Apr 19 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 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下关于中英数字混排的字符串分割问题
2010/04/06 PHP
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
php两种无限分类方法实例
2015/04/21 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
为超链接加上disabled后的故事
2010/12/10 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
jQuery链使用指南
2015/01/20 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
仅利用30行Python代码来展示X算法
2015/04/01 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
python文件选择对话框的操作方法
2019/06/27 Python
如何通过python检查文件是否被占用
2020/12/18 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
建筑施工员岗位职责
2013/11/26 职场文书
公司培训心得体会
2014/01/03 职场文书
护士自我评价范文
2014/01/25 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
组工干部对照检查材料
2014/08/25 职场文书
四年级学生期末评语
2014/12/26 职场文书
五一劳动节活动总结
2015/02/09 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python
java设计模式--三种工厂模式详解
2021/07/21 Java/Android