Esempio n. 1
0
    async def connect(self,
                      first: bool = None,
                      uploaded: int = 0,
                      downloaded: int = 0):

        params = {
            'info_hash': self.torrent.info_hash,
            'peer_id': self.peer_id,
            'port': 6889,
            'uploaded': uploaded,
            'downloaded': downloaded,
            'left': self.torrent.total_size - downloaded,
            'compact': 1}
        if first:
            params['event'] = 'started'

        url = self.torrent.announce + '?' + urlencode(params)
        logging.info('Connecting to tracker at: ' + url)

        async with self.http_client.get(url) as response:
            if not response.status == 200:
                raise ConnectionError('Unable to connect to tracker: status code {}'.format(response.status))
            data = await response.read()
            print(bencoding.Decoder(data).decode())
            self.raise_for_error(data)
            return TrackerResponse(bencoding.Decoder(data).decode())
Esempio n. 2
0
 def __parse(self, data):
     decoder = bencoding.Decoder()
     decoder.setCallback(self.__parseBegin, self.__parseEnd)
     decoded = decoder.decode(data)
     self.infoHash = utilities.sha1(
         data[self.__parseInfoBegin:self.__parseInfoEnd])
     return decoded
    def __init__(self, filename):
        self.filename = filename
        self.files = []

        with open(self.filename, 'rb') as f:
            meta_info = f.read()
            self.meta_info = bencoding.Decoder(meta_info).decode()
            info = bencoding.Encoder(self.meta_info[b'info']).encode()
            self.info_hash = sha1(info).digest()
            self._identify_files()
Esempio n. 4
0
def parse(torrentfile):
    parsedata = {}
    with open(torrentfile, 'rb') as unparsed:
        metaData = bencoding.Decoder(unparsed.read()).decode()
        torrentInfo = bencoding.Encoder(metaData[b'info']).encode()
        infoHash = sha1(torrentInfo).digest()
        parsedata['announce'] = metaData[b'announce']
        parsedata['info_hash'] = infoHash
        parsedata['left'] = metaData[b'info'][b'length']
    return parsedata
Esempio n. 5
0
    def __init__(self, torrent_file):
        self.meta_data = tp.parse_torrent_file(torrent_file)
        self.files = []
        self.base_url = self.meta_data['announce']
        self.total_length = self.meta_data['info']['length']
        self.output_file = self.meta_data['info']['name']

        with open(torrent_file, 'rb') as f:
            meta_info = f.read()
            self.raw_meta = bencoding.Decoder(meta_info).decode()
            info = bencoding.Encoder(self.raw_meta[b'info']).encode()
            self.info_hash = sha1(info).digest()
Esempio n. 6
0
    def parse_response(raw_response) -> TrackerResponse:
        result = TrackerResponse()

        decoded = bencoding.Decoder(raw_response).decode()

        peers = decoded[b'peers']
        peers = [peers[i:i + 6] for i in range(0, len(peers), 6)]
        for p in peers:
            decoded_port = struct.unpack(">H", p[4:])[0]
            result.peers.append((socket.inet_ntoa(p[:4]), decoded_port))

        result.complete = decoded.get(b'complete', 0)
        result.incomplete = decoded.get(b'incomplete', 0)
        result.interval = decoded.get(b'interval', 0)

        return result
Esempio n. 7
0
    def __init__(self, filename):
        self.filename = filename
        self.files = []

        with open(self.filename, 'rb') as f:
            meta_info = f.read()
            self.meta_info = bencoding.Decoder(meta_info).decode()
            info = bencoding.Encoder(self.meta_info[b'info']).encode()
            self.info_hash = sha1(info).digest()
            self._identify_files()

        if self.multi_file:
            # TODO Add support for multi-file torrents
            raise RuntimeError('Multi-file torrents is not supported!')
        self.files.append(
            TorrentFile(self.meta_info[b'info'][b'name'].decode('utf-8'),
                        self.meta_info[b'info'][b'length']))
Esempio n. 8
0
    async def connect(self) -> None:
        """
        Connect to tracker and retrieve meta info about the torrent

        Raises:
            TrackerError: If response from tracker has not successfull status code
        """
        request_data = {
            "info_hash": self.torrent.info_hash,
            "peer_id": self.peer_id,
            "port": random.randint(6881, 6889),
            "uploaded": 0,
            "downloaded": 0,
            "left": self.torrent.size,
        }
        request_url = self.torrent.announce + "?" + urllib.parse.urlencode(
            request_data)
        response = await self._client.get(request_url, params=request_data)
        if response.status_code != 200:
            raise TrackerError(status_code=response.status_code)

        tracker_response = TrackerResponse(
            bencoding.Decoder(response.read()).decode())
        self.tracker_info = tracker_response
    async def connect(self,
                      first: bool = None,
                      uploaded: int = 0,
                      downloaded: int = 0):
        params = {}
        params['info_hash'] = self.torrent.info_hash
        params['uploaded'] = 0
        params['download'] = 0
        params['peer_id'] = self.peer_id
        params['port'] = 6969
        params['left'] = self.torrent.total_size - downloaded
        params['compact'] = 1
        url = self.torrent.announce + '?' + urlencode(params)
        print(params)
        if first:
            params['event'] = 'started'

        async with self.http_client.get(url) as response:
            if not response.status == 200:
                raise ConnectionError(
                    f'Unable to connect to tracker: status code {response.status}'
                )
            data = await response.read()
            return TrackerResponse(bencoding.Decoder(data).decode())
Esempio n. 10
0
    'info_hash': torrentMetaData['info_hash'],
    'peer_id': peerId,
    'port': 6881,
    'uploaded': 0,
    'downloaded': 0,
    'left': torrentMetaData['left'],
    'compact': 1,
    'event': 'started'
}

# make request to tracker
url = (torrentMetaData['announce']).decode('utf-8') + "?" + urlencode(query)
res = requests.get(url)

# decode the binary data and store the peerlist bytes
data = bencoding.Decoder(res.content).decode()
peerlist = data[b'peers']

# offset = 0
# ip1 = struct.unpack_from("!i", peerlist, offset)[0]
# # firstip = socket.inet_ntoa(struct.pack("!i", ip1))
# # print(firstip)
# ip_list = []
# for offset2 in range(0,12,6):
#     unpacked_ip = struct.unpack_from("!i", peerlist, offset2)[0]
#     dotted_ip = struct.pack('!i', unpacked_ip)
#     ip_list.append(ipaddress.ip_address(dotted_ip))

# for item in ip_list:
#     print("from the loop", item)