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

Тема в разделе "PHP", создана пользователем Delayer, 19 янв 2011.

Модераторы: latteo
  1. Delayer

    Delayer Создатель

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

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

    пробовал разные методы, вот примеры:
    1. Использовал Curl. Результат фаил нулевой длины, т.е. вроде редирект не произошел но и фаил не скачался...
    PHP:
    $ch curl_init();
                    
    curl_setopt($chCURLOPT_URL$file[1]);
                    
    curl_setopt($chCURLOPT_TIMEOUT3000);
                    
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
                    
    curl_setopt($chCURLOPT_VERBOSE1);
                    
    curl_setopt($chCURLOPT_FOLLOWLOCATION0);
                    
    curl_setopt($chCURLOPT_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($newffread($file1024 8), 1024 8);
                            }
                   }

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

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


    $file[1] во всех случаях один: Перейти по ссылке

    Пожалуйста, помогите кто может, я думаю надо как то с курл чуть чуть подделать и все норм будет, но не соображу как...
     
  2. steel_HILL

    steel_HILL Постоялец

    Регистр.:
    15 апр 2010
    Сообщения:
    53
    Симпатии:
    14
    Переходил по редиректу с Нулледа - при первом переходе открылась страница, а при втором уже пошел запрос на закачку. В куку записалась только id сессии(значит по рефереру уже можно не заморачиватся) - короче сначала при первом запросе включаем отображение только хидеров:
    Теперь читаем заголовки, например, в массив $headers,
    ищем поле "Set-Cookie:", если есть, извлекаем:
    И тогда уже получив PHPSESSID куки, отправляем их по второму разу:
     
  3. bleqy

    bleqy Писатель

    Регистр.:
    12 янв 2011
    Сообщения:
    7
    Симпатии:
    1
    Вам нужно использовать встроенные функции CURL для работы с файлами, а не использовать fopen/file_get_contents
     
  4. Delayer

    Delayer Создатель

    Регистр.:
    4 июл 2009
    Сообщения:
    39
    Симпатии:
    4
    т.е. мне нужно послать 2 запроса, первому разрешить FOLLOWLOCATION забрать оттуда заголовки, вытащить куку, вписать ее во второй запрос и только потом посылать запрос на скачивание? я правильно понял?
     
  5. Delayer

    Delayer Создатель

    Регистр.:
    4 июл 2009
    Сообщения:
    39
    Симпатии:
    4
    чтото все равно ничего не вышло...
    PHP:
    $ch curl_init();
                    
    curl_setopt($chCURLOPT_URL$file[1]);
                    
    curl_setopt($chCURLOPT_TIMEOUT3000);
                    
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
                    
    curl_setopt($chCURLOPT_VERBOSE1);
                    
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
                    
    curl_setopt($chCURLOPT_REFERER$murl);
                    
    curl_setopt($chCURLOPT_HEADER1);


                    
    $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($chCURLOPT_URL$file[1]);
                    
    curl_setopt($chCURLOPT_TIMEOUT3000);
                    
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
                    
    curl_setopt($chCURLOPT_VERBOSE1);
                    
    curl_setopt($chCURLOPT_FOLLOWLOCATION0);
                    
    curl_setopt($chCURLOPT_REFERER$murl);
                    
    curl_setopt($chCURLOPT_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);

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