przeglądarka internetowa na poziomie pakietów

0

Zamieszczałem już podobny topic na forum dotyczącym c++, ale znalazłem komponent do Delphi, który niestety nie działa tak, jak powinien. Potrzebuję przeglądarki internetowej, która nie wyświetla otwieranych stron (wyświetlać sobie będę tylko pakiety z pomocą sniffera). Ściągnąłem komponent EmbeddedWb ze strony
http://www.euromind.com/iedelphi/embeddedwb.htm,
ustawiłem parametr DLCTL_DOWNLOADONLY, którego działanie jest opisane w MSDN, ale niestety to nie działa. Czy ktoś ma jakiś pomysł co z tym zrobić?? Z góry dziękuję za pomoc.

0

Może użyj TIdHttp z indy?

0

No... musiałbym napisać parser HTTP, HTML... żeby wszystko robił tak, jak IE. WebBrowser robi to wszystko sam i na pewno bezbłędnie, a ja błędy mógłbym popełnić, nie mówiąc już o tym, jak dużo roboty by z tym wszystkim było. Może i jestem leniwy, ale po prostu nie jestem w stanie czegoś takiego napisać, przekracza to moje możliwości.

0

Po co ci parser HTML jak nie chcesz wyswietlac stron :-8 . Jak chcesz sciagnac strone recznie i wyswietic ja w browserze to byle co do obslugi http i potem wysylasz kod do browsera webbrowser.oleobject.document.write(string);

0

A co, jeśli strona ma na przykład ramki albo odświeża się po iluś tam sekundach? Jeśli znajduje ramkę, to ma ją otworzyć itd. Takich rzeczy w HTML jest więcej i chcę, żeby były obsługiwane przez ten komponent. Bo to przecież jest zadanie przeglądarki internetowej.

0

Zrob tak jak Wolve pisze. Wrzuc TWebBrowser, jakis http, pobierz nim strony do memo a pozniej uzyj

WebBrowser.Navigate('about:' + memo1.Lines.Text);
i nie martw się, wszystko zostanie wykonane, bedzie odswiezane, beda ramki, pomysl czlowieku...

Snowak [cygaro]

0

Fakt, umieściłem powyższą odpowiedź zanim wytestowałem rozwiązanie, które sugerował Wolverine. Jednak teraz, kiedy je wypróbowałem okazuje się, że nie działa... najpierw wyskakiwał mi błąd dostępu do obiektu oleobject, ale umieściłem kod
webbrowser.oleobject.document.write(kod_html);
w zdarzeniu OnDocumentComplete i po wciśnięciu jakiegoś tam przycisku wywołałem
webbrowser.navigate('about:blank');.
Niestety bez skutku, sniffer nie pokazuje żadnego pakietu. Kiedy wykonuję kod
webbrowser.navigate('about:'+kod_html);,
otwiera się strona informująca o tym, że strona której żądam nie istnieje (czyli standartowy błąd 'brak strony do wyświetlenia') i sniffer również niczego nie pokazuje. Dziękuję bardzo za pomoc, podejrzewam że powyższe rozwiązania są dobre, tylko ja pewnie robię coś źle. Chyba jedyny błąd, jaki mogłem popełnić to zły kod html. Próbowałem jednak zarówno z nagłówkiem http jak i bez niego, więc naprawdę nie wiem co może nie działać. Mogę prosić o pomoc?

0

Snifer służy do przeglądania pakietów w sieci a nie w twoim programie.
Zgadzasz się z tym chyba?

0

Może znowu się mylę, ale nie do końca się z tym zgadzam, bo mój program korzysta z sieci. W końcu przegląda strony. Jeśli napiszę program z WebBrowserem przeglądającym strony to sniffer pokazuje wysyłane i odbierane pakiety. Program, który chcę napisać ma robić dokładnie to samo, tylko że WebBrowser lub inny komponent nie ma wyświetlać stron. Jeśli sniffer nie pokazuje żadnych pakietów, to znaczy że program nie otwiera strony (nie wysyła do sieci pakietu z zapytaniem o stronę). Prawda?

0

A może tak:

Ukryj WebBrowsera a następnie normalnie otwórz nim stronę z sieci.
Gdy webbrowser będzie działał OK to i snifer coś wykaże!!

0

Weź sobie po prostu wrzuć webbrowsera na formę, daj mu visible na false. Korzystasz z niego normalnie, a w ondocumentcomplete lecisz po wszystkich ramkach i wyciągasz z nich kod (poszukaj na stronach msdn właściwości kontrolki webbrowser).

0

No tak, macie rację, jednak wydaje mi się (znowu piszę, zanim wypróbuję), że webbrowser z Visible ustawionym na false nadal obciąża procesor wyświetlaniem strony. Wbrew pozorom wysyłanie i odbieranie pakietów działa na wolniejszych kompach naprawdę dużo, dużo szybciej i to właśnie chcę osiągnąć. Przy tym dużą przejrzystość i brak często zbędnych, graficznych fajerwerków. Z wyciąganiem kodu z ramek to akurat żaden problem. MSDN przestudiowałem uważnie i tam znalazłem między innymi uwagę o parametrze DLCTL_DOWNLOADONLY, który niestety nie działa.

Dopisane: Jest to dla mnie bardzo dziwne, ale ustawienie parametru Visible na false niczego nie zmienia... webbrowser nadal jest widoczny.

0

Tak w sumie napisanie parsera, ktory wyciagnal by adresy obrazkow, ramek, cssow i skryptow nie bylo by takie skomplikowane. Tagow do includowania jakis plikow w htmlu nie jest AZ tak suzo

0

Taki parser musiałby być połączony z jakimś socketem, więc musiałbym również sklepać nagłówki HTTP tak, jak to robi IE... a szczerze mówiąc nie wiem jak on to robi... są takie linie jak Accept:, które są dla mnie absolutnie niezrozumiałe.

0

Użyj TIdHttp.

// Dopisane
Część nagłówków jest wypełniana automatycznie (jak content-length), a część można (choć nie trzeba) wypełnić samemu. Można bez problemów korzystać z tego komponentu na domyślnych ustawieniach nagłówków.

0

Heh, zatoczyliśmy koło. :-) Czy IdHttp automatycznie uzupełnia nagłówki tak, jak to robi IE??

Dopisane: Wolałbym co prawda, żeby komponent zachowywał się dokładnie jak IE, żeby uniknąć niepotrzebnych błędów, które ja na pewno popełnię pisząc przeglądarkę od podstaw, ale jeśli inaczej się nie da...

Dopisane 2: Udało mi się ukryć WebBrowsera, ale tak jak pisałem nie zmienia to szybkości ładowania się stron.

0

Moze bys dal kod tego co masz? To by moglo troche rozwiazac.

Snowak [cygaro]

0

Najpierw zastanawiam się nad rozwiązaniem problemu, a dopiero potem piszę. Taką mam zasadę, zgodnie z którą nie mam jeszcze nic, tylko kilka testów podawanych przez was rozwiązań. Poczekam jeszcze jakiś czas, może ktoś coś wymyśli. Jeśli jednak nie, to napiszę coś opartego na ClientSockecie, narobię mnóstwo błędów i zanim wezmę się do użytkowania, przez długi czas będę je usuwał. :-)

Dopisane: Jeśli chcesz jakiś konkretny kod, to napisz jaki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1