一文搞懂:【Python】torrentParser1.01

简介: 一文搞懂:【Python】torrentParser1.01

在昨天的版本上做了一些改进,如增加getAll,修改getSingleFileName等


代码:


#------------------------------------------------------------------------------------


# torrentParser1.01,用于解析torrent文件


# 2018年5月9日


#------------------------------------------------------------------------------------


from bencode import bdecode


import time


#-------------------------------------


# torrentParser类


#-------------------------------------


class torrentParser(object):


# 构造函数


def init(self,filePathname):


self.filePathname=filePathname


with open(filePathname,'rb') as fObj:


self.fileDic=bdecode(fObj.read())


# 得到所有键值


def getKeys(self):


return self.fileDic.keys()


# 得到全部内容


def getAll(self):


return self.fileDic;


# 获得tracker服务器的URL


def getAnnounce(self):


if 'announce' in self.fileDic:


return self.fileDic【'announce'】.decode('utf-8')


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'))


else:


retval.append(childArr.decode('utf-8'))


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') #去掉字符串前面的b'


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') # \x 开头编码的数据解码成中文


# 获得备注(可选项)


def getComment(self):


if 'comment' in self.fileDic:


return self.fileDic【'comment'】.decode('utf-8')


return ''


# 获得创建者(可选项)


def getCreatedBy(self):


if 'created by' in self.fileDic:


return self.fileDic【'created by'】.decode('utf-8')


return ''


# 多文件的情况下,得到多个文件的个数


def getFileCount(self):


return len(self.fileDic【'info'】【'files'】)


# 多文件的情况下,获得所有文件,返回为:dic


def getFiles(self):


files=【】


for item in self.fileDic【'info'】【'files'】:


file={}


for key in item.keys():


value=item.get(key)


if key=='path':


path=value【0】.decode()


value=path


if key=='path.utf-8':


path=value【0】.decode()


value=path


file【key】=value


files.append(file)


return files


# 单文件情况下,取文件名


def getSingleFileName(self):


#print(str(self.fileDic【'info'】【'name'】))


#return str(self.fileDic【'info'】【'name'】,'utf-8')


return self.getTitle();


# 单文件情况下,取文件长度


def getSingleFileLength(self):


return self.fileDic【'info'】【'length'】


# 单文件情况下,取文件md5sum


def getSingleFileMd5sum(self):


if 'md5sum' in self.fileDic【'info'】:


return str(self.fileDic【'info'】【'md5sum'】,'utf-8')


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"


//代码效果参考:http://hnjlyzjd.com/xl/wz_25474.html

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 main():


tp=torrentParser(filePathname='./5.torrent')


#print(tp.getBrief());


print(str(tp.getAll()));


# Start


main()


对只包含一个文件的torrent文件分析情况:


C:\Users\horn1\Desktop\python\40-torrentParser>python torrentParser.py


File:./5.torrent


announce:


announce list:


相关文章
|
JSON 前端开发 Android开发
Android MVI框架搭建与使用(上)
Android MVI框架搭建与使用(上)
440 0
|
存储 Java 程序员
Java 日志框架解析:汇总及最佳实践
在java的世界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j,现在比较流行的是slf4j+logback。作为开发人员,我们有时候需要封装一些组件(二方包)提供给其他人员使用,但是那么多的日志工具,根本没法保证每个组件里都能使用约定好的日志工具,况且还有很多第三方的包,鬼知道他会用什么日志工具。假如一个应用程序用到了两个组件,恰好两个组件使用不同的日志工具,那么应用程序就会有两份日志输出了,蛋疼吧。。 下面简单介绍下常见的日志工具:
12178 2
Java 日志框架解析:汇总及最佳实践
|
存储 自然语言处理 JavaScript
vben框架是什么
vben框架是什么
2807 0
|
存储 网络协议 网络虚拟化
SRv6 基本结构
【5月更文挑战第4天】SRv6是一种网络功能指令化技术,将128位IPv6地址用于表达网络操作。它将业务需求转化为有序指令列表,由网络设备执行,实现灵活的网络业务编排和定制。
【专栏】子网划分在现代网络工程中的重要性,包括管理网络、增强安全性和优化IP地址使用
【4月更文挑战第28天】本文介绍了子网划分在现代网络工程中的重要性,包括管理网络、增强安全性和优化IP地址使用。文章阐述了子网划分的原理,如通过子网掩码划分广播域以减少网络风暴。接着,详细说明了子网划分的方法,涉及需求分析、选择子网掩码、计算子网及广播地址等步骤,并提到了VLSM和CIDR等高效技术。最后,通过实例展示了如何进行子网划分,强调实践对于掌握这项技能的关键作用。学习子网划分能提升网络管理和设计能力。
627 4
|
Linux
kali2023.1更新内核
kali2023.1更新内核
961 0
|
Linux 网络安全 数据安全/隐私保护
|
人工智能
AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费
AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费
1048 0
|
Web App开发 JSON 缓存
HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题
HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题
|
数据可视化 机器人
使用AprilTag标记进行相机校准
AprilTags被广泛用作物体检测、定位应用的视觉标记,并作为相机校准的目标。AprilTags类似于QR码,但旨在编码更少的数据,因此可以更快地解码,这对于实时机器人应用程序非常有用。使用 AprilTags 作为校准模式的优点包括更好的特征点检测以及一致、可重复的检测。
2366 0