All-For-Kompa.RU

Сегодня:
Карта сайта форум Главная
Скрыть рекламный блок

Всё для компа

chat

Видео дня

Популярное

Реклама

Хочешь помочь проекту? Установи наш баннер!

Партнёры



Развлекательный портал по игре Dota 2. У нас вы первым узнаете о последних игровых новостях, сможете почитать интересные статьи и гайды, посмотреть стримы популярных комментаторов и многое другое.

Про-софт - сайт професионального софта. Ето сайт не только софта но также игровых дополнений, музыки, фильмов, игр для ПК а также читов для ПК игр. Постоянное обновление материалов и каждый день появляется чтото новенькое!

Авторизация


Реклама

Хочешь помочь проекту? Установи наш баннер!

Опрос

Какую поисковую систему используете?

1. Яndex
2. Google
3. Rambler
4. Nigma
5. Другое
6. Mail
7. Yahoo!

Реклама

Хочешь помочь проекту? Установи наш баннер!

Популярные тэги

Комментарии

Счетчики

На сайте: 1
Прохожие: 1
Пользователей: 0
Статус:

Счётчик тИЦ и PR Rambler's Top100
АвторАвтор: leonP4 | ДатаДата: 10.03.2013 |Голосов: 1


Привет %username%! В этой статье я не буду рассказывать как создать торрент трекер на uCoz, особенно если брать во внимание то что юкоз совершенно не предназначен для таких целей, но я попытаюсь максимально близко разобрать один случай из жизни, который поможет вам перепрограммировать функцию загрузки из модуля "онлайн игры", так как на мой взгляд если и выбирать модуль для таких целей, то он наиболее оптимально подходит для разработки трекера.

Все началось с попытки загрузить файл .torrent через модуль "онлайн игры" на сервер uCoz.
Хорошо, файл загружается, только не долго длилось счастье. Дело в том, что при загрузке файла на сервер, он приобретал немного иной формат:

http://www.all-for-kompa.ru/_sf/50/5002_wolfschanze-2-p.f641800685291160_

Именно об этом дальше и пойдет речь.

Постановка задачи


Давайте рассуждать логично. Сам модуль, мы перепрограммировать - не можем.
Сохранять .torrent в rar/zip архивы? - Тоже не вариант(подозрительно, возможно вирусы)! А оставлять файлы в таком виде, мы не можем... Извините, может я не прав, но других вариантов как написать костыли, я не вижу.

Начнем с того, что нам надо у файла поменять формат и имя, как это сделать, я расскажу дальше!

Способ реализации


Для данного способа я буду использовать сторонний сервер с поддержкой php, может так многим и не совсем удобно, но это, наиболее умный ход, чем покупать премиум ради забаженного uCoz phP. ИМХО(с)

Передача данных

Самое главное, это правильно отправить данные, для этого я предлагаю использовать метод GET.
Заходим в админку -> управление дизайном -> онлайн игры -> страница материала и комментария к нему.

В том месте где у нас будет ссылка на скачивание файла торрента:
Код
<a href="http://web-server.ru/torrent.php?torrent=$FILE_DIRECT_URL$">Скачать торрент<a/>


Где web-server.ru/torrent.php - это ссылка на php файл, который мы сейчас разберем.

Теперь на вашем php сервере, создаем файл с названием torrent.php, в нем мы будем обрабатывать наш торрент файлик.

Приступим теперь к самому интересному, нам нужно переименовать принятый файл, для я использовал вот такой вот код:

Код

  $file = 'http://site.ru/test.torrent';
  $pathinfo = pathinfo($file);
  $name = 'site.ru_'.$pathinfo['basename'];
  header('Content-Disposition: attachment; filename='.$name);
  header('Content-Type: application/x-bittorrent; name='.$name);
  $x = fread(fopen("$file", "rb"), filesize("$file"));
  print $x;


Только теперь у нас появляется проблема, файл меняет формат, но и использовать мы его не можем, т.к. он повреждается!
На этом я не остановился, ведь есть еще способ, можно попробовать использовать fopen() на бинарном файле, что дальше я и попытался сделать:

Код

$fp = fopen("http://files1.net/Iv10122DLC_1361992651.torrent", "rb");
fpassthru($fp);
fclose($fp);


В функции я использовал 2 параметра, r и b, где первый означает чтение, а второй работу с бинарными файлами.
И знаете, получилось! Казалось что на этом все, осталось только задать заголовок и сохранить файл на компьютер, но не долго длилось счастье! Если взглянуть в код, вы увидите что для теста я использовал ссылку на торрент файл, в чем и была моя глупость, так как при работе с моим косячным юкоз файлом, все было наоборот... это уже потом я понял в чем была моя ошибка, но об этом дальше.

Взглянув на часы, я понял что уже давно не ночь... утро :( а решения проблемы я так и не смог отыскать.. Ладно, ушел я спать, как не странно, утро мудренее вечера !)

Знаете, как в воду глядел! Проснувшись утром, я быстро осознал свои ошибки, и принялся опять за код

Код

header('Content-Disposition: attachment; filename=blabla.torrent');
header("Content-Type: application/x-bittorrent");
header("Content-Length: " . filesize($name));
   
   
$name = "http://site.ru/tor.torrent";
$fp = readfile($name, "rb");


Теперь я объявляю вначале заголовки, затем передаю ссылку на торрент в функцию readfile(), еху! Ну вот теперь, теперь то все точно работает! - а нет... обознался. Работает если открывать любые файлы, и сайты... но не мой баженный файл торрента! Что за напасть!

Ладно, решено было провести тест! И решить наконец, глючит файл, или юкоз...
Перезалил файл на один из своих хостов, и сразу все получилось!!! ДА!11
Видимо дело в том, как юкоз отдает мне файл, тогда выбора нет, придется его временно себе на хост заливать, а потом удалять... Эх..

Как писал ранее, с торрентом нормально подгрузка, а если другой файл, то пишет ошибку:
Warning: readfile(http://хххххх) [function.readfile]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /home/хххххххххх/torrent.php on line 4

Ну не такой я человек, что бы сдаваться! Упрямый же ведь, не стал писать код для загрузки на сервер, решил допилить до конца.
Тут меня осенило, ошибка говорит нам то, что мы не можем по http протоколу подгружать, а у нас в запасе есть еще фтп, и так далее. Сам я плохо разбираюсь в протоколах передачи данных, по этому обратился на форум, где умные дяденьки показали рукой на старый добрый http. Но ведь у нас ошибка? Как быть?! И тут мне опять подсказывают включить на сервере allow_url_fopen. Самостоятельно я включить не мог, ведь этот параметр выставляется хостером в php.ini... писать хостеры тоже нет времени!
Что делать? - Гугл даст ответ! И ведь прав был, дал!

Включить можно в .htaccess если хостер разрешает
php_value allow_url_readfile On

в моем случае, хостер запретил включать эту опцию.

Эх, казалось бы, можно опустить руки, и начать копать в другом направлении. Но я же упрямый... *ушел опять гуглить*

Немного погуглив, я натыкаюсь на интересную функцию:
Код

function file_get_contents_curl($url) {
  $ch = curl_init();
   
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Set cURL to return the data instead of printing it to the browser.
  curl_setopt($ch, CURLOPT_URL, $url);
   
  $data = curl_exec($ch);
  curl_close($ch);
   
  return $data;
}


Все было-бы хорошо, только и тут меня ожидал сюрприз.
Подгружает файлик, а внутри него написано:
Access to this page using your personal data is forbidden.

И тут я просто срываюсь от счастья! Дело в том, что доступ нам закрывает не мой сервер, а сам uCoz, а это значит что мы смогли до него достучатся!!!
Конечно, вам это покажется бредом, ведь, зачем нам функция, если у нас все-равно нет доступа? Все просто, вопрос встает под другим углом, как получить доступ? Может попробовать заголовки отправлять по http протоколу? - Да! Именно так!

На форуме мне моментально умные дяди подсказывают использовать CURLOPT_USERAGENT

Что я очень быстро матаю на ус, и бегу тестировать:
Код

header('Content-Disposition: attachment; filename=blabla.torrent');
header("Content-Type: application/x-bittorrent");
header("Content-Length: " . filesize($name));
   
   
function file_get_contents_curl($url) {
  $ch = curl_init();
   
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Set cURL to return the data instead of printing it to the browser.
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch , CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7");
   
  $data = curl_exec($ch);
  curl_close($ch);
   
  return $data;
}
   
   
   
$name = ("http://xxxxxw.ru/olfschanze-2-p1160_");
print file_get_contents_curl($name);


Карамба! Работает!

Теперь я даю вам готовый код, который будет служить вам верой и правдой(только надо прием гет немного подправить).
Код

header('Content-Disposition: attachment; filename=blabla.torrent');
header("Content-Type: application/x-bittorrent");
header("Content-Length: " . filesize($name));

function file_get_contents_curl($url) {
  $ch = curl_init();

  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Set cURL to return the data instead of printing it to the browser.
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch , CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7");

  $data = curl_exec($ch);
  curl_close($ch);

  return $data;
}

$name = $_GET['torrent'];
print file_get_contents_curl($name);


Данный код вставляется в php файл torrent.php. В качестве безопасности не забудьте изменить прием гета в самом php, я не стал сильно на этом заморачиваться, и привел в коде только как пример.

Вот и все! Теперь если мы передаем баженый юкоз файл в торрент.php, мы получаем нормальный торрент файл!

Всем спасибо за внимание, надеюсь статья вам была полезна! С вами был leonP4, до скорых встреч!

п.с. если кому будет интересно посмотреть, то вот тема на форуме где я разбирал свою проблему cyberforum.ru/php-network/thread803755.html.

Источник: All-for-kompa.ru

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Популярные файлыНовые файлы
Call of Duty 5: World at ...[ Скачали 65455 раз ]
Амфибии, Гайд по ассасина...[ Скачали 29084 раз ]
Амфибии, Гайд по шаманам.[ Скачали 28137 раз ]
cs 1.6 patch v48 full[ Скачали 26720 раз ]
Русский бот PW Alfa v 2.6[ Скачали 15145 раз ]
Огромный пак глюков и баг...[ Скачали 9717 раз ]
civilization 5 скачать бе...[ Скачали 9504 раз ]
PW MP5[ Скачали 8748 раз ]
Niko Bellic (нико белич) ...[ Скачали 7881 раз ]
Perfect World: Совет (Как...[ Скачали 7341 раз ]
Матвиенко Т. (ред.) - Рыб...[ Добавлен 30.10.2019 ]
Сергей Ожегов, Наталия Шв...[ Добавлен 06.12.2018 ]
Mortal Kombat Conquest fo...[ Добавлен 09.03.2013 ]
Дать взятку или сдаться[ Добавлен 09.03.2013 ]
Costa's Freeroam Mod[ Добавлен 30.01.2011 ]
Load chapter mod[ Добавлен 30.01.2011 ]
FreeRide Update[ Добавлен 30.01.2011 ]
Full tuning[ Добавлен 30.01.2011 ]
Free Ride Game DLC[ Добавлен 30.01.2011 ]
Русификатор для World of ...[ Добавлен 30.01.2011 ]