【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 ...
随机推荐
- FFMPEG采集摄像头数据并切片为iPhone的HTTP Stream流
一.Windows下面编译ffmpeg 首先需要解决的问题是:在windows下面编译 ffmpeg, 并让其支持dshow, 本人把ffmpeg编译成功了, 但是编译出来的ffmpeg不支持dsho ...
- 【教程】新手如何制作简单MAD和AMV,学不会那都是时辰
[教程]新手如何制作简单MAD和AMV,学不会那都是时 http://tieba.baidu.com/p/2303522172 [菜鸟教你做MAD]Vegas制作MAD入门教程 http://tieb ...
- Delphi 类的类 class of 用法
http://blog.csdn.net/blue_morning/article/details/8815609 Delphi 类的类 class of 用法 这个概念本来在一个关于Delphi ...
- AutoMapper在MVC中的运用07-映射在订单场景的例子
本文参考了Taswar Bhatti的博客,他写了<Instant AutoMapper>这本书.遗憾的是,这本电子版书在国内还买不到,也下载不到.也只能从他的有限几篇博文中来窥探一二了. ...
- log4j deadlock
用了这么久的Log4j这次倒下了,而且官方也还没有给出解决方案. 描述:tomcat 经过一天多时间的访问,出现了hang ,使用 Jstack 查看堆栈后,发现现成 blocked ,主要是 Log ...
- ASIHTTPRequestErrorDomain Code=5
ASIHttpRequest解析带空格的URL时 出错!!!(已解决) 用的是post请求 URL 地址是: http://111.234.51.56/login_member.pl?time=201 ...
- WordPress基础:wp_list_pages显示页面信息列表
函数:wp_list_pages($args) 作用:列出某个分类下的分类项目 常见参数说明: 参数 用途 值 sort_column 排序方式 post_title 按标题排序 [默认] m ...
- python测试开发django-42.auth模块登陆认证
前言 在开发一个网站时,经常会用到用户的注册和登陆相关的账号管理功能,auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. 像用户注册.用户登录.用户认证.注销 ...
- python测试开发django-40.模型(model)中choices使用
前言 之前一直在想页面上如果一个字段只有固定的几个选项,类似select下拉框这种,如果在表里面设置一个外键的话,是不是有点傻了,这样为了几个选项弄一张表不值得. 后来看到Django模型中的字段有个 ...
- 用开源项目cropper实现对图片中任意部分进行裁剪
红色区域为截图控件的区域. 开源项目地址:https://github.com/edmodo/cropper croper这个开源项目可以对一个图片进行任意区域的街区,并且可以设置图片的旋转角 ...