使用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通过pil模块将raw图片转换成png图片的方法
Mar 16 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
python3判断url链接是否为404的方法
Aug 10 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
Python编程flask使用页面模版的方法
Dec 28 Python
如何用Python制作微信好友个性签名词云图
Jun 28 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
Python Django实现layui风格+django分页功能的例子
Aug 29 Python
基于Python解密仿射密码
Oct 21 Python
Python 中的 import 机制之实现远程导入模块
Oct 29 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漏洞小结
2012/02/05 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
Angular2库初探
2017/03/01 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
Python复数属性和方法运算操作示例
2017/07/21 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
windows下python安装pip图文教程
2018/05/25 Python
深入浅析Python传值与传址
2018/07/10 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
优秀的计算机专业求职信范文
2013/12/27 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
淘宝店策划方案
2014/06/07 职场文书
创新社会管理心得体会
2014/09/12 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
2014年终个人总结报告
2015/03/09 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP