使用python-libtorrent在不下载种子的情况下获取对等列表

5 投票
1 回答
4698 浏览
提问于 2025-04-17 19:07

我在用Python和libtorrent库获取种子的对等方IP地址。我尝试了以下代码:

import libtorrent as lt
import time

ses = lt.session()
ses.listen_on(6881, 6891)
info = lt.torrent_info('test.torrent')
h = ses.add_torrent({'ti': info, 'save_path': './'})
print 'starting', h.name()
while (not h.is_seed()):
    s = h.status()
    p = h.get_peer_info()
    for i in p:
        print i.ip

    print "\n\n"

    sys.stdout.flush()

    time.sleep(1)

print h.name(), 'complete'

这个代码大致上能工作,但我遇到了两个问题:

  1. 种子已经下载完成。
  2. 在我收到一个对等方列表之前,这个循环执行了好几次。

你能帮我吗?

非常感谢!

1 个回答

7

没有一个统一的“对等节点列表”。你现在连接的节点就是你正在使用的对等节点。不过,还有一个概念是“整个网络中的所有对等节点”。

libtorrent可以告诉你你连接的对等节点,这意味着它们已经完成了uTP或TCP的三次握手。

通常,建立对等连接需要一些时间。你需要先找到对等节点,然后尝试连接它们,而这些节点也需要在线并且没有满员。这就是为什么你不会立刻连接到很多对等节点的原因。

听起来你对整个网络中的所有对等节点都感兴趣。但实际上,你不太可能找到每一个对等节点。对等节点可能不会向同一个跟踪器报告,它们可能通过PEX或DHT互相找到。很多对等节点是无法连接的,找到它们的唯一方法就是让它们主动找到你,但它们可能对这件事不感兴趣。

现在,如果你对下载这个种子文件不感兴趣,那你为什么还想要对等节点的IP地址呢?既然你不感兴趣,那为什么还要连接它们呢?

你可以简单地调用get_full_peer_list(),不过在Python的绑定中这个功能是不可用的。你也可以不断向跟踪器发送请求,收集得到的IP地址。

撰写回答