使用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 相关文章推荐
Windows系统下安装Python的SSH模块教程
Feb 05 Python
python fabric使用笔记
May 09 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
浅谈Python的垃圾回收机制
Dec 17 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
浅谈Pandas 排序之后索引的问题
Jun 07 Python
python实现自动登录
Sep 17 Python
python中常见错误及解决方法
Jun 21 Python
python asyncio 协程库的使用
Jan 21 Python
Django REST framework 限流功能的使用
Jun 24 Python
关于python爬虫应用urllib库作用分析
Sep 04 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
PHP动态变静态原理
2006/11/25 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
vuejs如何配置less
2017/04/25 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
Vue3为什么这么快
2020/09/23 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
python自定义函数def的应用详解
2020/06/03 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
中科软笔试题和面试题
2014/10/07 面试题
中英文自我评价语句
2013/12/20 职场文书
高中的职业生涯规划书
2013/12/28 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
优秀团员个人总结
2015/02/26 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL