【问题标题】:Python libtorrent creates empty torrent with magnet linkPython libtorrent 使用磁力链接创建空种子
【发布时间】:2015-11-26 10:28:09
【问题描述】:

我尝试下载一个 torrent(特定的 .torrent 文件),只有一个 info_hash。我知道这之前在这里讨论过,我什至相应地搜索并修改了我的代码。结果如下:

import libtorrent as lt
import time
import sys
import bencode

ses = lt.session()
ses.listen_on(6881, 6891)
params = {
    'save_path': '.',
    'storage_mode': lt.storage_mode_t(2),
    'paused': False,
    'auto_managed': True,
    'duplicate_is_error': True
    }

info_hash = "2B3AF3B4977EB5485D39F96FE414729530F48386"
link = "magnet:?xt=urn:btih:" + info_hash

h = lt.add_magnet_uri(ses, link, params)

ses.add_dht_router("router.utorrent.com", 6881)
ses.add_dht_router("router.bittorrent.com", 6881)
ses.add_dht_router("dht.transmissionbt.com", 6881)
ses.start_dht()

while (not h.has_metadata()):
    time.sleep(1)

torinfo = h.get_torrent_info()

fs = lt.file_storage()
for f in torinfo.files():
  fs.add_file(f)
torfile = lt.create_torrent(fs)
torfile.set_comment(torinfo.comment())
torfile.set_creator(torinfo.creator())

f = open("torrentfile.torrent", "wb")
f.write(lt.bencode(torfile.generate()))
f.close()

这会生成一个无法通过传输加载的 torrent 文件。它缺少跟踪器以及真实的碎片(创建 \x00 而不是实际的碎片)。
以下行保存碎片,但仍然缺少跟踪器并且无法通过传输打开:

f = open("torrentfile.torrent", "wb")
f.write(lt.bencode(torinfo.metadata()))
f.close()

如何仅使用磁力链接(如代码中所述)创建一个看起来像实际种子的种子?
(我正在使用带有 libtorrent 0.16.18-1 的 Ubuntu 15.04 x64)

我并没有非法下载 torrent 背后的文件 - 但是,我可以将 torrent 与我的脚本下载的 torrent 进行比较。

【问题讨论】:

  • 你能帮帮我吗?我使用与您相同的代码,但在我的情况下,它卡在循环while (not h.has_metadata()): 中。有吗?

标签: python bittorrent libtorrent magnet-uri libtorrent-rasterbar


【解决方案1】:

您没有设置片段哈希和片段大小(file_storage 对象的)。请参阅documentation

但是,创建 .torrent 文件的一种更简单、更可靠的方法是使用直接采用 torrent_info 对象的 create_torrent 构造函数。即:

torfile = lt.create_torrent(h.get_torrent_info())
f = open("torrentfile.torrent", "wb")
f.write(lt.bencode(torfile.generate()))
f.close()

【讨论】:

  • 非常感谢您的回答。这确实解决了在没有 metadata() 调用的情况下设置片段的问题。但是,有没有办法获取跟踪器?还是我必须添加任意跟踪器并希望他们有这个种子的播种器?
  • 跟踪器不是通过 ut_metadata 协议传输的元数据的一部分。如果您知道跟踪器是什么,则可以在调用 generate() 之前将它们手动添加到 create_torrent 对象。添加跟踪器不会改变信息哈希。
  • 但是有没有办法在没有原始种子的情况下确定跟踪器?那么,我能以某种方式获得跟踪器吗?否则我将无法打开种子,例如传输(它无法从跟踪器获得播种机)。
  • 从磁力链接获取跟踪器的唯一方法是让链接本身包含跟踪器 (&tr=)。你确定传输需要跟踪器吗?听起来很奇怪,传输支持 DHT,不是吗?最坏的情况,你总是可以添加一个指向 127.0.0.1 的虚拟跟踪器
  • "Require" 可能具有误导性。如果我添加由我的脚本生成的种子,传输正在等待播种者。至少在我放弃前 1 小时(如果我将种子与跟踪器一起添加,我几乎会立即获得播种者)。我将您的答案标记为正确的答案,因为它解决了我的大部分问题并使我的代码更漂亮;)
猜你喜欢
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
相关资源
最近更新 更多