Создаю 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); });
это часть стандартного ответа торрент-сервера. можешь посмотреть wireshark'ом пакет там после "peers180:" просто идет дофига байт. Это пары состоящие из ip-адреса + порта. ip(4 байта)+порт(2 байта) = 6 байт - занимает каждая пара. а число после peers - это количество последующих байт с этими парами. например, в твоем случае 180=6*30, значит дальше 30 пар потом по этим ip-ишникам и портам трекер отправляет запросы на закачку файла и уже у них качает раздачу. так что, наверно, ответ на твой вопрос - получать строку надо именно в qbytearray (например), а не string'ом. а потом уже вытаскивать нужные значения.
Я использую 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 байт данных...
вот в плане кода не подскажу, с 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. калькулятор тебе в помощь это проверить
Не пойму, почему для любой 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 специально отключил.
хз, вроде не всегда. если взять раздачу, какую-нибудь редкую, у которой пиров всего пара штук, то здесь будет поменьше число. но это надо бы проверить. вот это странно. особенно, если dht отключено, то пиры трекер получает только из этого ответа. и они должны во вкладке пиры отображаться. но может настройки торрент-трекера все-таки не такие, или ты че-то не там/не то отключил. или ты повторно качаешь ту же раздачу, и трекер ее пиры уже "помнит". поюзай программу wireshark. она весь трафик пишет, можно его просматривать и тд. Статья на хабре "приручение акулы" про нее есть. и попробуй в трафике поискать ip.addr==108.169.22.64 или остальные свои ip-адреса. и он должен показать обмен пакетами с этими адресами. я у себя проверил и так работает. еще вот ссылка на документацию https://wiki.theory.org/BitTorrentSpecification#Tracker_HTTP.2FHTTPS_Protocol а в целом, вот как ты написал, так все и должно работать. надо только проверить правильно