CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - TWebBrowser - blokowanie wczytywania obrazków

TWebBrowser - blokowanie wczytywania obrazków

problemy z funkcjonowaniem bibliotek, komponentów itp.

TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez Mironas » poniedziałek, 8 czerwca 2020, 18:46

Klient pocztowy. Do wyświetlania maili HTML korzysta z TWebBrowser. Kod HTML wczytywany do TWebBrowser dynamicznie.
Chciałbym dodać opcję blokowania wczytywania zewnętrznych obrazków.

Napisałem funkcję, która za pomocą IHTMLDocument2 przeszukuje cały dokument i dla elementów IMG ustawia pusty atrybut SRC.
Funkcja działa, ale mogę ją wykonać dopiera po wczytaniu HTML do TWebBrowser, a wtedy obrazki już są wczytywane a dopiero potem znikają - bez sensu.
Szukałem zdarzenia TWebBrowser które byłoby wywoływane jak już dokument jest wczytany ale obrazki jeszcze nie wczytane, niestety nie znalazłem.

Czy można jakoś zbudować obiekt IHTMLDocument2 na podstawie kodu HTML (w TStrings) z pominięciem TWebBrowser-a, tak aby zmienić wymagane atrybuty, i dopiero wtedy wczytać do Browser-a? A może jakiś inny pomysł na zablokowanie zewnętrznych grafik?

PS
Oczywiście można by parsować kod HTML i pokasować wszystkie argumenty SRC w elementach IMG, ale to wydaje mi się niewłaściwym podejściem. Wolałbym wykorzystać IHTMLDocument2.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 465
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 65
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez polymorphism » poniedziałek, 8 czerwca 2020, 19:46

(...) ale to wydaje mi się niewłaściwym podejściem.

Może i niewłaściwe, ale może być najprostsze ;) Użyj wyrażeń regularnych...

Przyszła mi jeszcze jedna opcja: "wstrzyknij" skrypta JS do kodu strony, który pousuwa wszystkie obrazki.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2262
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez Mironas » środa, 10 czerwca 2020, 09:30

polymorphism napisał(a):Przyszła mi jeszcze jedna opcja: "wstrzyknij" skrypta JS do kodu strony, który pousuwa wszystkie obrazki.

Akurat na tym się nie znam, ale w tym konkretnym przypadku "plan B" czyli kasowanie linków z treści HTML przed załadowaniem do TWebBrowser-a, jest wystarczające.

polymorphism napisał(a):Może i niewłaściwe, ale może być najprostsze ;) Użyj wyrażeń regularnych...

Tak, oczywiście jest to skuteczne i proste rozwiązanie, ale...
W tym konkretnym przypadku (program mailowy) się sprawdzi. Jednak co w przypadku np Scraper-a do pobierania danych ze stron HTML. Tutaj analiza kodu HTML się nie sprawdzi. Lepiej byłoby wykorzystać IHTMLDocument2 bo umożliwia nie tylko proste odszukanie każdego elementu, ale też np kliknięcie w niego (np aby otworzyć podstronę). Jednak nie ma potrzeby aby tę treść HTML wyświetlać na ekranie. Dlatego nadal zastanawiam się, czy można wykorzystać ten interfejs ale z pominięciem TWebBrowser/TCppWebBrowser, np wczytując HTML do innego komponentu który umożliwi korzystanie z IHTMLDocument2 albo utworzenie IHTMLDocument2 niepowiązanego z żadnym komponentem ale na podstawie kodu HTML.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 465
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 65
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez polymorphism » środa, 10 czerwca 2020, 10:58

Jednak co w przypadku np Scraper-a do pobierania danych ze stron HTML.

Do takich zabaw to chyba używa się przeglądarek działających w trybie headless. Nie wiem, jak wygląda sprawa z IE, ale Chromium ma jakieś API do tego.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2262
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez Mironas » środa, 10 czerwca 2020, 11:26

polymorphism napisał(a):Chromium ma jakieś API do tego.

No właśnie, ciągle przymierzam się do zabrania się za Chromium. W internetach widziałem, że można zbudować komponent VCL/FMX dla Delphi, więc pewnie dla C++Buildera też.
Tylko czasu ciągle na to nie mam a i potrzeba niepilna, bo TWebBrowser zwykle wystarcza.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 465
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 65
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez polymorphism » środa, 10 czerwca 2020, 11:33

W internetach widziałem, że można zbudować komponent VCL/FMX dla Delphi

Co Wy, Builderowcy, macie z tymi komponentami? :) Zwykła biblioteka nie wystarczy?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2262
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez Mironas » środa, 10 czerwca 2020, 12:38

polymorphism napisał(a):Zwykła biblioteka nie wystarczy?

Jak pisałem, jeszcze nie testowałem Chromium. Jeśli można go użyć za pomocą jakiejś biblioteki, to dlaczego by nie. Nawet bym wolał, bo po przeinstalowaniu środowiska nie musiałbym na nowo tworzyć i instalować komponentów aby otworzyć stary projekt.

Ma może ktoś DLL + gotowy LIB dla Chromium?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 465
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 65
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez polymorphism » środa, 10 czerwca 2020, 14:57

Gotowej DLL-ki to nie oczekuj, bo z tego, co widzę, API jest generowane na podstawie pliku JSON do kodu C++, więc taka biblioteka byłaby mało przenośna.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2262
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez Mironas » środa, 10 czerwca 2020, 15:26

A może ktoś już korzystał z Chromium pod Builderem (lub w innym środowisku) i może podpowiedzieć co trzeba pobrać i jak z tym gadać?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 465
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 65
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez lukagrom » środa, 10 czerwca 2020, 17:10

Ja się na tym kompletnie nie znam, ale przyszedł mi do głowy zamysł, że można nie wczytywać pliku - wiadomości.html tylko napisać funkcję, która wykreuje nowy plik, na ktory bedzie sie skladac tekst z pierwotnej wiadomosci.html, pozbawiony o wszystkie znaczniki IMG, które znajdowaly się w pierwotnej wiadomosci html i dopiero wtedy taki wypatroszony wczytać. Zaznaczam, że się na tym nie znam, tylko tak sobie gdybam, posiłkując się najprostrzym rozwiązaniem:
( i tu też nie wiem czy taka idea jest prawidłowo zrealizowana, bo bliższe mi są funkcje z C, niż string/fstream).
KOD cpp:     UKRYJ  
bool is_Phrase(string text,string phrase)
{
        size_t find_Pos=text.find(phrase);
        if(find_Pos==std::string::npos)
         return false;
        else
         return true;
}
void remove_IMG(string before_html, string new_html)
{
        string my_Phrase="IMG";
        fstream file_open( before_html.c_str(), std::ios::in );
        fstream file_write(new_html.c_str(),std::ios::out);
        string temp_String;
          while( !file_open.eof() )
        {
            getline( file_open, temp_String);
            if(!is_Phrase(temp_String,my_Phrase))
            {
                                file_write <<temp_String;
                file_write.flush();
                        }
        }
      file_open.close();
      file_write.close();  
       
       
       
}

 
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 119
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 8
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    LinuxChrome

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez Mironas » środa, 10 czerwca 2020, 17:44

lukagrom napisał(a):można nie wczytywać pliku - wiadomości.html tylko napisać funkcję, która wykreuje nowy plik, na ktory bedzie sie skladac tekst z pierwotnej wiadomosci.html, pozbawiony o wszystkie znaczniki IMG

Po pierwsze nie ma sensu zapisywać plik na dysku, tylko po to aby wczytać go do TWebBrowser-a, bo można tam treść HTML wczytać bezpośrednio z TStrings.
Po drugie, do wyczesania linków do obrazów, lepiej jest (zgodnie z poradą jaką dał polymorphism) użyć wyrażeń regularnych, bo odpowiednio zastosowane wytną wyłącznie zawartość atrybutów SCR z elementów IMG pozostawiając sam element IMG i wszystkie inne atrybuty (width, height, alt, ...), a to dość istotne przy wyświetlaniu treści maila. Kasowanie samych fragmentów 'IMG' może spowodować błędne wyświetlanie zawartości maila.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 465
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 65
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez polymorphism » środa, 10 czerwca 2020, 19:25

( i tu też nie wiem czy taka idea jest prawidłowo zrealizowana, bo bliższe mi są funkcje z C, niż string/fstream).

Kilka uwag:
  • w is_Phrase parametry przekazujesz przez wartość, powinieneś przez const &.
  • To:
    KOD cpp:     UKRYJ  
          if(find_Pos==std::string::npos)
             return false;
            else
             return true;

    można zredukować do:
    KOD cpp:     UKRYJ  
    return find_Pos != std::string::npos;

  • KOD cpp:     UKRYJ  
    while( !file_open.eof() )
    {
        getline( file_open, temp_String);
        ...

    Taka pętla zawsze przeczyta jedną pustą linię na końcu. Lepiej tak:
    KOD cpp:     UKRYJ  
    while(getline( file_open, temp_String)) {
        ...

  • koncepcyjnie to jest dość naiwny algorytm, bo zakładasz, że tagi HTML są po jednym w linii.

Ale plus za próbę pisania w C++, a nie w C z klasami ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2262
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez polymorphism » środa, 10 czerwca 2020, 19:29

@Mironas, tu masz jakiś punkt zaczepienia -> link.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2262
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez Mironas » czwartek, 11 czerwca 2020, 07:25

polymorphism napisał(a):@Mironas, tu masz jakiś punkt zaczepienia -> link.

Dzięki, ale moje pytanie dotyczyło jak w ogóle zacząć zabawę z Chromium (co pobrać, jak obsługiwać), czyli np jak zrobić minimalną przeglądarkę opartą na Chrome.
Na tryb Headless przyjdzie czas ewentualnie później, jak okaże się że praca z Chromium jest przynajmniej tak wygodna jak z TWebBrowser.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 465
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 65
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TWebBrowser - blokowanie wczytywania obrazków

Nowy postprzez lukagrom » czwartek, 11 czerwca 2020, 10:31

To może to będzie przydatne - https://github.com/lmsp/SimpleCEFDLL
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 119
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 8
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przegląda forum

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

cron