为什么 libtorrent 生成的磁铁无效?

why magnet generated by libtorrent are invalid?

我尝试从 torrent 文件中获取磁铁 links,根据 libtorrent doc 使用此代码:

info = lt.torrent_info(t) # t is a torrent file
return(lt.make_magnet_uri(info))

它returns一个link:

magnet:?xt=urn:btih:YC5BHBHYDFYZOJRMD5BYGA2QRRXVRGAM&dn=BTshare.ogv

但是这个link不起作用。 (注意torrent文件没有问题)。

因此,我尝试通过传输检索此 Torrent 的磁铁 link。原来结果不一样:

magnet:?xt=urn:btih:c0ba1384f8197197262c1f438303508c6f58980c&dn=BTshare.ogv

所以我认为我使用 python-libtorrent 获取磁铁 link 的方式有问题。有人有工作示例吗?

此致。

如果您的问题是"does anyone has a working example?",那么有很多工作示例。此站点上的上一个相关问题:

Given a .torrent file how do I generate a magnet link in python?

有效的 link 和您的代码创建的 link 仅在散列内容 YC5BHBHYDFYZOJRMD5BYGA2QRRXVRGAMc0ba1384f8197197262c1f438303508c6f58980c 上有所不同所以是的,您猜对了,有使用您的库来提取哈希值的东西。 (我没能在您的 link 中看到如何在他们记录的 C 接口周围使用 Python 包装器)。如果您不是被迫使用 libtorrent,您可以尝试其他许多库。

原始磁铁 link 格式的信息哈希是 base32 编码的,用于 space。有一次我们(libtorrent 和 utorrent)决定为简单起见最好使用十六进制(base16 编码)。这可能是在 2009 年或 2010 年左右 iirc。但是,为了使过渡顺利,我们支持 read base32 和 base16 样式 links(很容易区分),但仍然生成 base32 以实现向后兼容.

libtorrent 在 2013 年初(libtorrent 1.0)切换到生成 base16 磁体 links。

很可能您使用的是非常旧版本的 libtorrent。

虽然我很惊讶地看到 libtorrent 在 debian jessie 上已经过时了,但由于您的回答,我解决了这个问题。坦克!

现在是代码,需要改进:

info = lt.torrent_info(t)
b32m = (lt.make_magnet_uri(info))
mhash, dn = b32m.split('btih:')[1].split('&')
mhex = binascii.hexlify(base64.b32decode(mhash)).decode('ascii')
mgt = "magnet:?xt=urn:btih:{0}&{1}".format(mhex,dn)
return(mgt)