【Python】torrentParser1.04 增加获得磁力链URI功能
代码:
#------------------------------------------------------------------------------------ # 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功能的更多相关文章
- python爬取某站磁力链
不同磁力链网站网页内容都不同,需要定制 1,并发爬取 并发爬取后,好像一会就被封了 import requests from lxml import etree import re from conc ...
- 开始 第一个自己的python爬虫程序 爬磁力链
不能一事无成,这么久了学python还是吊着,要落地,落在博客园好了,好像公司也只能上博客园了 昨天看了一篇用正则爬电影天堂的视频,直接拿来用,爬磁力吧,爬好玩的 #导入模块 import reque ...
- 利用迅雷提供的接口从磁力链得到bt种子文件
本地下载工具的磁力链下载速度不给力,而百度云盘有提供离线下载服务,相当于就是直接到服务器取个链接而已.但这需要bt文件,而我只有链力链.网上搜了一下,可以从磁力链构造一个bt文件的下载地址,用pyth ...
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- 据磁力链获得BT种子
最近研究了一下磁力链magnet和BT种子torrent文件之间的相互转换.其实通过torrent文件获得磁力链实现起来比较简单,但反过来并非是一个可逆的过程,磁力链转BT种子理论上来说是不可能实现的 ...
- javaScript系列 [04]-javaScript的原型链
[04]-javaScript的原型链 本文旨在花很少的篇幅讲清楚JavaScript语言中的原型链结构,很多朋友认为JavaScript中的原型链复杂难懂,其实不然,它们就像树上的一串猴子. 1.1 ...
- The Python Challenge 0-4
The Python Challenge 0-4 项目地址:http://www.pythonchallenge.com/ Level-0 提示Hint: try to change the URL ...
- 史诗级干货-python爬虫之增加CSDN访问量
史诗级干货-python爬虫之增加CSDN访问量 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
随机推荐
- Asp.net core使用IIS在windows上进行托管
摘要 最近项目中,尝试使用asp.net core开发,在部署的时候,考虑现有硬件,只能部署在windows上,linux服务器暂时没有. 部署注意事项 代码中启用iis和Kestrel public ...
- 基于设备树的TQ2440 DMA学习(3)—— DMA控制器驱动
作者 彭东林pengdonglin137@163.com 平台 TQ2440Linux-4.9 概述 上一篇直接操作DMA控制器实现了一个mem2mem的DMA传输,但是这样不符合linux driv ...
- Unity3D实践系列04, 脚本的生命周期
Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...
- android:activity活动的生命周期
掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命 周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的 游刃有余.你的应用程序将会拥有 ...
- Odoo进销存(采购、销售、仓库)入门教程 - 上
转载地址:http://blog.csdn.net/wangnan537/article/details/46434373 运行环境: Ubuntu14.04+Odoo8.0 作者:苏州-微尘 0. ...
- Odoo9发行说明
2015年10月1日,期待已久的Odoo9正式发布.本文是Odoo9正式版发行说明,基于官网资料翻译. 译者: 苏州-微尘原文地址:https://www.odoo.com/page/odoo-9-r ...
- IOS 内存斗争小史之 对象、指针、内存的基本理解
1.指针和对象,都是内存块.一个大,一个小.一个在栈中,一个在堆中. 2.iOS中,我们可以生命一个指针,也可以通过alloc获取一块内存. 3.我们可以直接消灭掉一个指针,将其置为nil.但是我们没 ...
- Android_深入解析AsyncTask
转载:特别感谢浪人的星空,有部分修改! http://blog.csdn.net/hitlion2008/article/details/7983449 1.AsyncTask的内幕 AsyncTas ...
- Tomcat启动log打印到INFO: At least one JAR was scanned for TLDs yet contained no TLD各种解决方式
问题: 启动tomcat时,catalina.out日志打印到如下内容就停止不动了,也不报错 SEVERE: FarmWarDeployer can only work as host cluster ...
- Android实现图片裁剪
MainActivity.java package com.kale.imagetailor; import java.io.File; import java.io.FileNotFoundExce ...