在上篇文章如何编写一个BT种子爬虫(二)里,我们了解了通过info-hashmagnet:?xt=urn:btih:<info-hash>,也就是磁力链),得到种子metadata(元数据)的底层协议。

本来打算基于libtorrent来编写代码,但是libtorrent是 C++ 编写的,我不太熟悉 C++(╯‵□′)╯︵┴─┴。官方也提供了其他语言的bindingpython/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
Last modification:March 26th, 2020 at 02:38 pm
如果觉得我的文章对你有用,请尽情赞赏 🐶