我正在尝试用 python 实现一个 BitTorrent 客户端(我知道有一些库可以轻松地为我做到这一点,但我只是想学习新东西)。
我下载并成功解码了 torrent 文件,但是当我尝试在跟踪器上执行 GET 请求时,我收到了 403 响应,我不知道为什么。这是我尝试过的(这是从 python shell 复制的代码):
>>> f = open("torrents/test.torrent")
>>> torrentData = bencoder.decode(f.read())
>>> torrentData["announce"]
'http://reactor.flro.org:8080/announce.php?passkey=d59fc5b5b9e2664895ad1c68a3621caf'
>>> params["info_hash"] = sha1(bencoder.encode(torrentData["info"])).digest()
>>> params["peer_id"] = '-AZ-1234-12345678901'
>>> params["left"] = sum(f["length"] for f in torrentData["info"]["files"])
>>> params["port"] = 6890
>>> params["uploaded"] = 0
>>> params["downloaded"] = 0
>>> params["compact"] = 1
>>> params["event"] = "started"
>>> params
{'uploaded': 0, 'compact': 1, 'info_hash': '\xab}\x19\x0e\xac"\x9d\xcf\xe5g\xd4R\xae\xee\x1e\xd7\
>>> final_url = torrentData["announce"] + "&" + urllib.urlencode(params)
>>> final_url
'http://reactor.flro.org:8080/announce.php?passkey=d59fc5b5b9e2664895ad1c68a3621caf&uploaded=0&co
>>> urllib2.urlopen(final_url)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
return opener.open(url, data, timeout)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
response = meth(req, response)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
'http', request, response, code, msg, hdrs)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
return self._call_chain(*args)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
result = func(*args)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
我是否缺少 params 文件夹中的某些内容?我还在我的 uTorrent 客户端中尝试了这个 torrent,它工作正常,因此跟踪器工作正常。我什至尝试了裸公告网址(没有参数)和同样的事情。从我从 BitTorrent 规范中读到的内容来看,没有提到来自跟踪器的 403 响应。
如果你们能帮助我解决这个问题,我会非常高兴。
最佳答案
为了减少变量数量,最好针对您在本地运行的跟踪器进行测试,例如opentracker是一个不错的选择,因为它提出的要求很少。
仅在特定跟踪器上出现错误,而在其他跟踪器上不会出现错误,这可能是由于跟踪器管理员施加的额外要求而不是 BitTorrent 协议(protocol)本身造成的。
主要的异常(exception)是许多公共(public)跟踪器可能不允许非紧凑公告或需要 UDP 公告而不是 HTTP 公告。
关于python - 实现 BitTorrent 客户端,我从跟踪器收到 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33286465/