INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / RSS / GPG

Парсинг торрент файла на php, получение сидеров и личеров

№ 7268 В разделе Programming от May 31st, 2015,
В подшивках: ,

Я как-то уже писал торрент трекер для нашего опенсорс сообщества, но реализация была полностью на пхп и не отличалась особой скоростью. Поскольку мне понадобилось интегрировать поддержку торрентов в Distr CMS я начал искать пути ускорения работы с торрентами. На глаза попался офигенский модуль к php, который задачу парсинга берет на себя. А вот остальные функции все равно нужно писать самому.

Задача нулевая. Установка модуля.

Нужно поставить пакеты для сборки модуля sudo apt-get install php5-dev build-essential subversion

Далее получаем модуль и собираем его
svn checkout http://php-bencode-extension.googlecode.com/svn/trunk/ php-bencode
cd php-bencode
phpize
./configure --with-php-config="`whereis php-config|awk '{ print $2 }'`"
make

Теперь нужно скопировать модуль в директорию к остальным модулям. У меня это была директория /usr/lib/php5/20131226. У вас будет что-нибудь похожее.

В конце нужно создать конфиг для загрузки модуля в память при старте php. У меня используется php-fpm, поэтому этот конфиг положил в /etc/php5/fpm/conf.d/cg_bcode.ini

Текст конфига
extension=cg_bcode.so

Модуль установлен, делаем рестарт php-fpm, apache или что у вас там.

Задача первая. Нужно посмотреть сидеров и личеров.

Установленый модуль добавляет функции bdecode и bencode, ускоряя обработку файлов в разы. Однако, это не отменяет необходимости кеширования этих значений при большом количестве посещений.

декодируем содержимое файла в массив $info
$info=bdecode(file_get_contents($url_torrent));

хеш можно получить сделав sha1 только части, отвечающей за информацию о файлах внутри. хеш получается только в бинарном виде, добавив true вторым параметром
$hash = sha1(bencode($info['info']),true);

scrape в большинстве случаев получается просто путем замены announce в урле для анонсов торрента
$announce_url=$info['announce'];
$scrape_url = str_replace("announce","scrape",$announce_url);

делаем get запрос к трекеру и полученый ответ тут же декодируем в массив
$scrape_data = bdecode(file_get_contents($scrape_url.'?info_hash='.urlencode($hash)));
echo "Полных раздач: ".$scrape_data['files'][$hash]['complete'];

Задача вторая. Список файлов внутри торрента.

Код ниже только для разовых обращений к файлу. При высокой посещаемости и большом количестве торрент файлов эти данные нужно кешировать в БД или memcached. Вам тут решать уже.

foreach($info['info']['files'] as $file) {
echo $file['path'][0]." Размер ".round($file['length']/1024/1024)." Мб
";
}

distr cms 03

Еще кое-что интересненькое о торрентах:

5 комментариев »

5 responses to “Парсинг торрент файла на php, получение сидеров и личеров”

  1. Insert says:

    Когда уже твоё “торчок” будет доработан, хочется видеть рабочий вариант торрента.

  2. DedaPetya says:

    Эх…. забыл ты про “торчка” Владимир. https://bitbucket.org/21h/torchok Последние изменения 26.06.2012 г. Жаль конечно.

  3. 21h says:

    да он работает вообще-то. но там не модулем разбор идет и даже где-то ошибка есть. не всегда правильно разбирает. переделать минута времени. торчок задумывался как подсадка для сайта, поэтому авторизацию нужно прикручивать к основному сайту уже руками. ну или сделать собственную, если трекер самодостаточен и всякие блоги и с форумами не нужны.

  4. Buter says:

    Какова дальнейшая жизнь торчка? Он кстати веб-интерфейсом для OpenTracker выступает? Без OpenTracker работать не будет?

  5. 21h says:

    торчок давно уже не обновлял, как только закрыл сайт где он работал. да, это морда для opentracker. без opentracker или любого другого открытого трекера работать не будет.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Облачная платформа
Яндекс.Метрика

Fortune cookie: diaphragm, n: A childproof cap.