从 json 加载 infohash 时,Libtorrent 不工作?

Posted

技术标签:

【中文标题】从 json 加载 infohash 时,Libtorrent 不工作?【英文标题】:Libtorrent not working when loading infohash from json? 【发布时间】:2015-08-29 06:41:01 【问题描述】:

我正在尝试制作一个 python 脚本,它只下载给定 infohash 的 torrent 的元数据。这个 infohash 是从一个 json 文件加载的,内容如下:

"infohash":"someinfohash"

如果我手动将 infohash 编码到链接字符串中,或​​者我自己使用字典进行编码,如下所示:

link = 'magnet:?xt=urn:btih:someinfohash'

或者像这样:

foo = 
foo['infohash'] = 'someinfohash'
link = 'magnet:?xt=urn:btih:' + foo['infohash']

我总是可以下载元数据,没问题。但由于某种原因,当我从 json 文件加载它时,它总是超时。

thedata = open(sys.argv[1]).read()
thedata = json.loads(thedata)

ses = lt.session()

ses.listen_on(6881, 6891)

params = 
    'save_path': '.', # doesn't matter because we're only downloading metadata

link = 'magnet:?xt=urn:btih:' + thedata['infohash']

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

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

sys.stdout.write('Downloading metadata...')
sys.stdout.flush()
timeout = time.time()
while (not handle.has_metadata()):
    if (time.time() >= 300 + timeout):
        print 'timed out'
        sys.exit(1)
    time.sleep(1)
print 'done'

ses.pause()

如果我检查字符串是否相等,像这样:

link = 'magnet:?xt=urn:btih:' + thedata['infohash']
link2 = 'magnet:?xt=urn:btih:someinfohash'
print link == link2

它打印的是真的。

有人知道发生了什么吗?

【问题讨论】:

【参考方案1】:

我终于找到了问题所在。

我的想法是检查 json 生成的字典的程序员友好文本表示,而不是我手动制作的。

thedata = open(sys.argv[1]).read()
thedata = json.loads(thedata)

print thedata

thedata = 
thedata['infohash'] = 'someinfohash'

print thedata

结果是这样的:

u'infohash', u'someinfohash'
'infohash', 'someinfohash'

显然 json-made dict 是用 unicode 编码的,这在某种程度上阻止了 libtorrent 连接到播种机。取消对所有键和值的统一编码后,脚本运行完美。

【讨论】:

以上是关于从 json 加载 infohash 时,Libtorrent 不工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何验证 torrent Infohash 是不是有效?

从 GCS 加载 JSON 时出错

FabricJS - 从 JSON 加载 Canvas 时出错

为啥我在使用 kingfisher 将图像从 JSON 加载到 tableview 时出错?

解析 json 时如何使按钮从 json 加载 url?

从 JSON 中的 URL 加载的图像视图在滚动时发生变化