Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [java] Downloader
Forum PHP.pl > Inne > Hydepark
230005
Piszę program do ściągania plików z m.in rapidshare i zawiesiłem się na najważniejszej rzeczy - samym ściąganiu winksmiley.jpg. Interfejs RS jest dwuetapowy - najpierw trzeba kliknąć czy jest się premium, czy free user, potem przechodzi się do ściągania. Firebug mówi, że tylko jedna zmienna jest (na pierwszym etapie) przesyłana - dl.start=Free (odpowiednio inna dla premium, ale na tym mi nie zależy), no i ją wysyłam:

  1.  
  2. url = new URL("tutaj adres");
  3. urlConn = url.openConnection();
  4. urlConn.setDoOutput(true);
  5.  
  6. String data = URLEncoder.encode("dl.start", "UTF-8") + "=" + URLEncoder.encode("Free", "UTF-8");
  7. PrintWriter wr = new PrintWriter(urlConn.getOutputStream());
  8. wr.print(data);
  9. wr.close();
  10.  
  11. //dalej odczytuję
  12.  


Zawsze w odpowiedzi dostaję pierwszą stronę, zamiast tej, która powinna pokazać się po kliknięciu. Nawet wysyłałem te same nagłówki, co FX - wciąż nic. Jak zrobić tak, żeby działało biggrin.gif?

Edit:

A dokumentacja api rapidshare na ten temat milczy...
bim2
Na moją logikę to musisz udać czekanie, tj odczekać ileś tam sekund i dopiero bo na pewno to sprawdzają po stronie serwera.
230005
To akurat wiem, ale do tego etapu jeszcze nie doszedłem. Mi chodzi o miejsce gdzie klikasz "free user" i przenosi cię na kolejną stronę - czyli zatwierdzasz formularz, i dostajesz odpowiedź. Ja w odpowiedzi dostaję tą samą stronę, tak jakby formularz nie został wysłany. Myślałem, że może jakieś pole tego właśnie formularza mi umyka, ale w źródle strony jest tylko jedno pole które trzeba przesłać. W firebugu też jest napisane, że tylko ono zostało wysłane...
bim2
Hmm, może sprawdzają ciasteczkami czy byłeś na wcześniejszej stronie (bot checker). Użyj curla i zapisz ciastko. No i odwiedz ta strone z wyborem w takim razie.
zegarek84
Cytat(230005 @ 26.05.2010, 22:57:58 ) *
To akurat wiem, ale do tego etapu jeszcze nie doszedłem. Mi chodzi o miejsce gdzie klikasz "free user" i przenosi cię na kolejną stronę - czyli zatwierdzasz formularz, i dostajesz odpowiedź. Ja w odpowiedzi dostaję tą samą stronę, tak jakby formularz nie został wysłany. Myślałem, że może jakieś pole tego właśnie formularza mi umyka, ale w źródle strony jest tylko jedno pole które trzeba przesłać. W firebugu też jest napisane, że tylko ono zostało wysłane...

co do formularzy i niektórych adresów to strony na które jest się skierowanym nie zawsze są docelowymi, często zdarzają się przekierowania... co do firebug'a to on nie do tego służy ;] (przydatny jest ale...)... jeśli chcesz wcześniej przeanalizować co gdzie się dzieje, co dokładnie jest wysyłane, jakie nagłówki [w tym ciasteczka, post i np. referer...], czy nastąpiło przekierowanie i inne to pod mozille polecam inne narzędzie jakim jest:
Live HTTP Headers

jeśli w odbieraniu i symulowaniu przeglądarki za wiele z surowymi nagłówkami nie chcesz się bawić to polecam jak kolega wyżej cURL'a który na pewno ma interfejs także dla javy...
230005
Kurde, no ten Live HTTP headers pokazuje raczej to co już wiem:

#request# POST http://rs30.rapidshare.com/files/140895646...ndows.part1.rar
POST /files/140895646/netbeans-6.1-ml-windows.part1.rar dl.start=Free
#request# POST http://rank.ant.com/fetch/
#request# GET http://rs30.rapidshare.com/img2/styles.css
#request# GET http://rs30.rapidshare.com/img2/favicon.ico
#request# GET http://rs30.rapidshare.com/img2/favicon.ico
#request# GET http://rs30.rapidshare.com/img2/menu_bg.gif
#request# GET http://rs30.rapidshare.com/img2/rslogo.gif
#request# GET http://rs30.rapidshare.com/img2/pfeil.jpg
#request# GET http://rs30.rapidshare.com/img2/stepx_sprite.gif
#request# GET http://rs30.rapidshare.com/img2/content_bg...ttom_sprite.gif
#request# GET http://rs30.rapidshare.com/img2/content_bg_middle.gif
#request# GET http://rs30.rapidshare.com/img2/symbol_fertig_small.gif
#request# GET http://rs30.rapidshare.com/img2/preisschild_bg.gif
#request# GET http://rs30.rapidshare.com/img2/prepaid_preisschild_bg.jpg
POST /fetch/ url=http%3A%2F%2Frs30.rapidshare.com%2Ffiles%2F140895646%2Fnetbeans-6.1-ml-windows.part1.rar&ref=http%3A%2F%2Frapidshare.com%2Ffiles%2F140895646%2Fnetbeans-6.1-ml-windows.part1.rar&uid={FED810E7-A8A4-4710-8111-BF2F11BDAEDC}


Większość tego to jak widać obrazki, ale np. zastanawia mnie to: POST /fetch/ url=http%3A%2F%2Frs30.rapidshare.com%2Ffiles%2F140895646%2Fnetbeans-6.1-ml-windows.part1.rar&ref=http%3A%2F%2Frapidshare.com%2Ffiles%2F140895646%2Fnetbeans-6.1-ml-windows.part1.rar&uid={FED810E7-A8A4-4710-8111-BF2F11BDAEDC} . Wie ktoś co to jest i ew. jak to zemulować biggrin.gif?

Termin oddania projektu zbliża się wielkimi krokami, a ja chyba wziąłem sobie zadanie, które przynajmniej obecnie mnie przerasta...
zegarek84
Cytat(230005 @ 27.05.2010, 17:42:26 ) *
Kurde, no ten Live HTTP headers pokazuje raczej to co już wiem:
...
Termin oddania projektu zbliża się wielkimi krokami, a ja chyba wziąłem sobie zadanie, które przynajmniej obecnie mnie przerasta...
z rapidshare nie maiłem potrzeby się bawić ale... jak analizować dane?? które z resztą nie wszystkie przedstawiłeś ;p...
włączasz ten live... i chodzisz po jak najmniejszej liczbie stron wykonując jak najmniej akcji jakich trzeba by ściągnąć plik w przeglądarce...

jako punkt startowy masz stronę z której startowałeś - patrzysz czy coś się nie poustawiało - jak tylko cookies to luz... analizujesz czy coś Cię nie przekierowało [nagłówek "Location" - czyli redirect...] - kopiuj sobie kluczowe nagłówki i dane do innego pliku celem dalszej analizy bo jak widzisz masz jeszcze te css, obrazki i javascript... analizuj za koleją wszystkie linki związane z domeną i przekierowania z tej domeny...

dodatkowo zwróć uwagę czy przy jakimś obrazku, pliku css lub javascript nie jest dodatkowo ustawiony cookies [może być tak, że w ten sposób w późniejszym etapie rozpoznają przeglądarkę - nie bawiłem się tam...]... gożej jeśli jednym z zabezpieczeń będzie wczytanie konkretnego pliku - czy to obrazka, pliku css lub javascript [ostatnie raczej odpada] - wczytując plik do przeglądarki wysyła się identyfikator sesji - na tej podstawie mogą zapisać sobie w sesji czy ten ktoś może ściągać czy nie [akurat jako zabezpieczenie sam tak raz zrobiłem ale nie na ściąganie plików] - no i jeszcze to co pisali plus odczekanie czasu...

cookies się nie przejmujesz bo jeśli skorzystasz z cURL'a chodząc po następnych stronach sam wyśle cookies [ale musisz dać w ustawieniach coby te cookies gdzieś zapisywał...], zastosowanie cURL'a w javie raczej będzie podobne jak w php - a zestaw jego funkcji jest dobrze opisany na manualu php z przykładami w komentarzach...

dodatkowo na określonych stronach możesz mieć wygenerowane jakieś klucze czy to w formularzu czy inaczej... więc pasuje się tym danym dokładnie przyjrzeć gdyż na poszczególnym etapie po przekierowaniach lub po przejściu strony być może będziesz musiał stronę przeszukać... model DOM jest zaimplementowany w wielu językach więc zapewne i do javy znajdziesz klasy coby było łatwiej bez wyrażeń regularnych...

jeśli w danym etapie będziesz musiał wysłać dane POST to w cURL'u są także do tego odpowiednie funkcje...

jeśli jednak nie chcesz korzystać z cURL'a oraz nie znasz żadnego klienta HTTP w javie [mam na myśli zestaw klass] to będziesz musiał sobie sam takie cosik napisać, czyli zestaw klas wysyłających odpowiednie nagłówki podczas połączenia...

PS. i jeśli dane będziesz wysyłał jako surowe nagłówki to co do POST będziesz musiał podać nagłówek jeszcze:
  1. $dataPost = http_build_query($this->post);
  2. // gdzie w php istnieje funkcja http_build_query... z kolei $this->post to po prostu tablica asocjacyjna gdzie array(klucz=>wartość)
  3. $this->headers['Content-Type'] = 'application/x-www-form-urlencoded';
  4. // i obliczyć długość post'u... - to jest wycinek z mojej klasy w php...
  5. $this->headers['Content-Length'] = strlen($dataPost);
z kolej po wszystkich nagłówkach będziesz musiał dodać 2 znaki "\r\n" czyli "\r\n\r\n" i dalej podajesz treść POST'a czyli $dataPost... i dodatkowo każdy z nagłówków jest od siebie oddzielony jednym windowsowym enterem "\r\n" - koniec nagłówków to właśnie 2 entery...

wysyłanie cookies to wysłanie nagłówka "Cookie"... gdzie ja np. pobierając w fragmencie kodu cookies jako tablicę array(klucz=>wartość) z bazy budowałem mniej więcej tak:
  1. $cookies = $this->cookies->cookiesGet($this->host, $this->path);
  2. $tempCookies = array();
  3. while (list($key) = each($cookies)) {
  4. $tempCookies[] = urlencode($key) . '=' . urlencode($cookies[$key]);
  5. }
  6. $this->headers['Cookie'] = implode('; ', $tempCookies);


co do wysyłania surowych nagłówków to deczko grubszy temat jeśli ich się nie rozumie... dlatego najprościej skożystać właśnie z cURL'a...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.