Upload plików na Rapidshare w PHP.

Oto prosta klasa PHP mojego autorstwa do uploadu plików na Rapidshare i usuwania ich z stamtąd.

<?php
/*
        Rapid.php Copyright by Łukasz Fidosz
        You may not use this script for commercial purposes.
        Wykorzystywanie tego skryptu w celach komercyjnych zabronione.
*/
class Rapid{

public $download_link='';
public $delete_link='';

public function __construct($url=null){
  if($url!=null){
    $this->upload($url);
  }
}

protected function get_page_content($url){
        $read = curl_init($url);
        curl_setopt($read, CURLOPT_HEADER, FALSE);
        curl_setopt($read, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($read, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072612 GranParadiso/3.0.1');
        $page=curl_exec($read);
        curl_close($read);
        return $page;
}

protected function is_valid_rapid_url($url){
        if(!empty($url)){
                $url_regex='/^http\:\/\/(www\.)?rapidshare\.(com|de)';
                $url_regex.='\/files\/[0-9]{9}\/[a-z0-9\-_=\?\.]+$/i';
                if(preg_match($url_regex, $url)){
                        return TRUE;
                }
                else{
                        return FALSE;
                }
        }
        else{
                return FALSE;
        }
}
        
public function upload($file){
        if(file_exists($file)){
                if(filesize($file)>0){
                        $url="http://rapidshare.com/";
                        $page=$this->get_page_content($url);

                        preg_match('/action=\"(.*?)\" enctype/is', $page, $form);

                        $postFields['filecontent']='@'.$file;
                        $read=curl_init($form[1]);
                        curl_setopt($read, CURLOPT_POSTFIELDS, $postFields);
                        curl_setopt($read, CURLOPT_RETURNTRANSFER, TRUE);
                        $page=curl_exec($read);

                        preg_match('/<div class=\"downloadlink\">(.*?)<\/div>.*<div class=\"loeschlink\">(.*?)<\/div>/is', $page, $links);
                        $this->download_link=$links[1];
                        $this->delete_link=$links[2];

                        return $this->download_link;
                }
                else{
                        throw new exception('Plik jest pusty!');
                }
        }
        else{
                throw new exception('Plik nie istnieje!');
        }
}

public function delete($url=null){
        if($url==null){
                $url=$this->delete_link;
        }
        if($this->is_valid_rapid_url($url)){
                $page=$this->get_page_content($url);
                if(preg_match('/window.location.href=\'(.*?)\'\" value=\"Delete this file now\" \/>/is', $page, $delete)){
                        $read=curl_init($delete[1]);
                        curl_setopt($read, CURLOPT_RETURNTRANSFER, TRUE);
                        curl_exec($read);
                        curl_close($read);
                }
                else{
                        throw new exception('Pliku nie ma w serwisie Rapidshare!');
                }
        }
        else{
                throw new exception('Nieprawidłowy URL!');
        }
}

}
?>

Postaram się go w skrócie omówić. Zmienne $download_link i $upload_link będą przechowywały odpowiednio link do dodanego pliku i link do usunięcia go. Następnie mamy konstruktor, sprawdzamy w nim czy domyślna wartość argumentu jest różna od domyślnej wartości null, czyli jej braku, wykonujemy wtedy funkcje upload(), dzięki temu możemy tworząc nowy obiekt klasy Rapid od razu załadować plik, jak i również utworzyć obiekt nie wykonując żadnych działań poza tym.

Funkcja get_page_content($url) pobiera zawartość strony WWW i zwraca ją w postaci stringa, działa ona(zresztą jak cały ten skrypt) w oparciu o cURL'a, więc jak by moje opisy komuś nie wystarczyły polecam przeczytać wprowadzenie do tej biblioteki. Ok, teraz po kolei:

  • curl_init($url) tworzy nową sesje cURL'a nawiązując połączenie ze stroną podaną do funkcji jako w zmiennej $url po czym przypisuje uchwyt to tej sesji do zmiennej $read
  • curl_setopt() zmienia ustawienia danej sesji curl, zmienna zawierająca uchwyt do sesji(w naszym przypadku $read) przekazywana jest jako pierwszy parametr, drugi parametr to stała określająca jaką opcję chcemy zmienić, trzeci parametr to wartość tej opcji, więc w naszym przypadku:
    • CURLOPT_HEADER z wartością FALSE sprawia że nagłówki strony nie będą pobierane
    • CURLOPT_RETURNTRANSFER z wartością TRUE sprawia ze wynik działania cURL'a nie będzie wyświetlany na standardowe wyjście(ekran przeglądarki) tylko przekazywany jest do zmiennej
    • CURLOPT_USERAGENT ustawia identyfikacje przeglądarki pod jaką serwer www będzie widział nasz skrypt, czyli w tym przypadku identyfikacje skopiowana z mojego firefoxa: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072612 GranParadiso/3.0.1
  • curl_exec($read) wykonuje sesje cURL'a podana w zmiennej $read po czym zwraca treść pobranej w ten sposób strony, przypisujemy ją do zmiennej $page
  • zamykamy sesje cURL'a funkcją: curl_close($read)
  • i na koniec zwracamy naszą stronę za pomocą: return $page

Następnie mamy funkcję is_valid_rapid_url($url), która służy nam do sprawdzenia czy podany w zmiennej $url link jest prawidłowy. Najpierw sprawdzamy czy przypadkiem nie jest pusty, następnie za pomocą wyrażenia regularnego sprawdzamy czy link ma taką formę jaką mają URL'e w serwisie Rapidshare, czego dokonujemy funkcją preg_match(), jeśli wszystko jest dobrze funkcja zwróci TRUE, w przeciwnym przypadku FALSE.

Zostały nam dwie główne funkcje, jako pierwszą omówimy upload($file) ładującą plik na serwer Rapidshare i zwracającą link do niego, przyjmuje ona jako argument nazwę pliku do załadowania. Sprawdzamy najpierw za pomocą funkcji file_exists($file) czy ten plik istnieje, jeśli nie zwracamy wyjątek: throw new exception('Pliku nie ma w serwisie Rapidshare!'). Sprawdzamy jeszcze funkcją filesize($file) czy plik przypadkiem nie ma zerowej wielkości, uploadowanie pustego pliku nie ma przecież sensu więc w tym przypadku również zwracamy wyjątek. Następnie korzystamy ze znanej nam już funkcji get_page_content, w celu pobrania zawartości strony głównej serwisu Rapidshare i przypisujemy ją do zmiennej $page. Do załadowania pliku potrzebujemy linku znajdującego się w kodzie formularza na pobranej przez nas przed chwilą stronie głównej. Robimy to za pomocą funkcji preg_match(), jak widzimy może ona nie tylko sprawdzać czy wyrażenie zostało odnalezione, jako pierwszy argument podajemy wyrażenie regularne, jako drugi zmienną która będzie przeszukiwana, a jako trzeci zmienną w której w postaci tablicy będą przechowywane kolejne dopasowania do wyrażenia. Zmienna $postFields jest tablicą asocjacyjną przechowującą nazwy pul w formularzu na stronie i wartości jakie zostaną do nich przekazane, w naszym przypadku jest to pole o nazwie filecontent, gdyż właśnie taką nazwę ma to pole na serwisie Rapidshare, a jako wartość przypisujemy mu nazwę naszego pliku(zmienną $file), przekazaną jako argument do tej funkcji. Mamy już wszystkie dane, inicjujemy więc nową sesje cURL, jako link do strony podajemy tym razem link do skryptu uploadującego pliki na Rapidshare, który przed chwilą wyciągnęliśmy za pomocą wyrażenia regularnego i przypisaliśmy do zmiennej $form, która przechowuje tablicę zawierającą pod indeksem 0 cale dopasowane wyrażenie, a pod każdym kolejnym poszczególne interesujące nas części, jako ze w naszym przypadku taka część jest tylko jedna dowołujemy się do pierwszego indeksu tej tablicy. Uchwyt do naszej sesji przypisujemy do zmiennej $read. Przechodzimy zmiany ustawień tej sesji, robiąc to tak jak poprzednio, mamy tu tylko jedna dodatkowa opcje: CURLOPT_POSTFIELDS zawiera ona informacje jakie powinny zostać przesłane do formularza, przekazujemy je w zmiennej $postFields którą przed chwilą opisałem, tym razem także wyłączamy wyświetlanie pliku na standardowe wyjście. Gotowe, pobieramy teraz stronę zapisując ją do zmiennej $page i wyciągamy z niej za pomocą wyrażenia regularnego odnośnik do pliku i ten służący do jego usunięcia, następnie zapisujemy je do zmiennych public $download_link i $delete_link. Jako wynik działania funkcji zwracamy URL do załadowanego już pliku(czyli zmienną $download_link).

Czas na ostatnią funkcję w naszej klasie: delete($url=null). Sprawdzamy najpierw czy argument funkcji, czyli zmienna $url nie ma wartości null, jeśli tak jest to została ona wywołana bez argumentu(ewentualnie ktoś podał wartość null dla niego), w takim przypadku zmiennej $url przypisujemy wartość zmiennej $delete_link, czyli usuniemy ostatnio załadowany plik. Następnie za pomocą funkcji is_valid_rapid_url($url) sprawdzamy czy nasz URL jest prawidłowy, jeśli tak pobieramy jego zawartość funkcją get_page_content($url) i przypisujemy do zmiennej $page, w przeciwnym wypadku zwracamy odpowiedni wyjątek. Wyrażeniem regularnym wyciągamy z tej zmiennej URL usuwający plik, sprawdzamy jednocześnie czy plik nie został już usunięty, bądź link jest fikcyjny, w takim wypadku zwracamy wyjątek. Została już tylko formalność-odwiedzenie naszego linka, czyli tym samym usunięcie pliku.

Źródła skryptu

Tak na zakończenie małe podziękowania dla Atara, który zawsze służy mi drobnymi radami odnośnie PHP.

MegiTeam - mówimy Twoim językiem

Komentarze do notki Upload plików na Rapidshare w PHP.

  1. Arek F. powiedział(a):

    Nie będziemy wykorzystywać w _cleach_ komercyjnych ;)

  2. virhilo powiedział(a):

    Hehe. Tak myślałem;)

  3. Gozd3k powiedział(a):

    <EXCERPT> ...

  4. Arek F. powiedział(a):

    Błąd jest no :D

  5. virhilo powiedział(a):

    @Gozd3k <EXCERPT> nie chciało mi działać coć, ale już chyba jest ok:)

    @Arek F. Faktycznie, nie zauwazylem, zbyt zabiegany jestem;)

  6. mosh powiedział(a):

    dobra klasa :)
    na pewno się przyda dla mnie :d
    thx

W górę » Strona główna

Dodaj komentarz: