想做个磁力链搜索引擎 1

最近突然想做个磁力链搜索引擎
预计想分3步走
1.写个磁力链下载器
2.写个DHT网络爬虫
3.搭个磁力链搜索网站

自己一个人鼓捣了几天了,第一步的进度才迈出第一步。。。。不知道最后能不能实现。

part1 磁力链原理的简单介绍。

磁力链和种子是两种东西,这首先要分得清。磁力链实际上是bt协议的一个拓展协议。(这里是bt协议的地址http://www.bittorrent.org/index.html)
常见的磁力链格式如下
magnet:?xt=urn:btih:b68d400d25a8bc977f9f711c4068f3624bec87c0&dn=【MGRT&幻之字幕组】【剧场版】我想吃掉你的胰脏 我想吃了你的胰脏 君の膵臓をたべたい【简体内嵌】【720P】.mp4
磁力链的实际参数比上面这个链接还要多
感兴趣的可以看看这篇博客
https://blog.csdn.net/Cony_14/article/details/50888073
虽然参数很多,但磁力链中最关键的部分是最前面那串hash加密的特征码。这个特征码是对种子进行hash加密得到的,类似资源的身份证,只要你有这个身份证,就可以找到该资源,其他参数实际上省去也没什么关系。

part2 有了磁力链,我们怎么下载到种子文件
这里下载方法有两种
1.到种子库通过磁力链检索
2.通过DHT网络寻找。

第一种方法。其实就是上网找可用的种子库,利用别人存储的种子库找到资源。这种方法最便捷。最常见的种子库当然是迅雷啦。不过迅雷的种子库早关闭了。我抓包抓了半天也没分析出它现在的请求结构。不过在网上逛了半天,倒是让我找到了一个种子库
想做个磁力链搜索引擎 1_第1张图片
网址为http://storetorrents.co/ btkitty这个磁力链搜索站就是用的这个种子库。
这个种子库的请求构造其实也挺简单的。
python访问代码如下

import requests,json,re
from pyquery import PyQuery as pq
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) thunderx/1.0.0 Chrome/59.0.3071.115 Electron/1.8.6 Safari/537.36',
}
#通过磁力链从storeTorrent网址获取种子,网址为http://storetorrents.com
def getFromStoreTorrents(hash):
    baseUrl = "http://storetorrents.com/torrent/"
    url = "https://storetorrents.xyz/download"
    r = requests.get(baseUrl+hash+".html",headers=headers)
    doc = pq(r.text)
    key = doc("#downloadform div.downbox input[name='key']").attr("value")
    params = {
        'key': key,
        'infohash': hash,
    }
    r = requests.post(url,data=params,headers=headers)
    with open("E:/test.torrent","wb") as f:
        f.write(r.content)
    return r.content


if __name__ == "__main__":
    hash = 'b68d400d25a8bc977f9f711c4068f3624bec87c0'
    torrent = getFromStoreTorrents(hash)

这样就实现了利用磁力链下载种子了。

至于第二种方法:
现在还没实现。留个坑吧。

part3 种子解析
我们用记事本打开种子文件,会看到类似这样的文本
想做个磁力链搜索引擎 1_第2张图片
1.为什么全是乱码。这主要是用于种子文件的主体部分是hash校验码,sha1 的hash校验码是由20个字节组成的,一个字节有8位,而一个16进制数只有4位,所以实际上20个字节压缩了40个16进制数。如AA这个16进制数为编码的时候为10101010,并不是00001010 00001010,我们从网上将种子文件下载下来以后,编码什么的都是按字节读取编码的,所以对于AA计算机将其看成一个字节了,如果是utf8编码,它会找对应的字符,如果字符在utf-8中没有映射,则会报错,有映射但是不可显示,就会一堆乱码。
当然,还有一些乱码是由于编码格式不正确,例如一些标题乱码。这个在编码的时候转化一下就好了。主要还是hash校验码显示乱码

2.种子文件是利用bdecode编码的。不了解的可以百度一下。所以,如果要解析出文本,我们还需要对于文本进行解码。解码这个还是比较麻烦的,网上有一些bdecode解码的包,也有用c,用php写的代码,试了几个,有些问题。而且,不太符合我的期望。我就自己写了一个。解码主要思路是利用编译的方法,自顶向下分析得到语法分析树,再进行切分,编码主要就是利用回填的方法,编码比解码简单多了。有兴趣的可以看看,代码放在最后。

part3 种子结构介绍
种子下载下来了,解析也解析完成,让我们分析一下种子的结构吧。
种子文件中包含了资源的目录信息(该资源含有哪些信息),资源的发布者,资源大小,各片段的hash校验码等等,贴上一张我解析出来的种子结构
想做个磁力链搜索引擎 1_第3张图片
在这里插入图片描述

我将种子中的bencode格式的文本,转化为了json格式的文本。将hash加密后得到的乱码数据,转化为了10进制的数据。一个十进制数表示两个16进制数合并。
我们可以看见这个种子文件包含
announce:tracker主服务器的地址
announce-list:同样是tracker服务器的地址。
comment:评论,注释
creation date:创建时间,应该是时间戳
encoding:编码
info:种子的主体信息
info.length:文件大小
info.name:文件名
piece length:每个文件块的大小,用Byte计算,其实就是文件的分块,bt资源文件是分块传输并加密的。这个表示分块的大小。
pieces:各分块hash校验码,一块校验码长度为20字节(注意是字节,表示成16进制实际上有40个数字,因为一个16进制数占4位)。故pieces总长为20的整数倍。我再代码中将其都切分出来了弄成一个列表了。
publisher:文件发布者的名字
publisher-url:发布者的url
node:最后的一个字段是nodes字段,这个字段包含一系列ip和相应端口的列表,是用于连接DHT初始node (这个我这个种子里没有)。
实际上还可能有其他奇怪的参数。比如ed2k,filehash。

目前就做到这里了。感觉进度还是很慢的。
种子编码,解码代码 (因为想做个网站,代码是用java写的)https://github.com/yyyhah/BtDownload/blob/master/TorrentDownload/ParseTorrent.java

你可能感兴趣的:(想做个磁力链搜索引擎 1)