使用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系列之数据处理编程实例(一)
May 22 Python
Python中文竖排显示的方法
Jul 28 Python
python轻松查到删除自己的微信好友
Jan 10 Python
Python文件处理
Feb 29 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
用Python批量把文件复制到另一个文件夹的实现方法
Aug 16 Python
Django框架反向解析操作详解
Nov 28 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
python游戏开发的五个案例分享
Mar 09 Python
python属于跨平台语言码
Jun 09 Python
用sleep间隔进行python反爬虫的实例讲解
Nov 30 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
php+mysql事务rollback&amp;commit示例
2010/02/08 PHP
php字符集转换
2017/01/23 PHP
PDO::errorInfo讲解
2019/01/28 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
js中function()使用方法
2013/12/24 Javascript
js实现表格字段排序
2014/02/19 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
Python中变量交换的例子
2014/08/25 Python
Python装饰器使用示例及实际应用例子
2015/03/06 Python
python实现获取Ip归属地等信息
2016/08/27 Python
Python实现通讯录功能
2018/02/22 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
python scipy卷积运算的实现方法
2019/09/16 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
《两只鸟蛋》教学反思
2014/02/10 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
开展读书活动总结
2014/06/30 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python