Внедряю битторент клиент и получаю 403 от трекера

Я пробовал свои силы в реализации клиента bittorrent на python (я знаю, что есть библиотеки, которые могут легко сделать это для меня, но я просто пытаюсь узнать что-то новое).

Я скачал и смог успешно декодировать торрент-файл, однако, когда я пытаюсь выполнить запрос GET на трекере, я получаю ответ 403, и я понятия не имею, почему. Вот что я пробовал (это код, скопированный из оболочки python):

>>> 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, и он работал, поэтому трекер работает нормально. Я даже попробовал голый URL-адрес объявления (без параметров) и то же самое. Из того, что я прочитал в спецификации BitTorrent, нет упоминания об ответе 403 от трекера.

Я был бы очень рад, если бы вы, ребята, могли помочь мне с этим.


person Tiberiu Savin    schedule 22.10.2015    source источник
comment
Трекеры обычно используют белый список торрент-клиентов, чтобы предотвратить некорректное поведение клиентов. Например: DHT и совместное использование пиров на частном трекере приведет к утечке пиров за пределы трекера. Вот почему uTorrent содержит протокол, который позволяет трекеру отключить его.   -  person otc    schedule 22.10.2015
comment
О, я вижу, да, я читал немного о частных трекерах. Тогда как я могу притворяться, что я uTorrent? Я попытался изменить peer_id на -UT-... вместо -AZ-..., который является форматом peer_id uTorrent, но все равно то же самое (на самом деле я не ожидал многого от этого, но я подумал, что оно того стоило). выстрел). Я не вижу никаких других параметров, которые я могу установить там.   -  person Tiberiu Savin    schedule 22.10.2015


Ответы (2)


Чтобы уменьшить количество переменных, лучше протестировать трекер, который вы используете локально, например. opentracker — хороший выбор, так как он предъявляет мало требований.

Ошибки, которые вы получаете только на определенных трекерах, но не на других, скорее всего, связаны с дополнительными требованиями, предъявляемыми администраторами трекеров, а не самим протоколом BitTorrent.

Основные исключения заключаются в том, что многие общедоступные средства отслеживания могут не разрешать некомпактные объявления или требовать объявления UDP вместо объявлений HTTP.

person the8472    schedule 22.10.2015
comment
Спасибо, не знал про opentracker, попробую. Я добавил в параметры compact=1, чтобы трекер знал, что я согласен с компактным объявлением. Да, я попробовал другой торрент с другого трекера и увидел, что это формат udp, но я не знал, как сделать запрос udp в python, но, думаю, я мог бы просто попробовать. Я тестировал только с этим трекером, поэтому я не уверен, есть ли у этого трекера какие-то странные требования, думаю, я продолжу попытки. - person Tiberiu Savin; 22.10.2015

Хорошо, мне удалось выяснить проблему. Это немного глупо, но на самом деле это потому, что запрос к трекеру не имел заголовков, и этому трекеру на самом деле нужен пользовательский агент, иначе он отклонил бы запрос. Все, что мне нужно было сделать, это добавить пользовательский агент к запросу.

person Tiberiu Savin    schedule 22.10.2015