0

根据libtorrent doc的代码,我尝试从 torrent 文件中获取磁力链接:

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

它返回一个链接:

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

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

因此,我尝试通过传输检索此洪流的磁力链接。事实证明,结果是不同的:

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

所以我认为我使用 python-libtorrent 获取磁力链接的方式存在问题。有没有人有一个工作的例子?

问候。

4

3 回答 3

2

原始磁力链接格式的 info-hash 是 base32 编码的,用于空间。有一次,我们(libtorrent 和 utorrent)决定为了简单起见,最好使用十六进制(base16 编码)。这可能是在 2009 年或 2010 年 iirc 左右。但是,为了使过渡平滑,我们支持读取base32 和 base16 样式的链接(很容易区分),但仍然生成 base32 以向后兼容。

libtorrent 在 2013 年初切换到生成 base16 磁力链接(libtorrent 1.0)。

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

于 2015-03-30T13:50:48.627 回答
1

如果您的问题是“有人有工作示例吗?”,那么有很多工作示例。这个网站上以前的相关问题:

给定一个 .torrent 文件,我如何在 python 中生成一个磁力链接?

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

于 2015-03-29T21:10:21.200 回答
1

即使我很惊讶地看到 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)
于 2015-03-30T15:37:06.897 回答