2023年11月25日发(作者:)
BT下载与⽤python轻松⾃建种⼦搜索引擎
使⽤效果图
在腾讯云最低配服务器上跑了两天的效果,可以看出速度还是很快的,⼀天上万种⼦。
快速安装
linux使⽤:在python3的虚拟环境下(⼩⽩可以参看云服务器简单配置)就安装好了种⼦爬⾍,在虚拟环境下命令⾏执
pip3 install magneticod
⾏就可以运⾏了,等待⼀会⼉,可以看到如下的⽇志输出,表明爬⾍正在运⾏,并且收集到种⼦了。
magneticod
(也可以使⽤运⾏显⽰更详细的信息,参数表⽰输出debug信息。)
magneticod -d-d
⽹页显⽰与查询功能安装,同样在虚拟环境下就好了,然后命令⾏就可以运⾏在
pip install magneticowmagneticow --port 8080 --user ⽤户名 密码
8080端⼝了。使⽤访问,输⼊⾃⼰更改的⽤户名和密码即可。
localhost:8080
然后解压进⼊magneticod⽂件夹,在当前⽬录打开命令⾏,安装,再进⼊magneticow⽂件夹同样命令安装。还需要做
python install
⼀件事,就是找到你的python动态链接库中的(我的在路径下),在SQLite Download Page找到适合你版本的
Anaconda3DLLs
sqlite-dll替换掉它,我⽤的是。(参考stackoverflow)这样就可以成功运⾏了。
windows的使⽤效果不如linux(暂时认为是windows的bug,udp也会报错——),限制速
[WinError 10054] 远程主机强迫关闭了⼀个现有的连接
度之后就会好。
windows不限速
种⼦与磁⼒链接
说实话,作为⼀个从不开车、偶尔上车的良好公民 :),我对这些东西的了解⼗分有限。
我⼀直习惯使⽤的是基于ipv6的⾮公开BT站点,类似北邮⼈BT、6维空间这样需要注册的BT站点。想要资源时,在站点上下载相应的种⼦
(torrent)⽂件,使⽤utorrent客户端下载即可,⾄于其中的原理不求甚解,⼤概知道的就是下载完成该资源且开启ut客户端的⽤户越多我的下
载速度越快,同时下载的⼈越多速度越快,因为下载的同时会互相上传⽂件的不同部分给对⽅,下载完成后要尽保种的义务,尽量开启ut客户
端,⽅便其他⽤户下载该资源,增加我的上传量。分享⽂件做种时,要⽣成⼀个种⼦⽂件,并提交到站点服务器。
为了有更清楚的认知,打开ut客户端研究⼀下,顺便下载下权⼒的游戏最新集。⽤ut客户端打开种⼦进⾏下载,在下载时观察下⾯的状态栏,
第⼆栏就是Trackers,看来是⾮常关键的⼀个东西。
原来,该BT站点提供了⼀个Tracker服务器(倒数⼀⼆⾏),记录了所有下载者的信息或者⽂件分享者的信息,当我下载⽂件时,这个服务器
⽽最关键的信息全在字典中,它是种⼦⽂件元信息。点开查看详细内容。可以看到下载⽂件的分块机制和我们之前在ut客户端看到的⼀
info
致。在种⼦⽂件的元信息中包含了所有内容信息,以及所有分块的哈希验证码(数字指纹),来确保⽂件的真实性。在下载时我们会向种⼦⽂
除了种⼦,我们还会遇到磁⼒链接,如下图,磁⼒链接⼜是什么呢?
或者我们也可以到提供服务的站点,如,由哈希码得到相应种⼦⽂件再进⾏下载。
通过磁⼒链接中的info_hash码获取种⼦⽂件
(此外还有⽤户交换 (PEX)协议,暂不讨论)
源码分析
注:⽹络分享繁多,很多话的正确性都不是那么⾼,深⼊探索还得⾃⼰去读官⽅英⽂协议和论⽂。别⼈的话都只是你通往
更⾼处的⼀个垫脚⽯,不能停留在上⾯。
由于在初始化时已经从⼤的Tracker服务器获取了⼀定量的节点信息,接下来向这些节点发送请求,参数中:1. 将⾃⼰的ID构造成被
find_node
请求节点的(按异或)相近ID(代码为函数,如向ID为A的节点发送请求,将⾃⼰ID构造成,也就是构
get_neighborfind_nodeA[:end]+X[:20-end]
造的ID的前end位与A节点ID相同,⽽后(20-end)位随意,end取10-15,这样伪装成A的周边节点,⽽按规则每个节点对周边节点的感知能⼒
要好,它很可能将你记录在它的路由表上,使得它⾃⼰或引导其他节点主动向你通信),2. 要查找的节点ID随机⽣成即可。⼤部分随机⽣成的
节点ID是不可能直接查找到的,那么被请求节点会返回另⼀批节点信息,在接受到返回的新节点信息后,向新节点继续发送请求,依此迭代进
⾏,⽬的就是不断地和其他节点混脸熟,即函数。这⾥维护了⼀个有限长的双端队列(deque)存储节点。节点不断从队⾸
auto_send_find_node
取出,向其发送请求,收到的应答中的新节点不断被添加到队尾。如果队列为空,则重新初始化⼀下。
find_node
⼀旦和越来越多的节点混脸熟了,就会有不断的查询请求从其他节点发送过来,作为爬⾍,只要处理和请求就够
get_peersannounce_peer
了。是⼀个节点向另⼀个节点发出的查询与相关的下载者信息,包含的参数就是我们需要的种⼦的info_hash,
get_peersinfo_hashinfo_hash
但是,中包含的info_hash对应的种⼦可能已经失效或者难连接上,不采⽤。这时我们要回应它,关键是给他⼀个(⾃⼰以⼀
get_peerstoken
定⽅式⽣成,不固定,⽤来校验的)与⼀个空的参数(我们没有种⼦的下载者信息,按协议应当返回最有可能有该信息的K个节点给查
nodes
询节点,但是也可以返回空值)。
这个向我查询的节点如果最终(通过其他节点)找到了资源(其他下载者,即peer),⽽控制该节点的下载者开始下载资源了,该节点很可能
向我发送消息,该消息告诉我们它的下载者信息。消息参数中的info_hash和下载者地址就是我们需要的,同时要验证参数中
announce_peer
的是否就是我之前发送给该节点的,保证真实性。返回给它的消息只是⾃⼰节点的ID。
token
对于其他节点发送给⾃⼰的和查询不⽤管即可。(可以思考,对于这两种查询是否有某种响应⽅式可以给⾃⼰带来更多收益)
pingfind_node
以上就是simDHT的内容了。
在处理消息时,⽤新建异步任务来抓取种⼦元信息,且对同⼀个种⼦元信息的多个抓取进⾏管理。
announce_peer_future
在数据存储⽅⾯使⽤了python⾃带的sqlite,不⽤安装就能使⽤,很⽅便。数据库存储位置管理使⽤了appdirs库。
作者表⽰近期会有⼀次⼤的重构,让我们拭⽬以待。
论⽂
Kademlia: A Peer-to-Peer Information System Based on the XOR Metric
A Torrent Recommender based on DHT Crawling
Real-World Sybil Attacks in BitTorrent Mainline DHT
Measuring large-scale distributed systems: case of BitTorrent Mainline DHT
Crawling BitTorrent DHTs for Fun and Profit
可⽤参考
如何通过infohash得到torrent种⼦⽂件?
种⼦⽂件 - Torrent file
BT服务器/tracker服务器 - BitTorrent tracker - Trackerless torrents
分布式散列表
Kademlia算法
其他
/
响应


发布评论