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

时间:2015-03-29 20:52:32

标签: python libtorrent magnet-uri

根据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获取磁力链接的方式存在问题。有没有人有一个有效的例子?

问候。

3 个答案:

答案 0 :(得分:2)

原始磁链接格式的信息散列是base32编码的,用于空间。有一次我们(libtorrent和utorrent)决定最好使用hex(base16编码)来简化。这可能是2009年或2010年的iirc。但是,为了使转换顺利进行,我们支持读取 base32和base16样式链接(它很容易区分),但仍然生成base32以实现向后兼容。

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

您可能正在使用旧版本的libtorrent。

答案 1 :(得分:1)

如果你的问题是"有没有人有一个有效的例子?",那么有很多有效的例子。此网站上的相关问题:

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

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

答案 2 :(得分: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)