Python3 使用 bencode库 解析BT种子

前言

由于本人也是初学者,所以,请多包涵,本文使用的IDE是PyCharm2019

由于第一次写博客,多少有点拘谨

废话不多说,直接上代码

源码下载

https://download.csdn.net/download/qq_43777162/11834495

代码部分

首先导入bencode库

from bencode import *

导库:
建议使用pip 命令导入dencode库,我的已经安装好的,

因为pip install bencode导入的bencode库可能出问题报以下错误,

所以使用 pip install py3-bencode

然后编写解析类:

class GetTorrent():def getBT(self, file_path):with open(file_path, 'rb+') as fp:message = bdecode(fp.read())return messagedef getMessage(self, message, mode='print'):# print(type(message))print("发现了一下信息:")i_lsit = []if mode == 'print':for i in message:i_lsit.append(i)print(i)elif mode == 'return':return i_lsit# 获得tracker数据def getannounce(self, message, mode='print'):if mode == 'print':print("=" * 50, "announce", "=" * 50)print("announce的数据类型为:", type(message[b'announce']))print("tracker服务器列表:")print(message[b'announce'].decode())elif mode == 'return':return message[b'announce'].decode()# 获得备用备用tracker服务器列表def getannounce_list(self, message, mode='print'):line_lsit = []if mode == 'print':print("=" * 50, "announce-list", "=" * 50)print("announce-list的数据类型为:", type(message[b'announce-list']))print("备用tracker服务器列表:")for udp_list in message[b'announce-list']:for line in udp_list:line_lsit.append(line.decode)print(line.decode())elif mode == 'return':return line_lsit# 获得种子文件的注释def getcomment(self, message, mode='print'):if mode == 'print':print("=" * 50, "comment", "=" * 50)print(message[b'comment'].decode())elif mode == 'return':return message[b'comment'].decode()# 获得创建人或创建程序的信息def getcreatedby(self, message, mode='print'):if mode == 'print':print("=" * 50, "created by", "=" * 50)print("创建人或创建程序的信息:", message[b'created by'].decode())elif mode == 'return':return message[b'created by'].decode()# 获得编码方式(经测试,有相当一部分的BT种子没有该信息)def getencoding(self, message, mode='print'):if mode == 'print':print("=" * 50, "encoding", "=" * 50)print("encoding的类型是:", type(message[b'encoding']))print("获得编码方式:", message[b'encoding'].decode())elif mode == 'return':return message[b'encoding'].decode()# 关于下载的文件的信息(包含了文件名,还有是单文件还是多文件)def getinfo(self, message):# 获得每个文件里面的类容方法def getfilename(files_v):# 判断值是否为列表if isinstance(files_v, list):# 历遍列表for file_name in files_v:# 如果列表里面的字符串是bytes类型的则转码,否则直接输出if type(file_name) == bytes:return file_name.decode()else:return file_name# 当不是列表时,直接输出(一般为int型目前没发现其他类型)else:return files_vprint("=" * 50, "info", "=" * 50)# print("info的数据类型为:", type(message[b'info']))# 历遍所有的keysfor k in message[b'info'].keys():# print("key:", k)value = message[b'info'][k]# print("value", value)# 如果是filesif k == b'files':# 遍历files列表print("该BT种子里总共有%d个文件" % len(value))v_i = 0for v_list_dic in value:# 遍历列表里的字典得到每一个文件print("第%d个文件" % v_i)for files_k, files_v in v_list_dic.items():data = getfilename(files_v)if files_k == b'length':print("文件大小:%0.2f%s" % (data / 1024 / 1024, "MB"))elif files_k == b'path':print("文件名:", data)else:print(files_k, ":", data)v_i += 1;# 如果是是文件名:elif k == b'name':print("文件名:", value.decode())# 如果是文件的MD5校验和:elif k == b'md5sum  ':# print(type(value))print("长32个字符的文件的MD5校验和:", value)# 文件长度elif k == b'length':# print(type(value))print("文件长度,单位字节:", value / 1024, "KB")elif k == b'path':# print(type(value))print("文件的路径和名字:", value)elif k == b'piece length':# print(type(value))print("每个块的大小:", value / 1024 / 1024, "MB")elif k == b'pieces':# print(type(value))print("每个块的20个字节的SHA1 Hash的值(二进制格式) :", str(value))elif k == b'piece length':# print(type(value))print("每个块的大小,单位字节:", value, "B")# print("value", v)# 获得节点主机信息(好多BT种子没有)def getnode(self, message, mode='print'):if mode == 'print':print("=" * 50, "nodes", "=" * 50)print("nodes的数据类型为:", type(message[b'nodes']))print(message[b'nodes'])elif mode == 'return':return message[b'nodes']

代码测试

if __name__ == '__main__':# 创建解析对象gettorrent = GetTorrent()# 解析BT种子message = gettorrent.getBT(r"./test.torrent")# 将所有方法加入列表func_list = [gettorrent.getMessage,gettorrent.getannounce,gettorrent.getannounce_list,gettorrent.getcomment,gettorrent.getcreatedby,gettorrent.getencoding,gettorrent.getinfo,gettorrent.getnode]# 利用循环使用方法# 可能有一些信息是没有的,所以引发异常for func in func_list:try:func(message)except Exception as e:print("异常为:", e)continue

效果图

Python3使用bencode库解析BT种子相关推荐

  1. 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    直接上程序界面,了解整体工作流程是什么样子的,求服务器进行挂机测试,需要固定IP,空间大概需要10G左右(主要是BT种子占用空间过大),最好有SQLSERVER来做为存储数据库,目前采用的是ACCES ...

  2. B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器

    B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器 1.什么是B编码 2.B编码格式 3.种子文件结构 3.1.主文件结构 3.2.info结构 4.简单的例子了解一下种子文件和B编 ...

  3. # 解析bt文件_磁力链接和BT种子使用方法

    目前用的最多的是磁力链接和BT种子,不过好多人并不太会使用,因此写个教程给大家说明一下. 何为磁力链接:简单地说,磁力链接是一种特殊链接,但是它与传统基于文件的位置或名称的普通链接(如http://x ...

  4. java 解析/读取 种子/bt/torrent 内容

    碰到不会的技术问题,我还是先度娘.能中文看懂,为什么非要看英文呢. java 解析/读取 种子/bt/torrent  内容,这个度娘给的满意答案并不是很多.GG之后的搜索结果出现了stackover ...

  5. 用python实现bt下载_python实现bt种子 torrent转magnet

    Python实现bt转磁链 参考前人资料主要两种方式 1,利用python的bencode模块 2,安装libtorrent模块 尝试过两种方法特记录 环境:Windows系统 python 3 be ...

  6. python之bt种子,dht网络共享热门资源

    最近研究了dht网络,使用python写了个爬虫程序,另外用php做了个搜索网站,今天又把sphinx加上了,这样就是一个简单的bt种子搜索引擎了哈,网址:http://bt.dianfenxiang ...

  7. # 解析bt文件_BT、磁力链这些词语是什么意思?

    "知其然知其所以然".我们经常在下载资料的时候能看到BT.磁力链等词语,这些词语到底是什么意思呢? 下载都会用,但是你了解吗? BT下载 传统的下载模式是每个客户端从服务器拷贝文件 ...

  8. python下载bt文件_python获取bt种子的详细信息

    bt种子具体文件结构如下: 全部内容必须都为bencoding编码类型. 整个文件为一个字典结构,包含如下关键字 announce:tracker服务器的URL(字符串) announce-list( ...

  9. python编程入门指南磁力下载-实战Python语言实现BT种子转化为磁力链接

    本文主要向大家介绍了实战Python语言实现BT种子转化为磁力链接,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 经常看电影的朋友肯定对BT种子并不陌生,但是BT种子文件相对磁力 ...

  10. 使用Python Openssl库解析X509证书信息

    文章目录 X.509 证书结构描述 证书数据结构 源码 编译运行输出结果 参考文献 X.509 证书结构描述 常见的X.509证书格式包括: 对于常见的https证书 一般是用crt或者pem来保存, ...

最新文章

  1. 【综述】MV3D-Net、AVOD-Net 用于自动驾驶的多视图3D目标检测网络
  2. 转:Flash与.NET的通信(一):XMLConnector的应用
  3. 深度学习在美团点评推荐平台排序中的应用 widedeep推荐系统模型--学习笔记
  4. java获取ip地址不重复,如何在android(Java)中验证Ip地址[重复]
  5. java html entity encoding,实体“HTML.Version”的声明必须以''结尾
  6. python基础七--集合
  7. 博客之星年度总评选:巅峰之战,谁与争锋?
  8. nui UI 具有右键属性的菜单树
  9. ExtAspNet v3.1.9
  10. 老男孩LINUX50期_陈桂林决心书
  11. 同个网络找不到计算机打印机共享,局域网共享打印机搜索不到怎么办 局域网共享打印机搜索不到解决方法...
  12. qq传输文件腾讯服务器保存在哪里,电脑接收的QQ文件在哪里?在哪个文件夹可以找到QQ接收的文件...
  13. 快手正与NBA洽谈战略合作,涉及内容版权和商业化
  14. 肠道菌群失调与炎症性肠病的关联
  15. 村上春树(作品)年谱
  16. 微前端架构实现(项目引入,消息总线,构建部署,监听服务)
  17. ora00054 资源正忙
  18. lscpu与cat /proc/cpuinfo获取的CPU信息释义
  19. 二维图像卷积之后尺寸计算
  20. 百度地图绘制行驶轨迹、折线上添加箭头、修改地图底色

热门文章

  1. linux 区别 挂起 阻塞_踩坑之java执行linux命令死锁阻塞挂起
  2. java doctitle_Java ActionItem.setDocTitle方法代码示例
  3. oracle读取blob字段的方法,如何读取Oracle的BLOB字段里的文件?
  4. 【系列三之CentOS系列】CentOS命令操作(1)
  5. 【问题4】Redis 的并发竞争问题是什么?了解 redis 事务的 CAS 方案吗?
  6. cocoaPods:公有库私有库
  7. MongoDB的入门使用
  8. Apache Jemeter 参数化
  9. LOJ #6268. 分拆数
  10. 《软件构架实践》读后感-02