在昨天的版本上做了一些改进,如增加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: