使用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+Django在windows下的开发环境配置图解
Nov 11 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
python检索特定内容的文本文件实例
Jun 05 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
Python如何进行时间处理
Aug 06 Python
python合并多个excel文件的示例
Sep 23 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 Python
pandas中pd.groupby()的用法详解
Jun 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
神族 PROTOSS 概述
2020/03/14 星际争霸
php Smarty 字符比较代码
2011/02/27 PHP
PHP可变函数的使用详解
2013/06/14 PHP
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
javascript的事件描述
2006/09/08 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
Python实现多行注释的另类方法
2014/08/22 Python
python合并同类型excel表格的方法
2018/04/01 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
Python实现的列表排序、反转操作示例
2019/03/13 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
django-csrf使用和禁用方式
2020/03/13 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
巴西最大的珠宝连锁店:Vivara
2019/04/18 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
地理科学专业毕业生求职信
2013/10/15 职场文书
历史教育专业个人求职信
2013/12/13 职场文书
公司会议策划方案
2014/05/17 职场文书
工会趣味活动方案
2014/08/18 职场文书
2014年学校工作总结
2014/11/20 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
库房管理员岗位职责
2015/02/12 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书