使用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读取csv文件示例(python操作csv)
Mar 11 Python
Python 列表(List)操作方法详解
Mar 11 Python
python静态方法实例
Jan 14 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
TensorFlow索引与切片的实现方法
Nov 20 Python
python cv2截取不规则区域图片实例
Dec 21 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
python的sys.path模块路径添加方式
Mar 09 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 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设计聊天室步步通
2006/10/09 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
JSON格式化输出
2014/11/10 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
Python装饰器使用示例及实际应用例子
2015/03/06 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
回调函数的意义以及python实现实例
2017/06/20 Python
numpy.random模块用法总结
2019/05/27 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
Python如何telnet到网络设备
2021/02/18 Python
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
事业单位请假制度
2014/01/13 职场文书
保密工作目标责任书
2014/07/28 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
小学生家长意见
2015/06/03 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
redis三种高可用方式部署的实现
2021/05/11 Redis