代码:

#------------------------------------------------------------------------------------
# torrentParser1.04,用于解析torrent文件
# 增加了函数getMegnet,能将种子文件转磁力链
# 2018年5月13日
#------------------------------------------------------------------------------------
from bencode import bdecode,bencode
import time
import hashlib
import base64

#-------------------------------------
# torrentParser类
#-------------------------------------
class torrentParser(object):
    # 构造函数
    def __init__(self,filePathname):
        self.filePathname=filePathname
        with open(filePathname,'rb') as fObj:
            self.fileDic=bdecode(fObj.read()) 

    # 得到文件路径名
    def getFilepathname(self):
        return self.filePathname

    # 得到所有键值
    def getKeys(self):
        return self.fileDic.keys()

    # 得到全部内容
    def getAllContent(self):
        return self.fileDic;

    # 得到文件结构
    def getStructure(self):
        retval=''
        layer=0

        for key in self.fileDic.keys():
            value=self.fileDic[key]
            retval=retval+self.getNextNode(key,value,layer)

        return retval

    # 向下递归查找文件结构,
    def getNextNode(self,key,value,layer):
        retval="";
        layer+=1

        if type(value)==type({}) and len(value.keys())>0:
            for i in range(1,layer+1):
                retval=retval+"\t"
            retval=retval+str(key)+"\n"

            for k in value.keys():
                v=value[k]
                retval=retval+ self.getNextNode(k,v,layer)
        elif type(value)==type([]) and len(value)>0:
            for i in range(1,layer+1):
                retval=retval+"\t"
            retval=retval+str(key)+"\n"

            arr=value

            for it in arr:
                if type(it)==type({}) and len(it.keys())>0:
                    for nk in it.keys():
                        nv=it[nk]

                        retval=retval+''+self.getNextNode(nk,nv,layer)
        else:
            for i in range(1,layer+1):
                retval=retval+"\t"

            showValue=str(value)[0:50] # 显示的值

            retval=retval+str(key)+":"+showValue+"\n"

        return retval

    # 获得tracker服务器的URL
    def getAnnounce(self):
        if 'announce' in self.fileDic:
            return self.fileDic['announce'].decode('utf-8','ignore')
        return ''

    # 获得tracker服务器的URL列表
    def getAnnounceList(self):
        retval=[]

        if 'announce-list' in self.fileDic:
            arr=self.fileDic['announce-list']

            for childArr in arr:

                if type(childArr)==type([]):
                    for item in childArr:
                        retval.append(item.decode('utf-8','ignore'))
                else:
                    retval.append(childArr.decode('utf-8','ignore'))

        return retval

    # 得到制作日期
    def getCreateTime(self):
        if 'creation date' in self.fileDic:
            unixTimestamp=self.fileDic['creation date']
            firmalTime = time.localtime(unixTimestamp)
            dt = time.strftime('%Y-%m-%d %H:%M:%S', firmalTime)

            return dt
        else:
            return ''

    # 获得编码方式
    def getEncoding(self):
        if 'encoding' in self.fileDic:
            return self.fileDic['encoding'].decode('utf-8','ignore')
        return ''

    # 是否包含多个文件
    def hasMultiFiles(self):
        if 'files' in self.fileDic['info']:
            return True
        else:
            return False

    # 获得文件名
    def getTitle(self):
        arr=[]
        info = self.fileDic['info'] 

        if 'name.utf-8' in info:
            arr=info['name.utf-8']
        else:
            arr = info['name'] 

        #print(str(arr))

        return arr.decode('utf-8','ignore') 

    # 获得备注(可选项)
    def getComment(self):
        if 'comment' in self.fileDic:
            return self.fileDic['comment'].decode('utf-8','ignore')
        return ''

    # 获得创建者(可选项)
    def getCreatedBy(self):
        if 'created by' in self.fileDic:
            return self.fileDic['created by'].decode('utf-8','ignore')
        return ''

    # 多文件的情况下,得到多个文件的个数
    def getFileCount(self):
        return len(self.fileDic['info']['files'])

    # 多文件的情况下,获得所有文件
    def getFiles(self):
        files=[]

        for item in self.fileDic['info']['files']:
            file={}

            for key in item.keys():
                value=item.get(key)

                if key=='path':
                    #print('1.'+str(value))
                    #print('10.'+str(value[0]))
                    path=value[0].decode('utf8','ignore')
                    value=path
                if key=='path.utf-8':
                    #print('2.'+str(value))
                    #print('20.'+str(value[0]))
                    path=value[0].decode('utf8','ignore')
                    value=path

                file[key]=value

            files.append(file)

        return files

    # 单文件情况下,取文件名
    def getSingleFileName(self):
        return self.getTitle();

    # 单文件情况下,取文件长度
    def getSingleFileLength(self):
        return self.fileDic['info']['length']

    # 单文件情况下,取文件md5sum
    def getSingleFileMd5sum(self):
        if 'md5sum' in self.fileDic['info']:
            return self.fileDic['info']['md5sum'].decode('utf-8','ignore')
        else:
            return ''

    # 单文件情况下,取文件长度
    def getSingleFilePieceLength(self):
        return self.fileDic['info']['piece length']

    # 单文件情况下,取文件pieces
    def getSingleFilePieces(self):
        return self.fileDic['info']['pieces']

    # 得到文件简报
    def getBrief(self):
        retval=""
        retval=retval+"File:"+self.filePathname+"\n"
        retval=retval+"announce:"+self.getAnnounce()+"\n"

        arr=self.getAnnounceList()
        if(len(arr)>0):
            retval=retval+"announce list:"+"\n"

            for it in arr:
                retval=retval+"\t"+it+"\n"    

        retval=retval+"Create time:"+self.getCreateTime()+"\n"
        retval=retval+"Ecoding:"+self.getEncoding()+"\n"
        retval=retval+"Title:"+self.getTitle()+"\n"
        retval=retval+"Comment:"+self.getComment()+"\n"
        retval=retval+"Created by:"+self.getCreatedBy()+"\n"

        hasMulti=self.hasMultiFiles()
        retval=retval+"has multi files:"+str(hasMulti)+"\n"
        if hasMulti==True:
            retval=retval+"[多文件结构]"+"\n"

            retval=retval+"包含文件个数为:"+str(self.getFileCount())+"\n"
            retval=retval+"Files:"+"\n"

            files=self.getFiles();
            index=1
            for item in files:
                retval=retval+"\tfile#"+str(index)+"\n"    

                for key in item.keys():
                    value=item.get(key)
                    retval=retval+"\t\t"+str(key)+":"+str(value)+"\n"
                retval=retval+"\n"    

                index=index+1
        else:
            retval=retval+"[单文件结构]"+"\n"
            retval=retval+"文件名为:"+self.getSingleFileName()+"\n"
            retval=retval+"文件长度:"+str(self.getSingleFileLength())+"byte\n"
            retval=retval+"文件md5sum:"+self.getSingleFileMd5sum()+"\n"
            retval=retval+"文件块长度:"+str(self.getSingleFilePieceLength())+"byte\n"

        return retval

    # 得到磁力链
    def getMegnet(self):
        info=self.fileDic['info']
        arr=bencode(info);
        diggest=hashlib.sha1(arr).digest()
        b32hash=base64.b32encode(diggest)
        return 'magnet:?xt=urn:btih:'+str(b32hash,'utf-8')

#-------------------------------------
# 入口
#-------------------------------------
def main():
    tp=torrentParser(filePathname='./5.torrent')
    print('文件名='+tp.getFilepathname())
    print('文件结构:\n'+tp.getStructure())
    print('文件简报:\n'+str(tp.getBrief()))
    #print('文件内容:\n'+str(tp.getAllContent()))
    print('磁力链:\n'+str(tp.getMegnet()))

# Start
main()

输出:

C:\Users\horn1\Desktop\python\46-torrentParser>python torrentParser.py
文件名=./5.torrent
文件结构:
        announce:b'udp://tracker.openbittorrent.com:80'
        announce-list
        comment:b'This torrent is downloaded from btkitty.me , sto
        creation date:1496866967
        encoding:b'UTF-8'
        info
                length:1385343970
                name:b'SIRO-1690 \xa4\xca\xa4\xca \xcc\xd2\xb9\xc8\xbb\
                name.utf-8:b'SIRO-1690 \xe3\x81\xaa\xe3\x81\xaa \xe6\xa1\x83\
                piece length:1048576
                pieces:b'S\x06\xa4\x18\xed\x9d\xa5\xd9r\xc4^O\x1b\xefs\xe
        publisher:b'btkitty.me'
        publisher-url:b'http://btkitty.me'

文件简报:
File:./5.torrent
announce:udp://tracker.openbittorrent.com:80
announce list:
        udp://open.demonii.com:1337
        udp://tracker.coppersurfer.tk:6969
        udp://tracker.leechers-paradise.org:6969
        udp://tracker.blackunicorn.xyz:6969
Create time:2017-06-08 04:22:47
Ecoding:UTF-8
Title:SIRO-1690 なな 桃谷绘里香 桃谷エリカ Erika Momotani20歳 豆腐屋.wmv
Comment:This torrent is downloaded from btkitty.me , storebt.com
Created by:
has multi files:False
[单文件结构]
文件名为:SIRO-1690 なな 桃谷绘里香 桃谷エリカ Erika Momotani20歳 豆腐屋.wmv
文件长度:1385343970byte
文件md5sum:
文件块长度:1048576byte

磁力链:
magnet:?xt=urn:btih:H5X5LYB3CPDSUJH4WKVKKTDI5QQGY4JH
magnet:?xt=urn:btih:H5X5LYB3CPDSUJH4WKVKKTDI5QQGY4JH 就是要获得的磁力链,拷贝到迅雷试试看吧。

2018年5月13日

【Python】torrentParser1.04 增加获得磁力链URI功能的更多相关文章

  1. python爬取某站磁力链

    不同磁力链网站网页内容都不同,需要定制 1,并发爬取 并发爬取后,好像一会就被封了 import requests from lxml import etree import re from conc ...

  2. 开始 第一个自己的python爬虫程序 爬磁力链

    不能一事无成,这么久了学python还是吊着,要落地,落在博客园好了,好像公司也只能上博客园了 昨天看了一篇用正则爬电影天堂的视频,直接拿来用,爬磁力吧,爬好玩的 #导入模块 import reque ...

  3. 利用迅雷提供的接口从磁力链得到bt种子文件

    本地下载工具的磁力链下载速度不给力,而百度云盘有提供离线下载服务,相当于就是直接到服务器取个链接而已.但这需要bt文件,而我只有链力链.网上搜了一下,可以从磁力链构造一个bt文件的下载地址,用pyth ...

  4. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  5. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  6. 据磁力链获得BT种子

    最近研究了一下磁力链magnet和BT种子torrent文件之间的相互转换.其实通过torrent文件获得磁力链实现起来比较简单,但反过来并非是一个可逆的过程,磁力链转BT种子理论上来说是不可能实现的 ...

  7. javaScript系列 [04]-javaScript的原型链

    [04]-javaScript的原型链 本文旨在花很少的篇幅讲清楚JavaScript语言中的原型链结构,很多朋友认为JavaScript中的原型链复杂难懂,其实不然,它们就像树上的一串猴子. 1.1 ...

  8. The Python Challenge 0-4

    The Python Challenge 0-4 项目地址:http://www.pythonchallenge.com/ Level-0 提示Hint: try to change the URL ...

  9. 史诗级干货-python爬虫之增加CSDN访问量

    史诗级干货-python爬虫之增加CSDN访问量 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

随机推荐

  1. linux网络编程:splice函数和tee( )函数高效的零拷贝

    splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #include <fcntl.h> ssize_t splice(int ...

  2. 从.snk文件导出密钥

    先声明该文的实用性不强, 要产生一对密钥可以有更简单的方法.该文简单解释了.snk文件的格式,并给出了从中提取密钥的C#代码. .snk文件(Strong Name Key)也可以叫签名文件,它一般用 ...

  3. AngularJS表单验证,手动验证或自动验证

    AngularJS的表单验证大致有两种,一种是手动验证,一种是自动验证. 手动验证 所谓手动验证是通过AngularJS表单的属性来验证.而成为AngularJS表单必须满足两个条件:1.给form元 ...

  4. 初识GRUNT

    什么是GRUNT? 基于任务的命令行工具.能做的事包括: ● 验证html,css, javascript● 压缩css, javascript● 编译CoffeeScript, TypeScript ...

  5. 用delphi实现完美屏幕截图

    可以截取layered窗口(包括透明窗口)的代码: procedure CaptureScreen(AFileName: string);const  CAPTUREBLT = $40000000;v ...

  6. 用UICollectionView实现无限轮播图

    用UICollectionView实现无限轮播图 效果 源码 https://github.com/YouXianMing/Animations 细节

  7. 侏罗纪世界2百度云在线观看迅雷下载高清BT下载

    原名:Jurassic World: Fallen Kingdom 地区:美国 语言:英语 首播:2018-06-15(中国大陆) / 2018-06-22(美国) 电视台: 类型:动作 / 科幻 / ...

  8. Android判断用户的网络类型(2/3/4G、wifi)

    很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑.但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下. 一加手机一代,移动4G 网络,得到的subtype类型值为17 ...

  9. python 直方图hist

    import sys sys.path.append('/usr/local/lib/python2.7/site-packages') sys.path.append('/usr/lib/pytho ...

  10. WinForm 自动完成控件实例代码简析

    在Web的应用方面有js的插件实现自动完成(或叫智能提示)功能,但在WinForm窗体应用方面就没那么好了. TextBox控件本身是提供了一个自动提示功能,只要用上这三个属性: AutoComple ...