Расшифровка ответа от торрент трекера

Discussion in 'Песочница' started by mazahist, 5 Feb 2017.

  1. mazahist

    mazahist New Member

    Joined:
    5 Feb 2017
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Создаю GET запрос к торрент трекеру.
    В ответ получаю
    Code:
    d8:intervali3073e12:min intervali3073e5:peers180:S�ƭ(X_V�����39A��*���[�����Jm�w��I�ƒK��#غc_\K6P�w� 
    x6�Y�\%-G�����P_�p�A��{�)� ����.��[��mj�V�$^�?E^Xȿ`�xf�r_ܠ 9�mj��ނ�?09M�7.��~�q[�����_n�|uO�S �vY����e
    
    Как можно перевести такие данные в нормальную строку???
    Если что, вот фрагмент кода создания строки:
    Code:
    var str = "";
    response.on('data', function (chunk) {
        str += chunk;
    });
    response.on('end', function () {
        console.log(str);
    });
     
  2. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    Похоже на содержимое торрент файла. Какой нибудь bencode декодер/энкодер должен помочь.
     
  3. UnknownSource

    UnknownSource Member

    Joined:
    29 Sep 2015
    Messages:
    11
    Likes Received:
    5
    Reputations:
    0
    это часть стандартного ответа торрент-сервера. можешь посмотреть wireshark'ом пакет
    там после "peers180:" просто идет дофига байт. Это пары состоящие из ip-адреса + порта.
    ip(4 байта)+порт(2 байта) = 6 байт - занимает каждая пара. а число после peers - это количество последующих байт с этими парами. например, в твоем случае 180=6*30, значит дальше 30 пар
    потом по этим ip-ишникам и портам трекер отправляет запросы на закачку файла и уже у них качает раздачу.

    так что, наверно, ответ на твой вопрос - получать строку надо именно в qbytearray (например), а не string'ом. а потом уже вытаскивать нужные значения.
     
    mazahist and crlf like this.
  4. mazahist

    mazahist New Member

    Joined:
    5 Feb 2017
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Я использую nodejs, там нет qbytearray. В nodejs есть объект Buffer - Uint8Array представление данных: Позволяет на лету преобразовывать данные, но вряд ли он поможет.
    Так данные же нужно сначала собрать:
    Code:
    response.on('data', function (chunk) {
        str += chunk;
    });
    +Если задать кодировку ascii:
    Code:
    d8:intervali3577e12:min intervali3577e5:peers180:2F/b<{qI62xW)a]T1pkR;o&mN&VWyyXqmbd@(2x mPm;i %?bXsDUP"\FnOdkB:^%cnyN\7yIb2/bu2WQC`X\rp#nW\s3h^gbbd[|7T#'C[pO$}aS.wx%g{^d9VUwE8M^g!    2[@&IT4I#{e
    Так хотя бы все символы поддерживаются, но все равно не понятно, как преобразовать эти 180 байт данных...
     
  5. UnknownSource

    UnknownSource Member

    Joined:
    29 Sep 2015
    Messages:
    11
    Likes Received:
    5
    Reputations:
    0
    вот в плане кода не подскажу, с nodejs не знаком.

    но по сути самих данных:
    там лежит например,
    0x70 0x65 0x65 0x72 0x73 0x31 0x38 0x30 0x3a 0x5f 0xb7 0x66 0x13 0xc3 0x2f - прям байты в 16-теричном виде. а по нормальному - это
    --p----e-----e------r-----s-----1----8-----0---:----95--183---102---19 ----49967
    ---тут идет в ascii -коде-------------------------- |---а тут уже не ascii! перевели в десятичные числа ip: 95.183.102.19, и порт 0xc32f ->49967. калькулятор тебе в помощь это проверить
     
    #5 UnknownSource, 8 Feb 2017
    Last edited: 8 Feb 2017
  6. mazahist

    mazahist New Member

    Joined:
    5 Feb 2017
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Не пойму, почему для любой magnet ссылки количество пиров = 30 (180/6)???

    HTML:
    var strBuff = [], length = 0;
    //добавляем в массив пришедшие данные+ увеличиваем общую длину пришедших данных
    response.on('data', function (chunk) { strBuff.push(chunk); length += chunk.length; });
    response.on('end', function () {//когда пересылка закончена
        var body = Buffer.concat(strBuff, length); //создаем буфер 16-ти ричных значений из массива пришедших данных
        var str = body.toString("ascii");//переводим буфер в ascii
        var numPeers = str.slice(str.search("peers") + 5).slice(0, str.search(":") + 1); //страшный парсинг числа пиров ( =180)
        var peerCount = numPeers / 6; // 180/6 = 30
        var bPeers = bencode.decode(str).peers;//получам список пиров( от библиотеки bencode( не работает с utf8 :(  ))
        var peers = group(body.slice(body.length - numPeers), 6).map(function (address) {//групируем байты в буфере по 6 и для каждой группы вызываем функцию( ниже)
            return {//возвращаем
                address: address,//сам буффер
                ip: address.slice(0, 4).join('.'),//переводим каждый байт в 10-ную систему+соединяем в строку с разделителм '.': байты с [0,1,2,3] - это ip
                port: address.readUInt16BE(4)//получаем беззнаковое целое 2-х байтовое число - это порт
            }
        });
        console.log(peers);    //вывод в консоль
    });
    Вот код, который выводит:
    Code:
    [
    { address: <Buffer 6c a9 16 40 b1 05>,
        ip: '108.169.22.64',
        port: 45317 },
      { address: <Buffer 90 6e a2 b2 4a b2>,
        ip: '144.110.162.178',
        port: 19122 },
      { address: <Buffer 9b 05 c1 d8 07 02>,
        ip: '155.5.193.216',
        port: 1794 },
      { address: <Buffer 5d 8f e3 35 a4 b2>,
        ip: '93.143.227.53',
        port: 42162 },
      { address: <Buffer a8 81 8b bf cb 52>,
        ip: '168.129.139.191',
        port: 52050 },
      { address: <Buffer c6 af 4d f3 99 4d>,
        ip: '198.175.77.243',
        port: 39245 },
      { address: <Buffer de 76 9c c3 6f 2e>,
        ip: '222.118.156.195',
        port: 28462 },
      { address: <Buffer 93 0e 37 8b 38 bc>,
        ip: '147.14.55.139',
        port: 14524 },
      { address: <Buffer f3 8b 20 41 f1 5f>,
        ip: '243.139.32.65',
        port: 61791 },
      { address: <Buffer 4f b9 49 59 4d 4d>,
        ip: '79.185.73.89',
        port: 19789 },
      { address: <Buffer de 71 21 89 19 b2>,
        ip: '222.113.33.137',
        port: 6578 },
      { address: <Buffer 8c 25 83 22 60 5f>,
        ip: '140.37.131.34',
        port: 24671 },
      { address: <Buffer 99 84 95 c2 67 5f>,
        ip: '153.132.149.194',
        port: 26463 },
      { address: <Buffer 37 b4 d9 c8 f1 59>,
        ip: '55.180.217.200',
        port: 61785 },
      { address: <Buffer 17 bf 6e 30 6f b2>,
        ip: '23.191.110.48',
        port: 28594 },
      { address: <Buffer 10 94 01 d6 a6 54>,
        ip: '16.148.1.214',
        port: 42580 },
      { address: <Buffer 17 3b 7d d1 3c 5f>,
        ip: '23.59.125.209',
        port: 15455 },
      { address: <Buffer b7 74 19 d8 82 54>,
        ip: '183.116.25.216',
        port: 33364 },
      { address: <Buffer 34 2b 24 e3 5e 5d>,
        ip: '52.43.36.227',
        port: 24157 },
      { address: <Buffer 49 60 fd 43 14 5f>,
        ip: '73.96.253.67',
        port: 5215 },
      { address: <Buffer 42 da 60 d5 f2 93>,
        ip: '66.218.96.213',
        port: 62099 },
      { address: <Buffer 1e 4a 3b 3e 4e 4f>,
        ip: '30.74.59.62',
        port: 20047 },
      { address: <Buffer a5 7b 1c 38 65 5f>,
        ip: '165.123.28.56',
        port: 25951 },
      { address: <Buffer 54 b7 f8 5f e6 05>,
        ip: '84.183.248.95',
        port: 58885 },
      { address: <Buffer 12 eb b4 b2 4a 1f>,
        ip: '18.235.180.178',
        port: 18975 },
      { address: <Buffer b9 04 91 9b 60 5f>,
        ip: '185.4.145.155',
        port: 24671 },
      { address: <Buffer 1d 60 b0 36 c5 5b>,
        ip: '29.96.176.54',
        port: 50523 },
      { address: <Buffer db 65 48 eb 40 25>,
        ip: '219.101.72.235',
        port: 16421 },
      { address: <Buffer cb 0a 7c d2 70 25>,
        ip: '203.10.124.210',
        port: 28709 },
      { address: <Buffer d4 ff 0b 5f 49 65>,
        ip: '212.255.11.95',
        port: 18789 }
    ]
    Если смотреть в uTorrent, на вкладке "пиры"- этих адресов там нет; DHT специально отключил.
     
  7. UnknownSource

    UnknownSource Member

    Joined:
    29 Sep 2015
    Messages:
    11
    Likes Received:
    5
    Reputations:
    0
    хз, вроде не всегда. если взять раздачу, какую-нибудь редкую, у которой пиров всего пара штук, то здесь будет поменьше число. но это надо бы проверить.
    вот это странно. особенно, если dht отключено, то пиры трекер получает только из этого ответа. и они должны во вкладке пиры отображаться. но может настройки торрент-трекера все-таки не такие, или ты че-то не там/не то отключил. или ты повторно качаешь ту же раздачу, и трекер ее пиры уже "помнит".

    поюзай программу wireshark. она весь трафик пишет, можно его просматривать и тд. Статья на хабре "приручение акулы" про нее есть.
    и попробуй в трафике поискать
    ip.addr==108.169.22.64
    или остальные свои ip-адреса. и он должен показать обмен пакетами с этими адресами.
    я у себя проверил и так работает.

    еще вот ссылка на документацию
    https://wiki.theory.org/BitTorrentSpecification#Tracker_HTTP.2FHTTPS_Protocol

    а в целом, вот как ты написал, так все и должно работать. надо только проверить правильно