Ściąganie plików a przekierowanie strony

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Ściąganie plików a przekierowanie strony

Nowy postprzez husky83 » niedziela, 5 kwietnia 2009, 14:43

Witam,
Chcę ściągać pliki z pewnej strony.. Mam adres pliku, powiedzmy:
http://adres.pl/plik
Użyłem kodu jak na stronie:
http://cyfbar.republika.pl/nadeslane/rainrider.htm

I pojawił się pewien problem - otóż pobierany plik miał zawsze wielkość 0 bajtów.. Okazało się, że pod adresem który wpisuje serwer zwraca nagłówek:
(...)
HTTP/1.x 302 Found
(...)
Location: http://inny.adres.pl/inna/sciezka/do/pliku.txt


Pytanie.. Jak zrobić, aby downloader podążał za przekierowaniami?
Lub jak pobrać sam nagłówek strony w c(++)? (ten pobralem przez LiveHTTP w firefoxie)
Pobierając sam nagłówek mógłbym z niego wyciągnąć już to co mnie interesuje i ściągać plik bezpośrednio, ale jakoś nie mam pomysłu jak to zrobić...

Z góry dziękuję za pomoc :)
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez Cyfrowy Baron » niedziela, 5 kwietnia 2009, 14:54

Strona przekierowująca zawiera prosty kod:


<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<title>Nowa strona 1</title>
<script language="JavaScript">
<!--
window. location ="http://programowanie.cal.pl/forum/index.php";
//-->
</script >
</head>
<body>
</body>
</html>




jak widać znajduje się tutaj adres strony właściwej: index.php
wystarczy więc wyciągnąć ten adres i pobrać tą stronę.
► patrz serwis: Cyfrowy Baron dział: porady -> sieć - internet, porada: Wyciąganie adresów URL ze stron internetowych.
Kod trzeba oczywiście nieco zmodyfikować, gdyż znaczniki, które przedstawiłem w kodzie nie występują na stronie przekierowującej, więc zamiast nich wystarczy skupić się na znaczniku location.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez husky83 » niedziela, 5 kwietnia 2009, 14:59

Tylko chodzi mi raczej o przekierowanie w stylu
Kod: Zaznacz cały
<?php
header("Location: http://new_location");
?>
w pliku który chce pobrać..

Więc przeglądanie kodu html nic nie da, bo takowego (bezpośrednio pod tym adresem) nie ma.. Jest tylko przekierowanie przez nagłówek HTTP - i jak ten nagłówek przejąć i przetrawić (a raczej jak go pobrać)?
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez Cyfrowy Baron » niedziela, 5 kwietnia 2009, 16:55

Jest tylko przekierowanie przez nagłówek HTTP


Czyli coś jest.
Niczego nie przekierujesz ot tak wysyłając jakieś instrukcje, gdyż każda przeglądarka parsuje kod i wyświetla jego zawartość, Ty musisz postąpić dokładnie tak samo, czyli trzeba najpierw ustalić co masz pod wskazanym adresem.

Podaj adres z którego chcesz ściągnąć plik.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez husky83 » niedziela, 5 kwietnia 2009, 18:11

dokładnie.. I właśnie mnie zastanawia jak przechwycić nagłówek.. Próbowałem tą funkcją i zwraca pusty plik.. Domyślam się że żeby przejąć nagłówek, muszę użyć innej funkcji albo przerobić tą.. I właśnie tego dotyczy pytanie -jak przechwycić nagłówek ?

Tutaj pobrałem nagłówek przez Live HTTP Headers w Firefoxie.. Z przetworzeniem go też raczej nie będzie problemu.. Tylko jak go pobrać :/
Może muszę coś 'ręcznie' zadziałać z socketami? jeśli tak - jak? niestety nie znam protokołu HTTP (chociaż fakt, kiedyś trzeba się nauczyć), ale to jest akurat dosyć pilne, więc naukę muszę przełożyć na inny raz ;) Ma ktoś jakieś 'wizje' jak przejąć sam nagłówek ?

Adres..

Właściwie będą to różne adresy, ale przykładowo na tej samej zasadzie działa wrzuta, czyli:
pod adresem
http://wrzuta.pl/aud/file2/j5XEABOtq9
jest przekierowanie przez nagłówek HTTP na
http://va.wrzuta.pl/wa5686/7a54250c0008 ... BOtq9&ft=f
Czyli nie ma zadnej ukrytej ramki, nie ma zadnego kodu html pod pierwszą stroną, tylko od razu przekierowanie w nagłówku http...
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez polymorphism » niedziela, 5 kwietnia 2009, 18:37

Ma ktoś jakieś 'wizje' jak przejąć sam nagłówek ?

Wysłać zapytanie GET do serwera i jeśli dostaniesz w odpowiedzi kod 302, to znowu wysyłasz zapytanie GET, tylko z nowym adresem (location). Jeśli dostaniesz kod 2xx, to znaczy, że serwer wysyła plik.

Czyli mniej więcej wysyłasz coś takiego:

    GET /aud/file2/j5XEABOtq9 HTTP/1.1<CRLF>
    Host: wrzuta.pl<CRLF>
    Connection: close<CRLF>
    <CRLF>

i w odpowiedzi dostaniesz, albo:

    HTTP/1.1 200 OK<CRLF>
    ...
    <CRLF> <--- pusta linia kończy nagłówek
    <dane pliku>
albo
    HTTP/1.1 302 OK<CRLF>
    ...
    Location: <adres><CRLF>
    <CRLF>
Wszystko robisz na socketach.
Ostatnio edytowano niedziela, 5 kwietnia 2009, 22:45 przez polymorphism, łącznie edytowano 1 raz
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez Cyfrowy Baron » niedziela, 5 kwietnia 2009, 20:06

Można ściągnąć plik z podanego adresu nie zawracając sobie głowy przekierowaniem, gdyż istnieje funkcja, która automatycznie się przekieruje. Problemem pozostaje jednak dostęp do bazy danych (jak sądzę MySQL) zawierającej informacje o tym co to za plik.
Ustaliłem, że jest to jakiś plik dźwiękowy w formacie MPEG Audio. Ściągając plik na dysk trzeba jawnie ustalić nazwę pliku:

Kod: Zaznacz cały
   #include <urlmon.h>
//---------------------------------------------------------------------------
//  [...]
#pragma comment(lib, "urlmon.lib")
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String FileName = "plik.mpeg";
AnsiString Url = "http://wrzuta.pl/aud/file2/j5XEABOtq9";
AnsiString FileResult = "c:\\" + FileName;


URLDownloadToFile(0, Url.c_str(), FileResult.c_str(), 0, 0);
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez polymorphism » niedziela, 5 kwietnia 2009, 20:58

Nazwę pliku masz w linku z przekierowania - Ira%20-%20Moj%20Dom, typ pliku z nagłówka odpowiedzi - Content-Type: audio/mpeg.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez Cyfrowy Baron » niedziela, 5 kwietnia 2009, 21:18

Rzeczywiście. Wystarczy wiec odczytać nazwę po ostatnim ukośniku, np:

(kod niesprawdzony - pisałem z pamięci)
Kod: Zaznacz cały
String adres = "http://va.wrzuta.pl/wa5686/7a54250c0008ac2047722d88/818ca5f587a764f26f09a39044b9a57349d8d7a0/Ira%20-%20Moj%20Dom?type=a&key=j5XEABOtq9&ft=f";

int a = adres.LastDelimiter("/");
adres = adres.SubString(a - 1, adres.Length());
int b = adres.Pos("?");
String result = adres.SubString(1, b - 1);
result = StringReplace(result, "%20", " ", TReplaceFlags() << rfReplaceAll);


Pozostaje jednak kwestia pobrania właściwego adresu, gdyż zaprezentowana przeze mnie funkcja nie zwraca adresu, lecz automatycznie przekierowuje.
Jako ciekawostkę dodam, że funkcja URLDownloadToFile pochodzi z biblioteki urlmon.dll, będącej częścią programu Internet Explorer począwszy od wersji 3.0
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez polymorphism » niedziela, 5 kwietnia 2009, 22:35

Pozostaje jednak kwestia pobrania właściwego adresu

No tak, ale to nie jest (jakiś wielki) problem, jeśli użyjesz socket'ów i zrobisz tak, jak pisałem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Ściąganie plików a przekierowanie strony

Nowy postprzez husky83 » poniedziałek, 6 kwietnia 2009, 10:04

Znalazłem troszkę więcej czasu i przerobiłem tamtą funkcję.. a raczej.. jestem w trakcie przerabiania ;) Bo coś ostatnio mam po 5 minut czasu na takie zabawy ;) W każdym razie w tamtej funkcji była funkcja omijająca nagłówek, a teraz robie to tak że przechwytuje ten nagłówek i sprawdzam co zwraca.. Brakuje mi jeszcze odnajdowania znacznika Location i pobierania adresu z niego, ale to już bez problemu pójdzie.. Potem chcę rekurencyjnie wywołać znowu funkcję Download..

Jak znajdę czas na skończenie, to wrzucę tutaj uaktualnioną funkcję z obsługą przekierowań ;)
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość