You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

libtorrent Python版创建种子后无法被客户端下载,无法找到Peer节点

libtorrent创建的种子无法被BT客户端下载的排查与修复

以下是针对你代码中可能导致问题的几个关键点及修复方案:

1. 缺少会话关键网络配置

默认libtorrent会话未启用端口映射、DHT等核心功能,其他客户端无法通过网络定位到你的种子节点。需补充配置确保网络连通性:

  • 启用UPnP/NAT-PMP自动端口映射,让外部能访问你的监听端口
  • 开启DHT网络,即使tracker失效也能通过DHT发现peer
  • 设置固定监听端口范围,避免随机端口被防火墙拦截

2. 文件哈希与路径一致性问题

lt.set_piece_hashes(t, ".")基于当前工作目录计算文件哈希,做种时若文件路径与创建种子时不一致,会导致哈希不匹配,客户端无法正常下载。建议使用绝对路径确保一致性,同时强制校验文件哈希。

3. Tracker有效性问题

你添加的部分tracker可能已失效,无法通过其获取peer信息。可更换为当前活跃的tracker,同时依赖DHT作为补充。


修改后的完整代码

import sys
import time
import libtorrent as lt
import os

# 用绝对路径避免工作目录差异问题
target_dir = os.path.abspath(".")
target_file = os.path.join(target_dir, "test")

# 创建文件存储结构
fs = lt.file_storage()
lt.add_files(fs, target_file)
t = lt.create_torrent(fs)

# 添加当前活跃的tracker(可按需替换)
t.add_tracker("http://tracker.opentrackr.org:1337/announce", 0)
t.add_tracker("udp://tracker.openbittorrent.com:80", 1)
t.add_tracker("udp://tracker.coppersurfer.tk:6969", 2)

t.set_creator(f'libtorrent {lt.version}')
t.set_comment("Test")

# 基于文件所在目录计算分片哈希
lt.set_piece_hashes(t, os.path.dirname(target_file))
torrent = t.generate()

# 保存种子文件
torrent_path = os.path.join(target_dir, "mytorrent2.torrent")
with open(torrent_path, "wb") as f:
    f.write(lt.bencode(torrent))

magnet_uri = lt.make_magnet_uri(lt.torrent_info(torrent_path))
print(f"Magnet URI: {magnet_uri}")

# 初始化会话并配置网络
ses = lt.session()
# 设置监听端口范围
ses.listen_on(6881, 6891)
# 启用UPnP、NAT-PMP、LSD和DHT
ses.start_upnp()
ses.start_natpmp()
ses.start_lsd()
ses.start_dht()

# 添加种子做种,强制校验文件哈希确保一致性
params = {
    'ti': lt.torrent_info(torrent_path),
    'save_path': os.path.dirname(target_file),
    'flags': lt.add_torrent_flags.force_recheck
}
h = ses.add_torrent(params)

print(f"Total size: {h.status().total_wanted}")
print(f"Name: {h.name()}")
h.resume()

while True:
    s = h.status()
    state_str = [
        'queued', 'checking', 'downloading metadata',
        'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume'
    ]
    print('\r%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s' %
          (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, s.num_peers, state_str[s.state]), end='')
    sys.stdout.flush()

    # 进入seeding状态后确认做种正常
    if s.state == lt.torrent_status.seeding:
        print("\nSeeding successfully, clients should now be able to connect.")
    
    time.sleep(1)

验证步骤

  1. 运行修改后的代码,等待终端显示Seeding successfully
  2. 用BT客户端打开生成的种子文件或Magnet链接,检查是否能连接到你的节点
  3. 确认本地防火墙未拦截6881-6891端口的入站连接
  4. 若仍无法连接,可通过print(ses.dht_state())查看DHT节点数量,确认DHT功能正常

内容的提问来源于stack exchange,提问作者EnderNicky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:45:35