知道了 torrent 文件和格式,便可以利用它的 tracker 地址得到其它客户端来下载文件,查看 meta['announce']的内容,是一个 形如 http://tracker.cnxp.com:8080/announce 的地址,我们便可以向它请求来获得peers.
请求包括以下几个字段:
- info_hash 为 torrent 文件中 info 部分进行 encode 后的hashcode, 长度为20字节, 即 sha.new(bencode(info)).digest()
- peer_id 自已的客户端产生的20个字节的随机值
- ip 自己的IP
- port 自己监听的端口
- uploaded 为上传的流量
- downloaded 为下载的流量
- left 为未获取文件的大小
- compact 是否是用紧凑模式, 当为 1 时, 返回的peers 为6的整数倍, 并且没有对方的peerid
知道了这些, 我们就可以发送请求来获取peers 了, 发送格式为 http://tracker.com/?info_hash=xxx&peer_id=xxx ...., 由于数据并非全是ascII字符,所以需要使用 urllib.urlencode 转义, 当 compat 为0时,
返回的数据同样是使用 bencode 编码的, 解码后为一个字典,包括peers, interval 字段, peers 为一个列表,每一项为一个字典,包括
- ip
- port
- peer_id
interval 为查询要间隔的时间
当 compat 为1时, peers 为一个字段串, 每6个字节代表一个peer,前四个字节为ip(网络字节),后两个为port(网络字节)
这样我们就得到了其它使用bt的客户