从json加载infohash时Libtorrent不工作?

时间:2015-08-29 06:41:01

标签: python json libtorrent

我正在尝试创建一个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 个答案:

答案 0 :(得分:0)

我终于找到了它的错误。

我有想法检查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制作的dict是用unicode编码的,这在某种程度上阻止了libtorrent连接到播种机。在解除所有键和值的unicoding后,脚本运行完美。