Есть ли модуль PHP, который вы можете использовать для программного чтения торрента, чтобы узнать информацию об этом, например, Seeders?
Я использовал эти функции на небольшом веб-сайте, который я сделал один раз. Думаю, я нашел их с помощью php bittorrent tracker под названием OpenTracker или что-то в этом роде, но не могу найти сайт …
Однако вы не найдете сеялки в торрент-файле. Torrent-файл просто содержит информацию о файлах, хэш-коды и длины и т. Д. И некоторые данные трекера, которые я считаю. Сколько сеялок и таких вы должны будете получить от трекера. Вы можете прочитать о протокале на BitTorrent.org . Сообщение, я считаю, закодировано, поэтому вы также можете использовать эти функции для этого. Это означает, что вам просто нужно выяснить, что отправить, чтобы получить то, что вы хотите назад.
ПРИМЕЧАНИЕ. Я не писал эти три функции. Как я уже сказал, я нашел их в источнике торрент-трекера с открытым исходным кодом. Функции не комментируются, но имена функций вместе с print_r в результате торрент-файла, которого вы знаете, должны быть достаточными, чтобы понять, как их использовать. Я добавил код примера внизу, чтобы показать, как я их использовал. И они работали.
function bdecode($str) { $pos = 0; return bdecode_r($str, $pos); } function bdecode_r($str, &$pos) { $strlen = strlen($str); if (($pos < 0) || ($pos >= $strlen)) { return null; } else if ($str{$pos} == 'i') { $pos++; $numlen = strspn($str, '-0123456789', $pos); $spos = $pos; $pos += $numlen; if (($pos >= $strlen) || ($str{$pos} != 'e')) { return null; } else { $pos++; return intval(substr($str, $spos, $numlen)); } } else if ($str{$pos} == 'd') { $pos++; $ret = array(); while ($pos < $strlen) { if ($str{$pos} == 'e') { $pos++; return $ret; } else { $key = bdecode_r($str, $pos); if ($key == null) { return null; } else { $val = bdecode_r($str, $pos); if ($val == null) { return null; } else if (!is_array($key)) { $ret[$key] = $val; } } } } return null; } else if ($str{$pos} == 'l') { $pos++; $ret = array(); while ($pos < $strlen) { if ($str{$pos} == 'e') { $pos++; return $ret; } else { $val = bdecode_r($str, $pos); if ($val == null) { return null; } else { $ret[] = $val; } } } return null; } else { $numlen = strspn($str, '0123456789', $pos); $spos = $pos; $pos += $numlen; if (($pos >= $strlen) || ($str{$pos} != ':')) { return null; } else { $vallen = intval(substr($str, $spos, $numlen)); $pos++; $val = substr($str, $pos, $vallen); if (strlen($val) != $vallen) { return null; } else { $pos += $vallen; return $val; } } } } function bencode($var) { if (is_int($var)) { return 'i' . $var . 'e'; } else if (is_array($var)) { if (count($var) == 0) { return 'de'; } else { $assoc = false; foreach ($var as $key => $val) { if (!is_int($key)) { $assoc = true; break; } } if ($assoc) { ksort($var, SORT_REGULAR); $ret = 'd'; foreach ($var as $key => $val) { $ret .= bencode($key) . bencode($val); } return $ret . 'e'; } else { $ret = 'l'; foreach ($var as $val) { $ret .= bencode($val); } return $ret . 'e'; } } } else { return strlen($var) . ':' . $var; } }
Пример использования примера:
# Read a file $content = file_get_contents("file.torrent"); $content_d = bdecode($content); # Check if bdecode succeeded if(empty($content_d)) exit('Something is wrong with the torrent. BDecode failed.'); # Calculate info_hash $info_hash = sha1(bencode($content_d['info']), true); # Calculate length $length = 0; function add_length($value, $key) { global $length; if($key == 'length') $length += $value; } array_walk_recursive($content_d, 'add_length');
Google предлагает этот PHP-клиент на sourceforge и этот класс torrent на PHP-классах. Должно быть все, что вам нужно.
Файлы Torrent представляют собой в основном вложенные словари, закодированные с помощью BEncode . BEncode – это простая кодировка, и есть несколько классов PHP BDecode, как этот .
Структура торрент-файла описана в BEP0003 .
Обратите внимание, что файлы торрентов не содержат поля «Сеялки», которое вы упоминаете. Список сеялок является динамическим и управляется сервером трекера. Имея hash_info
и tracker_url
(оба доступны из торрент-файла), вы можете отправить scrape-запрос трекеру, и он вернет количество сеялок в поле «полный», см. Конвенцию Tracker Scrape .
Эта библиотека содержит подбиблиотеку, которая отлично справляется с работой: http://www.binpress.com/app/phptracker/177