使用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实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 Python
kaggle+mnist实现手写字体识别
Jul 26 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
Python 面试中 8 个必考问题
Nov 16 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
Python字符串大小写转换拼接删除空白
Sep 19 Python
python计算波峰波谷值的方法(极值点)
Feb 18 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
UI自动化定位常用实现方法代码示例
Oct 27 Python
Flask中jinja2的继承实现方法及实例
Mar 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 join函数应用
2011/05/04 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
JQuery中getJSON的使用方法
2010/12/13 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
JS实现按钮控制计时开始和停止功能
2017/07/27 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
python写一个md5解密器示例
2018/02/23 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
Python中作用域的深入讲解
2018/12/10 Python
python交换两个变量的值方法
2019/01/12 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
往来会计岗位职责
2013/12/19 职场文书
学员自我鉴定
2014/03/19 职场文书
岗位说明书范文
2014/05/07 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
社区志愿者活动方案
2014/08/18 职场文书
信息合作协议书
2014/10/09 职场文书
员工2014年度工作总结
2014/12/09 职场文书
在职人员跳槽求职信
2015/03/20 职场文书