使用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 相关文章推荐
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
python opencv检测目标颜色的实例讲解
Apr 02 Python
windows下添加Python环境变量的方法汇总
May 14 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
Python装饰器语法糖
Jan 02 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
Jul 18 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 Python
python中四舍五入的正确打开方式
Jan 18 Python
TensorFlow的环境配置与安装方法
Feb 20 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
php cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
Vue文件配置全局变量的实例
2018/09/06 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
pygame实现五子棋游戏
2019/10/29 Python
python实现文字版扫雷
2020/04/24 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
实习生自我鉴定
2013/12/12 职场文书
优秀小学生家长评语
2014/01/30 职场文书
中学生差生评语
2014/01/30 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
产品开发计划书
2014/04/27 职场文书
关于环保的建议书
2014/05/12 职场文书
学校2014年度工作总结
2014/12/06 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL