Как отправлять запросы в bittorrent-трекер, используя запросы python - PullRequest
0 голосов
/ 08 октября 2019

Я изучал протокол bittorrent и хотел попробовать несколько запросов трекера, чтобы получить информацию о пирах и прочем, но я не могу получить какой-либо правильный ответ от любого трекера, который я пробовал

Вот как выглядят мои параметры

{'info_hash': '7bf74c4fd609bf288523f7cd51af3bdbc19df610', 'peer_id': '139a3f2ff0143c9f24c19c4f95ed1378aaf449d2', 'port': '6881', 'uploaded': '0', 'downloaded': '0', 'left': '931135488', 'compact': '1', 'no_peer_id': '0', 'event': 'started'}
import bencoding
import hashlib
import secrets
import requests
import urllib

file = open('../altlinux.torrent', 'rb')
data = bencoding.bdecode(file.read())
info_hash = hashlib.sha1(bencoding.bencode(data[b'info'])).hexdigest()
params = {
    'info_hash': info_hash,
    'peer_id': secrets.token_hex(20),
    'port': '6881',
    'uploaded': '0',
    'downloaded': '0',
    'left': str(data[b'info'][b'length']),
    'compact': '1',
    'no_peer_id': '0',
    'event': 'started'
}
print(params)
page = requests.get(data[b'announce'], params=params)
print(page.text

Так вот, что я написал, и я получаю ту же ошибку,

d14:failure reason50:Torrent is not authorized for use on this tracker.e

Я даже пытался кодироватьinfo_hash в

urllib.parse.quote_plus(info_hash)

просто для того, чтобы сделать его в кодированном формате url, состоящем из hexdigest

Я не уверен, в чем я ошибаюсь Может кто-то помочь с этим?

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

info_hash не должно быть представлением hex . Предполагается, что это будет двоичное представление. т.е. вам нужно URL кодировать его. т.е. не звоните .hexdigest().

Похоже, что когда вы звоните urllib.parse.quote_plus(info_hash), ваш URL кодирует шестнадцатеричное представление информационного хэша. т.е. он все еще закодирован в шестнадцатеричном формате.

Вы, вероятно, хотите использовать что-то вроде urllib.parse.quote(info_hash)

0 голосов
/ 08 октября 2019

Вам нужно передать необработанный info_hash, а не его кодированную версию. То же самое относится и к peer_id:

params = {
    'info_hash': bytes.fromhex(info_hash),
    'peer_id': bytes.fromhex(secrets.token_hex(20)),
    'port': '6881',
    'uploaded': '0',
    'downloaded': '0',
    'left': str(data[b'info'][b'length']),
    'compact': '1',
    'no_peer_id': '0',
    'event': 'started'
}

Также следует отметить, что это будет работать только для торрентов с одним файлом. То, как вы получите длину, должно обрабатывать элемент files в торрентах, когда вы видите один с несколькими файлами, поскольку у них нет записи length.

...