Скачать MP3 c другого серва

Delayer

Создатель
Регистрация
4 Июл 2009
Сообщения
39
Реакции
4
Здравствуйте, столкнулся с такой проблемой: беру удаленную страницу, на ней есть плеер где проигрывается мп3 фаил, парсю страницу забираю параметр - ссылку на этот фаил, мне нужно его скачать к себе на хост.

проблема в том, что когда пытаюсь забрать фаил скриптом сервак редиректит скрипт обратно на страницу с плеером, хотя если вставляю ссылку просто в окно браузера, то фаил качается на комп нормально.

пробовал разные методы, вот примеры:
1. Использовал Curl. Результат фаил нулевой длины, т.е. вроде редирект не произошел но и фаил не скачался...
PHP:
$ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $file[1]);
                curl_setopt($ch, CURLOPT_TIMEOUT, 3000);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_VERBOSE, 1);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
                curl_setopt($ch, CURLOPT_REFERER, $murl);


                $st = curl_exec($ch);


                $fd = @fopen($_SERVER['DOCUMENT_ROOT'].'/media/music/'.$name , 'w');
                fwrite($fd, $st);
                @fclose($fd);

                curl_close($ch);


2. file_get_contents(). Редирект
PHP:
                $mp3 = file_get_contents($file[1]);
                file_put_contents($_SERVER['DOCUMENT_ROOT'].'/media/music/'.$name, $mp3);


3. fopen() fwrite(). Редирект
PHP:
                $destination_folder = 'media/music/';

                $url = $file[1];
                $newfname = $destination_folder . basename($url);

                $file = fopen($url, "rb");
                if ($file) {
                    $newf = fopen($newfname, "wb");

                    if ($newf)
                        while (!feof($file)) {
                            fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
                        }
               }

               if ($file) {
                    fclose($file);
                }

                if ($newf) {
                    fclose($newf);
                }


$file[1] во всех случаях один:

Пожалуйста, помогите кто может, я думаю надо как то с курл чуть чуть подделать и все норм будет, но не соображу как...
 
Переходил по редиректу с Нулледа - при первом переходе открылась страница, а при втором уже пошел запрос на закачку. В куку записалась только id сессии(значит по рефереру уже можно не заморачиватся) - короче сначала при первом запросе включаем отображение только хидеров:
curl_setopt ($ch, CURLOPT_HEADER, 1);
Теперь читаем заголовки, например, в массив $headers,
ищем поле "Set-Cookie:", если есть, извлекаем:
for($i=0; $i<sizeof($headers); $i++){
if(preg_match('@Set-Cookie:\s.*?(PHPSESSID=[^;=]+?;)@i', $headers[$i], $matches)) !== FALSE){
$kyka = $matches[0];
}
}
И тогда уже получив PHPSESSID куки, отправляем их по второму разу:
curl_setopt($ch, CURLOPT_COOKIE, $kyka);
 
Вам нужно использовать встроенные функции CURL для работы с файлами, а не использовать fopen/file_get_contents
 
т.е. мне нужно послать 2 запроса, первому разрешить FOLLOWLOCATION забрать оттуда заголовки, вытащить куку, вписать ее во второй запрос и только потом посылать запрос на скачивание? я правильно понял?
 
чтото все равно ничего не вышло...
PHP:
$ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $file[1]);
                curl_setopt($ch, CURLOPT_TIMEOUT, 3000);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_VERBOSE, 1);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                curl_setopt($ch, CURLOPT_REFERER, $murl);
                curl_setopt($ch, CURLOPT_HEADER, 1);


                $st = curl_exec($ch);

                    if (preg_match('@Set-Cookie:\s.*?(PHPSESSID=[^;=]+?;)@i', $st, $match) !== FALSE){
                     $kyka = $match[0];
                    }


                echo $kyka;
                curl_close($ch);


                $ch = curl_init();

                curl_setopt($ch, CURLOPT_URL, $file[1]);
                curl_setopt($ch, CURLOPT_TIMEOUT, 3000);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_VERBOSE, 1);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
                curl_setopt($ch, CURLOPT_REFERER, $murl);
                curl_setopt($ch, CURLOPT_COOKIE, $kyka);

                $st = curl_exec($ch);
                echo $st;
                $fd = @fopen($_SERVER['DOCUMENT_ROOT'].'/media/music/'.$name , 'w');
                fwrite($fd, $st);
                @fclose($fd);

                curl_close($ch);

вот такой код получился, кука находится нормально, вставляю ее, а оно все равно редиректит... может чтото не так делаю...
 
Назад
Сверху