Pobranie PNG z http za pomocą Wininet.h

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

Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez politech » poniedziałek, 17 stycznia 2011, 16:48

Witam
Pisze sobie program, który ma za zadanie ściągnąć obrazek PNG ze strony http. Zgodnie z manualem do wininet poprawnie obsługuje sesje HTTP, za pomocą HttpSendReqest wysyłam odpowiedniego Get'a (sczytane za pomocą Live HTTP headers) i dochodzę do użycia funkcji InternetReadFile i tutaj mam mały problem. Chciałbym aby ten pobrany obrazek został wyświetlony w programie a zgodnie z opisem InternetReadFile musze podać wskaznik na bufor z danymi oraz liczbe bajtów do sczytania. Moje pytanie brzmi: jaki ma być to bufor(jaki typ)? Do czego można zapisać pobrany obrazek, bo do wyświetlenia go posłużę się czymś co builder ma zaimplementowane.

Z góry dziękuja za pomoc
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 16:53

Format pliku nie ma znaczenia, plik to plik.
► patrz serwis: Cyfrowy Baron dział: porady -> sieć - internet -> Ściąganie plików z Internetu przez protokół HTTP (bez Indy).

Jeżeli chcesz wyświetlać pliki graficzne bezpośrednio z sieci w swoim programie np. w TImage, to oczywiście jest problem jeżeli chodzi o pliki PNG, gdyż standardowo w środowisku brak bibliotek do obsługi tego programu graficznego, ale wyświetlenie grafiki nie stanowi problemu i opisałem to w serwisie Cyfrowy Baron w dziale: porady -> sieć - internet -> Wyświetlanie plików graficznych bezpośrednio z Internetu.

Pliki PNG możesz oczywiście bez dodatkowych bibliotek wyświetlać w TImage lub innym obiekcie z wykorzystaniem GDI+, co opisałem w serwisie Cyfrowy Baron w dziale: porady -> grafika -> Wyświetlanie grafiki z wykorzystaniem biblioteki gdiplus.dll GDI+.

Jeżeli chcesz jednak wyświetlać grafikę w formacie PNG bez problemu w TImage to musisz pobrać i zainstalować darmową wersję komponentów LMD-Tools Special Edition do pobrania ze strony http://www.lmdtools.com/download/. Komponenty występują w wersji komercyjnej i darmowej. W darmowej jest ich po prostu mniej. Musisz pobrać paczkę odpowiednią do wersji Twojego środowiska. Te komponenty mają bibliotekę obsługującą format PNG i GIF - nie animowany, po zainstalowaniu TImage będzie obsługiwać te dodatkowe formaty plików.
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez politech » poniedziałek, 17 stycznia 2011, 19:26

obrazek, który chce pobrać to standardowy obrazek weryfikacyjny przy zakładaniu konta co wiąze się z tym, że jego adres to http://www.jakisadres.com.br/securimage ... e_show.php, nie zalezy mi na tym żeby go bezpośrednio wyświetlać ze strony-może on zostać najpierw zapisany an dysk i dopiero później w programie. Pytanie czy forma w jakiej ten obrazek jest na stronie tzn jest on generowany każdorazowo przy wejsciu na strone umozliwia ściagnięcie go jako zwykły plik czy tzreba np połaczyć sie ze strona i uzyskać GET'em jakoś ten obrazek?
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPChrome

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez Cyfrowy Baron » wtorek, 18 stycznia 2011, 12:12

Nie mam pojęcia jak uzyskać adres takiego obrazka. Gdy np. pobrałem adres obrazka z HOTFILE to wyświetliło mi taki: http://www.google.com/recaptcha/api/image?c=03AHJ_VuuhTSU2jM2lHImFOb7BRqGl1lw6E2yOj9JxvzRg8_0RqR5KkKUqRQ009sbWv1Sd8flnk-rHp1H8D9rgFF0e8DBcCl3VBcIeACA22jcbi3dBXwo9l5v9GaN0v6A8C16IcbgwXRJOvfwrULuhxZ_TLu3BGrDZ5w.
Przypuszczam, że by uzyskać dostęp do takiego obrazka trzeba wysłać jakieś polecenie tak jak przeglądarka, a dopiero potem gdy zwrócony zostanie adres obrazka, możliwe będzie jego pobranie.
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez polymorphism » wtorek, 18 stycznia 2011, 12:27

W przypadku tego linka żadnej większej filozofii nie ma. Wysyłasz typowe zapytanie GET, a w odpowiedzi dostajesz obrazek. W nagłówku odpowiedzi, atrybut Content-Type określa typ danych, które serwer wysłał, tzw. mime type. Tutaj była to wartość 'image/jpeg'.
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez politech » wtorek, 18 stycznia 2011, 13:41

ok czyli robie HttpOpenRequest nastepnie HttpSendRequest z odpowiedni GET'em i poźniej InternetReadFile z tym, że jaki parametr mam wywołac(jaki typ?) jako wskaznik do bufora danych?
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPChrome

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez polymorphism » wtorek, 18 stycznia 2011, 14:05

Taki sam jakbyś ściągał stronę lub cokolwiek innego.
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez politech » wtorek, 18 stycznia 2011, 18:48

Kod: Zaznacz cały
bool zaloz_konto_poke(){
  HINTERNET handle3,handle4, handle5,handle6,handle7,handle8,handle2,handle1;
  char* agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)";
  AnsiString obrazek="/securimage/securimage_show.php";
  handle1 = InternetOpen(agent, 0, NULL, NULL, 0);
  handle2 = InternetConnect(handle1, "www.pokemononline.com.br", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
  handle3 = HttpOpenRequest(handle2, "GET", "/createaccount.php", NULL, NULL, 0, INTERNET_FLAG_SECURE,0);
  //GET /securimage/securimage_show.php
  bool z=HttpSendRequest(handle3,
                "Content-Type: image/png\r\n",
                -1,
                (LPVOID)obrazek.c_str(),
                strlen(obrazek.c_str()) + 1);

    SetCursor(LoadCursor(NULL,IDC_WAIT));
        int error=GetLastError();


Dla takiego kawałka kodu otrzymuje błąd 12157 czyli The application experienced an internal error loading the SSL libraries. Nie bardzo rozumiem dlaczego- czy strony http tez mają zabwzpieczenia SSL i jeżeli tak to jak sobie z tym poradzić? Może źle zinterperetowałem manuala i nie tak powinno się wysyłać GET. Z góry dziękuje za pomoc
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPChrome

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez polymorphism » wtorek, 18 stycznia 2011, 19:07

A co ty robisz? Chcesz ściągnąć zawartość spod adresu http://www.pokemononline.com.br/securimage/securimage_show.php. Więc po jakiego grzyba wysyłasz zapytanie na adres http://www.pokemononline.com.br/createaccount.php?!
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez Cyfrowy Baron » wtorek, 18 stycznia 2011, 21:14

Wydaje mi się, że wysłanie zapytania na adres http://www.pokemononline.com.br/securimage/securimage_show.php. zwróci co prawda obrazek losowy, ale co komu po nim. Nie chodzi chyba tyle o jakikolwiek obrazek, lecz o obrazek towarzyszący stronie rejestracyjnej stąd zapytanie do strony http://www.pokemononline.com.br/createaccount.php. Problem w tym, że wysłanie załadowanie którejkolwiek strony powoduje wywołanie nowego obrazka. Chyba nie da się tego łatwo zrobić za pomocą zapytań, nie mówiąc już o sprawdzeniu co obrazek zawiera.
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez polymorphism » wtorek, 18 stycznia 2011, 21:43

Nie chodzi chyba tyle o jakikolwiek obrazek, lecz o obrazek towarzyszący stronie rejestracyjnej stąd zapytanie do strony http://www.pokemononline.com.br/createaccount.php.

Tak, ale zapytanie na ten adres zwróci zawartość strony, a politech od początku pisze o ściągnięciu obrazka. A jak chce "powiązać" formularz rejestracyjny z capcha, to musi wpierw ściągnąć stronę, a następnie obrazek, pamiętając o obsłudze ciasteczek (nie wiem, czy wininet je obsługuje, być może tak...).

Z kodu, który przedstawił, jasno wynika, że nie do końca rozumie, co pisze.
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez Cyfrowy Baron » wtorek, 18 stycznia 2011, 21:52

A jak chce "powiązać" formularz rejestracyjny z capcha, to musi wpierw ściągnąć stronę, a następnie obrazek, pamiętając o obsłudze ciasteczek (nie wiem, czy wininet je obsługuje, być może tak...).


Ja się tylko domyślam o co jemu chodzi, ale powiązanie captcha z formularzem rejestracyjnym to spory problem, nie wiem czy obsługa ciasteczek coś zmieni. Po pobraniu strony na dysk pobiera się captcha który jest tam wyświetlany, więc rozwiązaniem problemu mogłoby być właśnie takie pobranie. Tylko nie do końca to rozumiem, gdyż pobrany captcha nazywa się securimage_show.png. Nie bardzo wiem jak można by to pobrać.
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez politech » wtorek, 18 stycznia 2011, 22:02

Chcę zrobić program który wypełni ten formularz rejestracyjny prawie automatycznie(obraz wyświetlony w programie wpisuje user po czym zostaje wysłany POST z kliknięciem buttona create i konto zostaje założone)
Myślałem, że kiedy otworze połączenie z odpowiednia strona i wtedy pobiore obrazek to w momencie kiedy utrzymam to połączenie obrazek będzie właściwy i przejdzie poprawnie weryfikacje.
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPChrome

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez Cyfrowy Baron » środa, 19 stycznia 2011, 10:11

Problem w tym, że zawsze jak odwołujesz się do strony generującej captcha to obrazek się zmienia i nie pokrywa się już z formularzem rejestracyjnym.
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
    Windows XPFirefox

Re: Pobranie PNG z http za pomocą Wininet.h

Nowy postprzez polymorphism » środa, 19 stycznia 2011, 11:38

Myślałem, że kiedy otworze połączenie z odpowiednia strona i wtedy pobiore obrazek to w momencie kiedy utrzymam to połączenie obrazek będzie właściwy i przejdzie poprawnie weryfikacje.

Jak już pisałem, od tego, żeby formularz był powiązany z wygenerowanym obrazkiem są ciasteczka. Czyli najpierw musisz pobrać stronę, żeby dostać ciastko identyfikujące sesję (session id), następnie pobierasz obrazek. Z tego co wyczytałem na szybko, wininet obsługuje ciasteczka, więc nie musisz ręcznie nimi zarządzać.
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
    Windows XPFirefox

Następna strona

  • 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 3 gości

cron