使用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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
python连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
Python类的继承和多态代码详解
Dec 27 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
Apr 21 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
python Pillow图像处理方法汇总
Oct 16 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 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/11/18 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
php实现搜索类封装示例
2016/03/31 PHP
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
Python用UUID库生成唯一ID的方法示例
2016/12/15 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
python sorted函数原理解析及练习
2020/02/10 Python
django实现将后台model对象转换成json对象并传递给前端jquery
2020/03/16 Python
Python 实现一个计时器
2020/07/28 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
酒店拾金不昧表扬信
2014/01/18 职场文书
迟到检讨书大全
2014/01/25 职场文书
致标枪运动员广播稿
2014/02/06 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
企业年会主持词
2014/03/27 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
法人授权委托书范本
2014/09/17 职场文书
西岭雪山导游词
2015/02/06 职场文书
社区敬老月活动总结
2015/05/07 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
Python标准库pathlib操作目录和文件
2021/11/20 Python