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)
验证步骤
- 运行修改后的代码,等待终端显示
Seeding successfully - 用BT客户端打开生成的种子文件或Magnet链接,检查是否能连接到你的节点
- 确认本地防火墙未拦截6881-6891端口的入站连接
- 若仍无法连接,可通过
print(ses.dht_state())查看DHT节点数量,确认DHT功能正常
内容的提问来源于stack exchange,提问作者EnderNicky
相关产品推荐
相关产品推荐

