У меня есть хэш-торрент с магнитной ссылки. Например: fda164e7af470f83ea699a529845a9353cc26576 Когда я пытаюсь получить информацию о leechers и сверстниках, я должен запросить: http://tracker.publicbt.com/scrape?info_hash= ??? Как мне преобразовать хэш информации для этого запроса? Является ли он кодировкой или кодированием url? как? В PHP.
Это необработанное шестнадцатеричное представление. Используйте pack()
с H
чтобы преобразовать его. Затем URL-адрес кодирует его.
Получил этот фрагмент питона от коллеги,
r = '' s = 'fda164e7af470f83ea699a529845a9353cc26576' for n in range(0, len(s), 2): r += '%%%s' % s[n:n+2].upper() print r
Выход:% FD% A1% 64% E7% AF% 47% 0F% 83% EA% 69% 9A% 52% 98% 45% A9% 35% 3C% C2% 65% 76
Работает как шарм.
Редактировать: работает как шарм, чтобы заставить трекера вернуть статус 200 (ok), но все еще не работает для получения сведений о торренте …
В случае, если у кого-то возникнут проблемы и наткнутся на этот поток в будущем: трюк для всей этой проблемы состоит в том, чтобы использовать аргумент bool $raw_output
функции PHP: sha1 , установив его в «true».
Классы BDecode / DEncode можно найти ЗДЕСЬ . Этот проект, называемый Trackon, также включает в себя множество других полезных классов для взаимодействия с торрент-трекерами и файлами.
Итак, в PHP, что-то вроде этого будет работать, чтобы получить правильный хэш информации для очистки трекера для деталей:
include('./path/to/BDecode.php'); include('./path/to/BEncode.php'); function getHash($torFile){ $tfile = BDecode(file_get_contents($torFile)); $infohash = sha1(BEncode($tfile["info"]), TRUE); return urlencode($infohash); }
вinclude('./path/to/BDecode.php'); include('./path/to/BEncode.php'); function getHash($torFile){ $tfile = BDecode(file_get_contents($torFile)); $infohash = sha1(BEncode($tfile["info"]), TRUE); return urlencode($infohash); }
вinclude('./path/to/BDecode.php'); include('./path/to/BEncode.php'); function getHash($torFile){ $tfile = BDecode(file_get_contents($torFile)); $infohash = sha1(BEncode($tfile["info"]), TRUE); return urlencode($infohash); }
Тогда просто назовите его так:
$hash = getHash('./path/to/.torrent');
Надеюсь, это поможет кому-то там. Я все еще царапал себе голову после прочтения многих сообщений о том, как получить правильный хэш информации. Я понимаю, почему это нигде не упоминалось, но этот аргумент был добавлен в PHP 5. Если вы не используете PHP 5, вам придется преобразовать хэш sha1 в исходный двоичный файл после его вычисления.