在上篇文章如何编写一个BT种子爬虫(二)里,我们了解了通过info-hash
(magnet:?xt=urn:btih:<info-hash>
,也就是磁力链
),得到种子metadata
(元数据)的底层协议。
本来打算基于libtorrent
来编写代码,但是libtorrent
是 C++ 编写的,我不太熟悉 C++(╯‵□′)╯︵┴─┴。官方也提供了其他语言的binding
,python/java/go/node,python是官方提供的,一直在维护,建议使用。其他库都是非官方的,除了java
的,最近的提交时间都较久远。
安装libtorrent
时,各种依赖库也是一件麻烦的事情。我原来打算使用go库,go库的最近一次提交时间是5年前,看来是没有继续维护了。虽然提供了Dockerfile,但是一直安装不成功,而且里面的依赖库版本都很旧。所以我放弃了(逃
如果你打算使用python,你可以阅读下官方库的这个issue get metadata info without downloading the complete file ,里面有通过磁力链下载种子的代码。
最后,我选用了go写的anacrolix/torrent库(3.2k start, 最近一次提交是2天前),功能和文档都很齐全的库,从2014年起,一直在维护中,基于这个库完全可以搭建一个功能强大的bt下载客户端。
通过磁力链获取种子元数据的代码也简单,我直接贴到下面。
package main
import (
"github.com/anacrolix/torrent"
"log"
)
func main() {
c, err := torrent.NewClient(nil)
defer c.Close()
if err != nil {
log.Fatalf("create client error: %v", err)
}
t, _ := c.AddMagnet("magnet:?xt=urn:btih:ZOCMZQIPFFW7OLLMIC5HUB6BPCSDEOQU")
<-t.GotInfo()
info := t.Info()
log.Print(info.Name)
}
运行代码,最后得到我们要下载的文件,文件名是ubuntu-14.04.1-desktop-amd64.iso
。(需要耐心等待一段时间,因为本机程序需要通过dht找到拥有种子文件的其他bt客户端,这一过程比较耗时。)
GOROOT=/usr/local/Cellar/go/1.13.6/libexec #gosetup
GOPATH=/Users/vstorm/go #gosetup
/usr/local/Cellar/go/1.13.6/libexec/bin/go build -o /private/var/folders/53/hd10bwhd7vjcj6324c39j52h0000gn/T/___go_build_github_com_vstorm_go_libtorrent github.com/vstorm/go_libtorrent #gosetup
/private/var/folders/53/hd10bwhd7vjcj6324c39j52h0000gn/T/___go_build_github_com_vstorm_go_libtorrent #gosetup
2020-03-26 14:19:33 server.go:923: dht server on 0.0.0.0:58538: falling back on starting nodes
2020-03-26 14:19:33 server.go:923: dht server on [::]:58538: falling back on starting nodes
2020-03-26 14:19:33 server.go:923: dht server on 0.0.0.0:58538: falling back on starting nodes
2020-03-26 14:19:33 server.go:923: dht server on [::]:58538: falling back on starting nodes
2020-03-26 14:19:35 portfwd.go:30: discovered 0 upnp devices
2020-03-26 14:19:48 client.go:332: dht server on [::]:58538 completed bootstrap (dht.TraversalStats{NumAddrsTried:8, NumResponses:0})
go-libutp: 2020/03/26 14:20:31 callbacks.go:75: error sending packet: write udp4 0.0.0.0:58538->0.81.57.17:8064: sendto: no route to host
go-libutp: 2020/03/26 14:20:34 callbacks.go:75: error sending packet: write udp4 0.0.0.0:58538->0.81.57.17:8064: sendto: no route to host
go-libutp: 2020/03/26 14:20:40 callbacks.go:75: error sending packet: write udp4 0.0.0.0:58538->0.81.57.17:8064: sendto: no route to host
go-libutp: 2020/03/26 14:20:41 callbacks.go:75: error sending packet: write udp4 0.0.0.0:58538->0.81.57.17:8064: sendto: no route to host
2020/03/26 14:20:42 ubuntu-14.04.1-desktop-amd64.iso
Process finished with exit code 0