使用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中的lstrip()方法使用简介
May 19 Python
详解Python的Django框架中的模版继承
Jul 16 Python
python 删除非空文件夹的实例
Apr 26 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
简单了解Python3里的一些新特性
Jul 13 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
在macOS上搭建python环境的实现方法
Aug 13 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
python else语句在循环中的运用详解
Jul 06 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 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实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python中函数的用法实例教程
2014/09/08 Python
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python实现淘宝秒杀脚本
2020/06/23 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
简述python Scrapy框架
2020/08/17 Python
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
工商企业管理应届生求职信
2013/11/03 职场文书
车间班组长的职责
2013/12/13 职场文书
珍珠奶茶店创业计划书
2014/01/11 职场文书
初一家长会邀请函
2014/01/31 职场文书
中班中秋节活动反思
2014/02/18 职场文书
经典公益广告词
2014/03/13 职场文书
安全生产目标责任书
2014/04/14 职场文书
党员评议思想汇报
2014/10/08 职场文书
2015年服务员工作总结
2015/04/08 职场文书
紧急迫降观后感
2015/06/15 职场文书
实现一个简单得数据响应系统
2021/11/11 Javascript
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python