Ik krijg met bovenstaand voorbeeld een de hele webpagina te zien ingelogd en wel, omdat ik nog ingelogd ben op een webpagina in de browser denk ik.
maar:
A) hoe kan ik rechtstreeks een pagina laden ipv via een hyperlink
B) hoe en waar kan ik de html data er uit filteren (waar word de pagina opgeslagen)
verder wel lollig om zo een eigen mini browser voor vaste pagina's te maken.
Ok dan nu het resultat:
in twebbrowser zie ik de teller op bv 3 staan en save dit naar een webpagina.html
die laad ik vervolgens in een editor en onderzoek de code, nou mooi niet de berichten er in te zien dus. is niet leuk meer zo :-)
ik moet op een of andere manier de RAW data hebben.
ik zie in de opgeslagen webpagina de volgende code staan die ik eerder nooit kreeg.
<script type="text/javascript">
function iframeMessage(event) {
if (event.origin != 'http://xh@mster.com' && event.origin != 'http://www.xh@mster.com') return;
data = event.data.split('|');
if (data[0] == 'url') window.location.href = data['1'];
}
if('addEventListener' in window) {
window.addEventListener('message', iframeMessage, false);
} else if ('attachEvent' in window) {
window.attachEvent('onmessage', iframeMessage);
};
$(document).ready(function() {
$('select#sortby').change(function(){window.locati on.href = 'http://xh@mster.com'+$(this).val();});;
});
</script>
Url beetje aangepast lol.
Last edited by Richard63; 30-Jan-14 at 21:47. Reason: code toegevoegd
ik snap de vraag niet echt maar als je wilt inloggen via de twebbrowser dan
- doe je een navigate naar de website.
- Op de webpagina die dan in je browser object staat staat ook de login form
- In de webbrowser vul je form fields die gevuld moeten worden
en
- vervolgens vertel je de webbrowser dat er op de login knop geklikt moet worden.
klaar, je bent ingelogd.
De pagina die vervolgens door de webbrowser gerenderd is daarvan kan je de html source ophalen via outerhtml
de belangrijkste delen van de code
Code:-- ga naar een url ie.Navigate(edturl.Text); --- vul een field Document := ie.Document; TableItems := Document.Body.GetElementsByTagName(Tag); tableItem.value := Value; --- click field := Document.all.item(i,'') as IHTMLElement; field.click; --- ophalen html iall := (ie.Document AS IHTMLDocument2).body; memo2.Text := iall.outerHTML;
Verdikkie, heb nu iets heel simpels gemaakt zonder indy, en die laat wel de bron zien waar het zo nodige cijfer in te zien is.
Delphi Code:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, mshtml, StdCtrls, OleCtrls, SHDocVw; type TForm1 = class(TForm) WebBrowser1: TWebBrowser; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var iall : IHTMLElement; begin if Assigned(WebBrowser1.Document) then begin iall := (WebBrowser1.Document AS IHTMLDocument2).body; while iall.parentElement <> nil do begin iall := iall.parentElement; end; memo1.Text := iall.outerHTML; end; end; procedure TForm1.FormCreate(Sender: TObject); begin webBrowser1.Navigate('http://xh@mster.com/messages-1'); end; end.
zal nu het zoek deel er aan toevoegen en het inlog deel en dan nog een geluidje af spelen als het getal groter is als nul.
ik heb alle projectjes opgeslagen voor latere bewerking en zal er zeker veel van leren (ps in bovenstaand voorbeeld zet ik tmemo en twebbrowser op non visible.
Het werkt nu omdat je dus al ingelogd was via je browser, dit omdat je met een afgeleide IE werkt in je software neemt je twebbrowser dus ook de inlog cookies al mee bij het ophalen van de pagina. En zoals ik al zei de webbrowser haalt de pagina in zijn volledigheid inclusief alle objecten op. Vervolgens wordt deze volledig gerenderd en is via outerhtml beschikbaar.
Dus blijft over het invullen van de correcte login velden en de click op de button maar de volledige voorbeeld code vindt je in de eerste link.
Misschien een domme vraag maar krijg bovenstaande code niet verwerkt tot een werkzaam programma.
ik heb het in een button3click procedure geplaatst maar moet er nog iets toegevoegd worden aan uses ??
de code was maar een klein kort voorbeeld, die kan je niet zo overnemen! De meest essentiële regels staan erin. echt uitgebreid staat het in eerste link
had het wat laat door maar heb het werkend alleen kom ik er net achter dat pos() niet meer doet wat het zou moeten doen dus dat deel ga ik opnieuw maken.
Heb nu een uitlees gemaakt maar na het om de 5 seconden triggeren van de webBrowser1.Navigate(url'');
is er steeds een toontje te horen (windows) soort thud geluidje (ligt aan welk thema je gebruikt in windows) is dit te voorkomen (zonder windows thema geluiden uit te zetten uiteraard) ?
heb een werkend programma nu, het inloggen sla ik nog even over
het is nu gelinkt aan 1malig inloggen in explorer (die daarna weer gesloten mag en gewoon chrome of zo verder gebruiken)
na het weekend ga ik weer verder (nu ff genoeg er van :-))
Bedankt tot zo ver
ps lach niet om mijn manier van timer loop, ik leer nog en dit was de enige snelle manier.
zijn nog wat eigenaardigheidjes die ik uit moet zoeken maar de functionaliteit die ik zocht is er nu.
Delphi Code:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, mshtml, StdCtrls, OleCtrls, SHDocVw, ExtCtrls, Registry, mmsystem, StrUtils; type TForm1 = class(TForm) WebBrowser1: TWebBrowser; Button1: TButton; Memo1: TMemo; Timer1: TTimer; Button2: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure LogInButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; S: TStringList; M: TStream; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin webBrowser1.Navigate('http://xh@mster.com/messages-1'); // haal om de 30 seconden de pagina op Button1.Click; Button2.Click; //Form1.WindowState := wsMinimized; end; procedure TForm1.Button1Click(Sender: TObject); var iall : IHTMLElement; begin if Assigned(WebBrowser1.Document) then begin iall := (WebBrowser1.Document AS IHTMLDocument2).body; while iall.parentElement <> nil do begin iall := iall.parentElement; end; memo1.Text := iall.outerHTML; end; end; procedure TForm1.Button2Click(Sender: TObject); var Resultaat : string; Nummer : integer; BeginPositie : integer; EndPositie : integer; kenwoord : integer; Result : boolean; begin kenwoord := Pos('messages-1',Memo1.Text); // het cijfer dat gezocht word zit op 19 tekens van hier Result := (kenwoord > 0); if Result then begin Memo1.SelStart := kenwoord-1; Memo1.SelLength := Length('messages-1'); // 10 //Memo1.SetFocus; Label1.Caption := IntToStr(kenwoord); Resultaat := copy(Memo1.Text,kenwoord+29,1); Label1.Caption := 'er zijn '+Resultaat+' berichten voor u'; if Resultaat = '<' then Label1.Caption := 'er zijn 0 berichten voor u' else if Resultaat <> '<' then // Form1.WindowState := wsNormal; Playsound(PChar('C:\Windows\Media\Windows Logon Sound.wav'),0,SND_NOWAIT); end; BeginPositie := Pos('<span>',Memo1.Text); // het cijfer dat gezocht word zit hier net voor Result := (BeginPositie > 0); if Result then begin Memo1.SelStart := BeginPositie-1; Memo1.SelLength := Length('<span>'); // 6 //Memo1.SetFocus; Label2.Caption := IntToStr(BeginPositie); Resultaat := copy(Memo1.Text,BeginPositie-1,1); // Label2.Caption := Resultaat; end; EndPositie := Pos('</span>',Memo1.Text); // het cijfer dat gezocht word zit hier net voor Result := (EndPositie > 0); if Result then begin Memo1.SelStart := EndPositie-1; Memo1.SelLength := Length('</span>'); // 7 //Memo1.SetFocus; //Label3.Caption := IntToStr(EndPositie); // 1557 Resultaat := copy(Memo1.Text,EndPositie-1,1); //Label3.Caption := Resultaat; end; nummer := EndPositie-BeginPositie-6; // min de lengte van het woord <span> = 6 Label3.Caption := IntToStr(nummer); // als nummer > 0 end; procedure TForm1.Timer1Timer(Sender: TObject); begin webBrowser1.Navigate('http://xh@mster.com/messages-1'); // haal om de 30 seconden de pagina op Button1.Click; Button2.Click; end; // HKEY_CURRENT_USER\AppEvents\Schemes\Apps\Explorer\Navigating\.current procedure TForm1.LogInButtonClick(Sender: TObject); begin webBrowser1.Navigate('http://xhamster.com/cross.php?name=naam en wachtwoord'); // werkt dus niet op deze manier nog end; end.
Ik lach niet, goed dat je hier al bent aangekomen.
Wel de volgende opmerking : Een navigate kan tijd kosten aangezien het ophalen afhankelijk is van de website etc, maar de navigate komt al eerder terug (async call). Daardoor weet je nooit zeker of de pagina die je staat te parsen al in zijn geheel is aangekomen. Een test op readystate en busy is noodzakelijk voordat je gaat parsen.
Toch nog 1 opmerking : Is een refresh niet voldoende om een nieuwe status van de berichten binnen te krijgen?
Een website die nog kan helpen met meer info over de refresh: http://www.cryer.co.uk/brian/delphi/...er_methods.htm
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks