实现一个bittorent客户端,我从跟踪器

时间:2015-10-22 16:56:04

标签: python bittorrent

我正在尝试在python中实现一个bittorrent客户端(我知道有一些lib可以很容易地为我做这个,但我只是想学习新东西)。

我下载并设法成功解码了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客户端尝试了这种洪流,它的工作原理使得跟踪器工作正常。我甚至尝试了裸体宣布网址(没有参数)和同样的事情。根据我从bittorrent规范中读到的内容,没有提到跟踪器的403响应。

如果你们能帮我解决这个问题,我会非常高兴。

2 个答案:

答案 0 :(得分:1)

要减少变量的数量,最好针对您在本地运行的跟踪器进行测试,例如: opentracker是一个不错的选择,因为它几乎没有要求。

您只能访问特定跟踪器而非其他跟踪器的错误可能是由于跟踪器管理员而非bittorrent协议本身的额外要求。

主要的例外是许多公共跟踪器可能不允许非紧凑通告或要求UDP通知而不是HTTP通告。

答案 1 :(得分:1)

好的,我设法解决了这个问题。它有点傻但实际上是因为对跟踪器的请求没有任何标题,并且该跟踪器实际上需要一个用户代理,否则它将拒绝该请求。我所要做的就是在请求中添加用户代理。