Jak odczytać kod HTML strony otwartej w Firefox'ie?

Jak odczytać kod HTML strony otwartej w Firefox'ie?
arturfir
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 9 lat
0

Witam,
tak jak w temacie.... Mam program w Delphi ktorym potrzebuje odczytac zawartosc (kod HTML) strony otwartej w Firefox'ie.
Zaznacze ze opcja z pobraniem adresu strony i wczytaniu w TWebBrowser nie wchodzi w gre.. Musze bezposrednio odczytac z Uchwytu do okna Firefox...
Ale jak?
Jakis pomysl?

Pozdrawiam

AN
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 11 godzin
2

Myślę, że można napisać wtyczkę do Firefoxa, która w jakiś sposób będzie się komunikować z Twoim programem i to ta wtyczka będzie podawać kod strony.

Próby odczytu bezpośrednio z programu Firefox mogą się skończyć tym, że wyjdzie nowsza wersja Firefoxa i Twój program przestanie działać.

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Gorlice
0

Bez przesady to chyba można zrobić za pomocą Microsoft UI Automation ale osobiście w Delphi się tym nie bawiłem. Może w Google jak dobrze poszukasz znajdziesz coś więcej na ten temat (dotyczącego Delphi bo C# jest aż za dużo).


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Łódź
  • Postów:648
1

A nie lepiej żeby program sam sobie pobierał kod html strony bez pośrednictwa firefoxa?

arturfir
Nie... program ma byc rodzajem rozszerzenia do przegladarki internetowej. Uzytkownik musi pracowac pod Firefoxem. Tam jest uruchamiana aplikacja internetowa a program ma dodatkowo analizowac wyswietlane dane.
arturfir
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 9 lat
0

Nie... program ma byc rodzajem rozszerzenia do przegladarki internetowej. Uzytkownik musi pracowac pod Firefoxem. Tam jest uruchamiana aplikacja internetowa a program ma dodatkowo analizowac wyswietlane dane.
Czy ktos ma doswaidczenie z UI Automation pod Delphi?

LukeJL
no to nie możesz zajrzeć w API Firefoxa - https://developer.mozilla.org/en-US/Add-ons/SDK ?
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
  • Postów:1595
3

Jeżeli w Firefoxie miałbyś otwarte okno, w którym widoczny będzie kod strony (któraś z opcji programistycznych) to możesz spróbować dobrać się do tego konkretnego okna. Ja coś podobnego ostatnio potrzebowałem i zrobiłem to tak:

Kopiuj
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, TlHelp32, ExtCtrls
Kopiuj
function GetProcesID(exeName:String): Cardinal;
var
  Uchwyt:tHandle;
  Proces:tProcessEntry32;
begin
  Result := 0;
  Uchwyt:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
  Proces.dwSize:=SizeOf(Proces);
  if Integer(Process32First(Uchwyt,Proces))<>0 then
  repeat
    if (LowerCase(Proces.szExeFile) = LowerCase(exeName)) then
    begin
      Result := Proces.th32ProcessID;
      Break;
    end;
  until Integer(Process32Next(Uchwyt,Proces))=0;
  closehandle(Uchwyt);
end;

function GetHWndByPID(const hPID: THandle): THandle;
    type
    PEnumInfo = ^TEnumInfo;
    TEnumInfo = record
    ProcessID: DWORD;
    HWND: THandle;
  end;
    function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
    var
        PID: DWORD;
    begin
        GetWindowThreadProcessID(Wnd, @PID);
        Result := (PID <> EI.ProcessID) or
                (not IsWindowVisible(WND)) or
                (not IsWindowEnabled(WND));

        if not Result then EI.HWND := WND; //break on return FALSE
    end;
    function FindMainWindow(PID: DWORD): DWORD;
    var
        EI: TEnumInfo;
    begin
        EI.ProcessID := PID;
        EI.HWND := 0;
        EnumWindows(@EnumWindowsProc, Integer(@EI));
        Result := EI.HWND;
    end;
begin
    if hPID<>0 then
        Result:=FindMainWindow(hPID)
    else
        Result:=0;
end;

function EnumChildren(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
  TextBoxClass = 'Favorite directories (F2)';
var
  ClassName: array[0..259] of Char;
begin
  Result := True;
  GetClassName(hwnd, ClassName, Length(ClassName));
  Windows.GetWindowText(hwnd,classname,length(ClassName));
  if ClassName = TextBoxClass then
    TStrings(lParam).Add('Hurra');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  h: THandle;
begin
  h := GetHWndByPID(GetProcesID('DicomWorks.exe'));
  Memo1.Lines.Clear;
  EnumChildWindows(h, @EnumChildren, UINT_PTR(Memo1.Lines)); //tutaj odpalamy funkcję przeszukującą wszystkie childy parenta czyli w twoim wypadku Firefox.exe
  if Memo1.Lines[0] = 'Hurra' then //z tym memo to demo jest więc zastosuj sobie lepsze rozwiązanie
  begin
    //tutaj twój kod
  end;
end;
edytowany 1x, ostatnio: woolfik
arturfir
Dzieki serdeczne... przeanalizuje kod i sprobuje dopasowac pod moje potrzeby i dam znac.... :)
arturfir
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 9 lat
0

Dzieki jeczez raz... ale do tego momentu juz doszedlem... mam uchwyt do okna... ale jak odczytac zawartosc HTML w tym oknie?

woolfik
No przecież ci napisałem w funkcji EnumChildren jest sprawdzenie konkretnej nazwy w oknie Windows.GetWindowText(hwnd,classname,length(ClassName)); Jeżeli to jest uchwyt okna ze źródłem (tak jak pisałem wcześniej) to do classname zwróci Ci się cały kod HTML. Gorzej jak nie masz widocznego okna z kodem w tedy trzeb pokombinować
arturfir
ClassName zwraca u mnie nazwe klasy (mozillawindowclass) a nie zawartosc (HTML)... moze trzeba pokombinowac ;) Probuje dalej.
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
  • Postów:1595
0

Nie wiem czy się dobrze rozumiemy. To:

Kopiuj
h := GetHWndByPID(GetProcesID('Firefox.exe'));

Zwraca uchwyt okna głównego

Kopiuj
EnumChildWindows(h, @EnumChildren, UINT_PTR(Memo1.Lines));

odpala funkcję

Kopiuj
function EnumChildren(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;

jest to wywołanie z Windows API i powoduje, że dla danego HWND wyszukiwane są wszystkie childy czyli labele edity itd w procesie firefox.exe
Ta konstrukcja:

Kopiuj
GetClassName(hwnd, ClassName, Length(ClassName));
Windows.GetWindowText(hwnd,classname,length(ClassName));
if pos('<html',lowercase(ClassName)) > 0 then
//twoj kod

powoduje, że sprawdzane są wszystkie childy procesu firefox.exe i jeśli który będzie posiadał <html to masz sukces i możesz dalej sobie z tym coś robić ;)

edytowany 1x, ostatnio: woolfik
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Witam,
Mam ten sam problem co autor wątku.
Mam uchwyt okna firefox'a lecz potrzebuję adres strony.
Niestety GetClassName, GetWindowText i EnumChildren dają mi tylko tytuł okna.
Jeśli zapiszę stronę na dysku, to potrzebne mi dane dane są zapisane jako tekst (pewne współczynniki i adresy obrazów). Potrzebuję wygrzebywać te dane w tle przechodząc poprzez kolejne strony. Tytuł strony zawsze jest ten sam więc za pomocą FindWindow uzyskuję uchwyt okna. Potrzebuję odczytać adres strony lub jeśli to możliwe bezpośrednio jej zawartość.
Czy ktoś z Was robił coś podobnego lub umie to zrobić? Proszę o pomoc.
Pozdrawiam.

robertz68
  • Rejestracja:około 18 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Zielona Góra
0

Nie jestem pewien ale czy dobranie się do przeglądarki jest na pewno możliwe z programu zewnętrznego? Chyba właśnie na tym polega działanie piaskownicy żeby właśnie nie można było wpływać za bardzo na przeglądarkę internetową? Wg mnie odczytacie nazwę karty i to wszystko.

Mogę się jednak mylić i na pewno nie obrażę się na sprostowanie mojej wypowiedzi.

Według mnie jedyne rozwiązanie to rozszerzenie do Firefoxa które będzie przekazywać kod html jak zasugerował @andrzejlisek

Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
0
arturfir napisał(a):

Nie... program ma byc rodzajem rozszerzenia do przegladarki internetowej. Uzytkownik musi pracowac pod Firefoxem. Tam jest uruchamiana aplikacja internetowa a program ma dodatkowo analizowac wyswietlane dane.

A co to rozszerzenie ma robić?


edytowany 1x, ostatnio: Freja Draco
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Jak już pisałem podane tutaj przykłady nie działają. EnumChildren nic nie podaje, GetWindowText zwraca jedynie tytuł okna, GetClassName podaje mi klasę przeglądarki. Szukałem w WinAPI, ale bez skutku.

Próbowałem komunikacji przez TDDEClientConv. Spotkałem się z dziwnym działaniem:

  1. gdy nie ma otwartego okna przeglądarki nie wywołuje mi błędu/wyjątku
  2. jeśli jest otwarta przeglądarka, lecz tytuł strony inny niż żądany, j.w.
  3. jeśli znajdzie okno z żądanym tytułem strony, to niezależnie jaki podam RequestData, zwaca mi pusty ciąg, a w tle uruchamia kolejny mój program

Czy system nie ma dostępu do zawartości otwartych stron? Myślę że jeśli system ma dostęp do tych danych to przez WinAPI też powinno się dać. Zgadza się czy się mylę?

edytowany 1x, ostatnio: flowCRANE
Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
0

Nie znam się na meritum problemu i nie wiem, czy to ci coś pomoże, ale może pobaw się Inspektorem DOM do FF:
https://en.wikipedia.org/wiki/DOM_Inspector
https://developer.mozilla.org/pl/docs/Inspektor_DOM

Można w nim zobaczyć drzewo obiektów, tak samej przeglądarki jak i strony internetowej, która stanowi tu jedną z podgałęzi całości. I jak już zobaczysz, co w czym siedzi i jakie ma identyfikatory, to może wystarczy zbudować odpowiednie odwołanie do właściwego elementu?


edytowany 1x, ostatnio: Freja Draco
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Z TDDEClientConv znalazłem błąd, pomieszane uchwyty okien.
Niestety używając TDDEClientConv też nie uzyskałem danych z FireFox.
Próbowałem też GetActiveOLEObject, ale stale mam błąd "Nieprawidłowy ciąg klasy" pomimo że pobierałem przez GetClassName.

Próbowałem z Chrome, te same wyniki. WWW_GetWindowInfo zwraca puste ciągi.

edytowany 1x, ostatnio: Klakierus
bronex
  • Rejestracja:ponad 21 lat
  • Ostatnio:około rok
  • Lokalizacja:Kraków
0

Powiem tak, kiedys tez probowalem ten efekt osiagnac i chyba sie poddalem! Po prostu dalem sobie spokoj, nie udalo mi sie osiagnac tego celu

Gdzies na 4programmers jest aplikacja o nazwie Handler. Wlasciwie nawiazuje troche do w.w odpowiedzi, ale moznaby sie sprobowac nia pobawic.

Jeszcze mi przychodzi do glowy(spsob poboczny) wsylac do firefox.exe klawisze(za pomoca np Handler.exe) skrot klawiszowy Ctrl+S i zapisac strone np jako c:\test.html.

Tyle moge doradzic, gotowca nie udostepniam, ale mam nadzieje iz jakos pomoglem


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)