【问题标题】:Implementing a bittorent client and I get 403 from the tracker实现一个bittorrent客户端,我从跟踪器得到403
【发布时间】:2015-10-22 16:56:03
【问题描述】:

我正在尝试在 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 响应。

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

【问题讨论】:

  • 跟踪器通常使用 torrent 客户端白名单来防止客户端行为不端。例如:私有跟踪器上的 DHT 和对等点共享将泄漏跟踪器之外的对等点。这就是为什么 uTorrent 包含一个让跟踪器禁用它的协议
  • 哦,我明白了,是的,我读过一些关于私人追踪器的文章。那我怎么能假装我是一个uTorrent?我尝试将 peer_id 更改为 -UT-... 而不是 -AZ-... 这是 uTorrent 的 peer_id 格式,但仍然是一样的(我并没有对此抱有太大期望,但我认为这是值得的一个镜头)。我没有看到可以在那里设置的任何其他参数。

标签: python bittorrent


【解决方案1】:

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

您只在特定跟踪器上遇到的错误,而在其他跟踪器上却没有,可能是由于跟踪器管理员施加的额外要求,而不是 bittorrent 协议本身。

主要的例外情况是许多公共跟踪器可能不允许非压缩通告或需要 UDP 通告而不是 HTTP 通告。

【讨论】:

  • 谢谢,我不知道 opentracker 的事,我会试试的。我在参数中添加了 compact=1 以让跟踪器知道我可以接受紧凑的通知。是的,我尝试了来自不同跟踪器的不同种子,我看到它是 udp 格式,但我不知道如何在 python 中执行 udp 请求,但我想我可能只是试一试。我只用这个跟踪器进行了测试,所以我不确定这个跟踪器是否有一些奇怪的要求,我想我会继续尝试。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多