使用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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
Django验证码的生成与使用示例
May 20 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
python根据多个文件名批量查找文件
Aug 13 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
django model object序列化实例
Mar 13 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 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
综合图片计数器
2006/10/09 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
php实现将Session写入数据库
2015/07/26 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
Python实现随机选择元素功能
2017/09/14 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
Python读取多列数据以及用matplotlib制作图表方法实例
2020/09/23 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
学习十八大报告感言
2014/02/04 职场文书
导航工程专业自荐信
2014/09/02 职场文书
工作失职检讨书500字
2014/10/17 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
刑事辩护词范文
2015/05/21 职场文书
Python制作动态字符画的源码
2021/08/04 Python