[Gelöst] Navigation auf einer Webseite durch Sourcecode

Alle Fragen zur Netzwerkkommunikation
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

[Gelöst] Navigation auf einer Webseite durch Sourcecode

Beitrag von corpsman »

Servus alle mit einander,

ich möchte ein Programm schreiben, welches für mich in einem Onlineportal (http://www.Geocaching.com) eingaben tätigt (loggt). Ich habe dort einen Account und bin berechtigt diese Eingaben zu tätigen. Auf Anfrage bei diversen Entwicklern für dieses Portal ergab sich letztendes folgende Antwort: das Programm loggt sich
per Request ein, macht einen Request auf die Log-Webseite, sendet alle notwendigen Formulardaten, wertet den Response aus etc.


Nun kann ich mittels HttpGetText von Synapse schon gewisse Inhalte laden / auswerten, doch eigentlich habe ich keine Ahnung was ich da mache. Ist hier jemand der mir Erklären kann: wie so was geht / was ich dafür brauche / wo ich Antworten auf diese Fragen nach lesen kann ?

Also Browser steht mir nur der Chromium zur Verfügung, dort ist mein User sogar schon eingeloggt, falls man nen Browser für so was braucht. Lieber wäre mir aber allerdings eine Version in der man das komplett ohne Browser machen kann, den mein System ist recht langsam und kann nicht so gut mit Browsern ..

Und falls jemand die HP kennt, deren Live API stellt leider keine Option dar.
Zuletzt geändert von corpsman am Mi 11. Okt 2017, 18:46, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von m.fuchs »

So einfach zu beantworten ist das nicht, probieren wir das mal an einem konkreten Beispiel.

https://www.geocaching.com/account/login

Ich habe hier mal den relevanten Teil des Login-Forms

Code: Alles auswählen

<form action="/account/login" method="post">
  <input name="__RequestVerificationToken" type="hidden" value="oSsBAg_FE0uIabtKyZQFfzoeBOzrJz0tg_gSD4iauS9L41llgRR3dhcgwmyVn9rVG9jqnzStErz8vKSS2_o2p6F3dsw1" />
  <input id="Username" name="Username"  type="text" value="" />
  <input id="Password" name="Password" placeholder="Password" type="password" value="" />
  <input class="btn btn-primary" type="submit" value="Log In" id="Login"/>
</form>


Jetzt werden wir mal Daten absenden und das ganze mit Firebug mitschneiden:

Aufgerufene URL: https://www.geocaching.com/account/logi ... y%2Fsearch
Data: __RequestVerificationToken=8MlefKQjmXl1UCP3_nRiMJLPKp-vKP3fWhpMz--ERwl-rOdz_BuZJB8VzV6iA3D-IKPCVK9BclsOub3SSj0iPj4T_nY1&Username=orneryboy&Password=sehrsehrgeheim123


Genau so etwas müsstest du dann als POST-Request senden. Die Parameter Username und Password sind sicherlich klar, den __RequestVerificationToken bekommst du aus dem Quellcode des Login-Formulars. Das heißt dann:

  1. https://www.geocaching.com/account/login per GET abrufen.
  2. Den Inhalt parsen und das value von __RequestVerificationToken auslesen.
  3. Den neuen Request zusammenbauen und absenden.
  4. Aus der Antwort alle relevanten Cookies auslesen, die für zukünftige Requests benötigt werden damit dein Programm als eingeloggt gewertet wird.
  5. Die Arschgeigen von Groundspeak verfluchen, weil sie ihre API abgeschaltet haben und man so einen umständlichen Scheiß machen muss.

So weit erstmal die Grundlage, das können wir hier aber gerne auch noch detaillierter durchgehen. Was ist denn das Ziel deine Anwendung?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von corpsman »

Mein Problem ist, dass wenn ich Cachen war, ich danach alle Dosen Online loggen muss.

In der Regel sind das 5-20 Pro CacheTag ( das Maximum war bisher 101 Dosen an einem Tag)

Aktuuell muss ich dazu folgendes machen

- Mein Programm starten
- Logs vom GPS hohlen (macht mein Programm schon)
- Logs bearbeiten (geht elegant für alle Logs gleichzeitig in meinem Programm)
- Logs hochladen (dazu startet mein Programm den Browser mit vor ausgewählter URL und ich muss dort nur noch im Opendialog die vor verarbeitete Datei auswählen und Hochladen)
n-Mal
{
Logeintrag öffnen
alle TBs die Besuchen sollen auswählen
Log bestätigen
zurück zur logeintrag Übersicht
}
Fertig.

Wenn ich das ganze "automatisch" hin bekäme, dann könnte ich den n-Mal Teil und das Hochladen sparen, das ist bei ner großen Runde schon gut und gern mal 20-30 Minuten. zudem ist die Arbeit Monoton Fehleranfällig und langweilig (also ideal das es ein Programm für mich macht *g*) so hätte ich den Aufwand nur ein mal (bzw so oft wie die halt ihre HP umstellen, war bisher erst 2 mal in 10 Jahren) und würde danach zeit sparen *g*.

So viel zu meiner Motivation, ganz zu schweigen davon dass ich mal ein bischen was über Web Programmierung lernen würde ;).
--
Just try it

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von Timm Thaler »

cgeo auf dem Smartphone. Damit kannst Du direkt vor Ort loggen und Caches verwalten.

Als Cacheowner würde mich ein automatischer Log, in dem immer das Gleiche steht nicht gerade erfreuen. Ein kleiner persönlicher Text darfs schon sein. Dafür wiederum ist cgeo ideal, wenn man direkt vor Ort loggt, hat man noch die "frischesten" Eindrücke. Man kann bei cgeo auch Logs speichern und später absetzen, falls man gerade kein Netz hat.

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von BeniBela »

Für so Webseiten habe ich die Internet Tools gebaut.

Da gibt man die Felder an, die in das Formular ausgefüllt werden sollen, und der Rest (Cookies, RequestVerificationToken, ...) wird automatisch von der Webseite übernommen.

Code: Alles auswählen

 
    uses xquery,xquery_json,synapseinternetaccess;
 
    xqvalue('https://www.geocaching.com/account/login').retrieve()
    .map('form(//form, {"Username": "...", "Password": "..."})').retrieve()
    .toString
 

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von corpsman »

Also ich schreibe schon individuelle Logs so ist das nicht. cgeo fällt flach, da ich kein Smartphone besitze. Ich schreibe die Logs gerade deswegen @home damit ich mir beim schreiben in ruhe was ausdenken kann, auf ner Runde gehts auf zur nächsten Dose *g*

@Benibela
Danke für den hinweis das sehe ich mir mal an.
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von corpsman »

@Benibela


Sodale, hat ein wenig gedauert deinen Vorschlag aus zu probieren, musste erst raus kriegen, wie man den Proxy einstellt.

Wenn ich dein Beispiel nun Ausführe

Code: Alles auswählen

 
  memo1.text := xqvalue('https://www.geocaching.com/account/login').retrieve()
    .map('form(//form, {"Username": "...", "Password": "..."})').retrieve()
    .toString;


erhalte ich folgende Fehlermeldung :
pxp:RETRIEVE: Internet Error: -4 when talking to: https://www.geocaching.com/account/login

Evtl liegt das auch an der Proxy geschichte, werde es heute abend auch noch mal aus einem Proxyfreien netz versuchen.

Kann man irgendwo nachlesen wie man den Übergabeparameter für Map zusammengebaut ?

[Edit]
OK, es muss wohl am Proxy liegen, oder an der SSL Lib von Windows, unter Linux geht es, zumindest ist mein Memo rand voll mit Text, der aussieht wie der Seitenwuelltext nach dem Einloggen *g*, wie gehts nu weiter ..
--
Just try it

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von BeniBela »

corpsman hat geschrieben:
pxp:RETRIEVE: Internet Error: -4 when talking to: https://www.geocaching.com/account/login


Das ist mir jetzt auch erstmal rätselhaft. -4 kann wohl nur kommen, wenn der HTTP-Statuscode erfolgreich gelesen wurde, aber ungültig ist.

Letztendlich rufen meine Tools die wininet-Funktionen der Windows-API auf (siehe w32internetaccess.pas). Da wird die Anfrage an den Webserver geschickt, und HttpQueryInfoA(.. HTTP_QUERY_STATUS_CODE .. ) aufgerufen, um den Statuscode als String zu lesen. Wenn das fehlschlägt, bricht es ab (und gibt Fehler -1).
Wenn es nicht fehlschlägt, wird der Statuscode in int umgewandelt, mittels StrToIntDef(res, -4)

Da kommt wohl die -4 her...


corpsman hat geschrieben:OK, es muss wohl am Proxy liegen, oder an der SSL Lib von Windows,


Ich hätte gedacht, das würde Fehler -1 bis -3 ergeben

Die SSL Lib hat den Nachteil in Windows verdrahtet zu sein. Wenn es ein altes Windows ist ( älter als Windows 7 oder so) und die Webseite neues SSL will (TLS 1.1 oder TLS 1.2), muss das erst in der Registry aktiviert werden

corpsman hat geschrieben:Kann man irgendwo nachlesen wie man den Übergabeparameter für Map zusammengebaut ?


Das ist erstmal ein beliebiger XPath/XQuery-Ausdruck: https://en.wikipedia.org/wiki/XPath_2.0 oder https://www.w3.org/TR/xpath-30/

In der Kombination map/retrieve braucht man für map ienen Ausdruck der etwas herunterladbares zurückgibt (z.B.: ein Link, ein Bild, oder eben ein Formular) und retrieve lädt das dann.

So //form findet alle Formulare auf der Seite, und form() füllt die aus. Und die Parameter für form kommen von m.fuchs's Beschreibung oben


corpsman hat geschrieben:Einloggen *g*, wie gehts nu weiter ..


Meistens geht es mit map weiter. .map('//a/@href') wären zum Beispiel die Addressen aller Links auf der Seite. Oder wieder mit form, um mehr Formulare auszufüllen.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von corpsman »

@m.fuchs

So nachdem ich ein wenig mit Benibela's Version rumgespielt habe musste ich leider Feststellen, dass der Odroid die von ihm Verwendete Library nicht kompilieren kann.

Also habe ich mich entschlossen, das alles von Hand nach deiner Anleitung zu implementieren, evtl lerne ich ja noch was dabei ;).

Mein Aktueller Stand ist im Anhang.
Von deiner Liste ist dort quasi abgehackt:

> 1. https://www.geocaching.com/account/login per GET abrufen.
mache ich via httpsend von Synapse

> 2. Den Inhalt parsen und das value von __RequestVerificationToken auslesen.
bastle ich mir nen Parser, der das Kann, im Sample ist das "hart" codiert, will erst mal sehen ob wir das mit dem Rest auch hin bekommen

> 3. Den neuen Request zusammenbauen und absenden.
Wie macht man das ?
btw die

Code: Alles auswählen

THTTPSend.HTTPMethod(const Method, URL: string): Boolean;

hat ja "Method" macht man da einfach nur "Request", und übergibt dann welchen URL string ?

> 4. Aus der Antwort alle relevanten Cookies auslesen, die für zukünftige Requests benötigt werden damit dein Programm als eingeloggt gewertet wird.
THTTPSend hat ein Attribut Cookiecount, ist das evtl schon mit drin ?

Weitere offene Fragen
- Aktuell muss ich die THTTPSend jedes mal neu erzeugen, klicke ich 2 mal hintereinander auf Login, dann kriege ich nicht mehr den Content sondern :

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Header</h2>
<hr><p>HTTP Error 400. The request has an invalid header name.</p>
</BODY></HTML>


So weit erstmal die Grundlage, das können wir hier aber gerne auch noch detaillierter durchgehen.

Ja bitte, wie geht es weiter *g*
Dateianhänge
OnlineLogger.zip
Source aktueller Stand
(10.41 KiB) 155-mal heruntergeladen
--
Just try it

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von m.fuchs »

corpsman hat geschrieben:> 3. Den neuen Request zusammenbauen und absenden.
Wie macht man das ?
btw die

Code: Alles auswählen

THTTPSend.HTTPMethod(const Method, URL: string): Boolean;

hat ja "Method" macht man da einfach nur "Request", und übergibt dann welchen URL string ?

Also Method ist die HTTP-Methode. In deinem Fall nur 'GET' wenn die Seiten geladen werden bzw. 'POST' wenn die Formulardaten übertragen werden. Das steht dann auch immer im <FORM>-Tag.
URL ist die URL zum empfangenden Serverskript. Also auch die aus dem <FORM>-Tag. Die Daten für den Request packst du in einen Stream. Und zwar den der hinter der Property Document hängt. Das machst du bevor HTTPMethod aufgerufen wird. Die Antwort des Servers steht danach auch in diesem Stream. Der ist also für Ein- und Ausgabe zuständig.

corpsman hat geschrieben:> 4. Aus der Antwort alle relevanten Cookies auslesen, die für zukünftige Requests benötigt werden damit dein Programm als eingeloggt gewertet wird.
THTTPSend hat ein Attribut Cookiecount, ist das evtl schon mit drin ?

Eigentlich sollte es eine Property Cookies besitzen wo die alle abgelegt sind. Nach einem Request werden die vom Server zurückgegebenen dort reingeschrieben, wenn du das Objekt nacheinander für alle Requests verwendest, dann bleiben sie auch gleich korrekt erhalten.

Soweit erst einmal. Den Rest und dein Programm schaue ich mir später noch an.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von m.fuchs »

Ich habe mal versucht den Teil in deinem Programm zu implementieren, bei dem du noch nicht weißt wie es geht:

Das käme dann nach der Stelle an der du den __RequestVerificationToken ermittelt hast. Die Variable RequestData ist vom Typ String.

Code: Alles auswählen

RequestData := Format('__RequestVerificationToken=%s&Username=%s&Password=%s', [__RequestVerificationToken, Username, Password]);
  fHTTP.Document.Write(RequestData[1], Length(RequestData));
  if fHTTP.HTTPMethod('POST', 'https://www.geocaching.com/account/login') then begin
    Result := fHTTP.ResultCode = 200;
  end;


Beim Result bin ich mir nicht sicher ob bei einem Fehllogin wirklich etwas anderes als 200 zurückkommt. Müsste man mal ausprobieren.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von corpsman »

Hmm klappt nicht :

Code: Alles auswählen

 
Function TGroundspeak.Login(UserName, Password: String): Boolean;
Var
  tmps: TStringlist;
  RequestData, __RequestVerificationToken, s: String;
  html: Phtml;
Begin
  result := false;
  fHTTP := THTTPSend.Create;
 
  If ProxyHost <> '' Then Begin
    fHTTP.ProxyHost := ProxyHost;
    fHTTP.ProxyPass := ProxyPass;
    fHTTP.ProxyPort := ProxyPort;
    fHTTP.ProxyUser := ProxyUser;
  End;
  Result := fHTTP.HTTPMethod('GET', 'https://www.geocaching.com/account/login');
  If Not Result Then Begin // Die einlog HP konnte nicht geöffnet werden -> Anzeigen was geht ..
    showmessage(
      'HTTP.ResultCode :' + inttostr(fhttp.ResultCode) + ' ; ' + fhttp.ResultString + LineEnding +
      'HTTP.Sock.LastError :' + inttostr(fHTTP.Sock.LastError) + ' ; ' + fHTTP.Sock.LastErrorDesc + LineEnding +
      'HTTP.Sock.SSL.LastError :' + inttostr(fHTTP.Sock.SSL.LastError) + ' ; ' + fHTTP.Sock.SSL.LastErrorDesc);
    fHTTP.free;
    exit;
  End;
  // Weiter mit dem Laden des Contents
  tmps := TStringlist.Create;
  tmps.LoadFromStream(fHTTP.Document);
  s := tmps.Text;
  tmps.free;
  html := HTMLStringToHTML(s);
  If Not assigned(html) Then Begin
    showmessage('Damn, beim Parsing');
    exit;
  End;
  // Todo : Eine geeignete Suchfunktion implementieren, die das dann Richtig findet.
  __RequestVerificationToken := html^.SubElements[0]^.Attributes[2].Value;
 
  RequestData := Format('__RequestVerificationToken=%s&Username=%s&Password=%s', [__RequestVerificationToken, Username, Password]);
  fHTTP.Document.Write(RequestData[1], Length(RequestData));
  If fHTTP.HTTPMethod('POST', 'https://www.geocaching.com/account/login') Then Begin
    Result := fHTTP.ResultCode = 200;
    tmps := TStringlist.Create;
    tmps.LoadFromStream(fHTTP.Document);
    s := tmps.Text;
    tmps.free;
  End;
  FreeHTML(html);
  form1.Memo1.Text := s;
  fHTTP.free;
End;


Ergibt ein False und :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Header</h2>
<hr><p>HTTP Error 400. The request has an invalid header name.</p>
</BODY></HTML>
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von corpsman »

hmm,

irgendwie komme ich nicht weiter, meine Aktuelle Version ist :

Code: Alles auswählen

 
 
Function TGroundspeak.Login(UserName, Password: String): Boolean;
Var
  tmps: TStringlist;
  RequestData, __RequestVerificationToken, s: String;
  html: Phtml;
  cookies: TStringList;
Begin
  result := false;
  fHTTP.Cookies.Clear;
  If ProxyHost <> '' Then Begin
    fHTTP.ProxyHost := ProxyHost;
    fHTTP.ProxyPass := ProxyPass;
    fHTTP.ProxyPort := ProxyPort;
    fHTTP.ProxyUser := ProxyUser;
  End;
  Result := fHTTP.HTTPMethod('GET', 'https://www.geocaching.com/account/login');
  //  Result := fHTTP.HTTPMethod('GET', UserName);
  If Not Result Then Begin // Die einlog HP konnte nicht geöffnet werden -> Anzeigen was geht ..
    showmessage(
      'HTTP.ResultCode :' + inttostr(fhttp.ResultCode) + ' ; ' + fhttp.ResultString + LineEnding +
      'HTTP.Sock.LastError :' + inttostr(fHTTP.Sock.LastError) + ' ; ' + fHTTP.Sock.LastErrorDesc + LineEnding +
      'HTTP.Sock.SSL.LastError :' + inttostr(fHTTP.Sock.SSL.LastError) + ' ; ' + fHTTP.Sock.SSL.LastErrorDesc);
    fHTTP.free;
    exit;
  End;
  // Weiter mit dem Laden des Contents
  tmps := TStringlist.Create;
  tmps.LoadFromStream(fHTTP.Document);
  s := tmps.Text;
  tmps.free;
 
  html := HTMLStringToHTML(s);
  If Not assigned(html) Then showmessage('Damn, beim Parsing');
  // Todo : Eine geeignete Suchfunktion implementieren, die das dann Richtig findet.
  __RequestVerificationToken := html^.SubElements[0]^.Attributes[2].Value;
 
  RequestData := Format('__RequestVerificationToken=%s&Username=%s&Password=%s', [__RequestVerificationToken, Username, Password]);
  cookies := TStringList.Create;
  cookies.Text := fHTTP.Cookies.Text;
  fHTTP.free;
  fHTTP := THTTPSend.Create;
  fhttp.Cookies.Text := cookies.Text;
  cookies.free;
  If ProxyHost <> '' Then Begin
    fHTTP.ProxyHost := ProxyHost;
    fHTTP.ProxyPass := ProxyPass;
    fHTTP.ProxyPort := ProxyPort;
    fHTTP.ProxyUser := ProxyUser;
  End;
 
  fHTTP.Document.Write(RequestData[1], Length(RequestData));
  //  If fHTTP.HTTPMethod('POST', 'https://www.geocaching.com/account/login?ReturnUrl=%2Fplay%2Fsearch') Then Begin
  If fHTTP.HTTPMethod('POST', 'https://www.geocaching.com/account/login') Then Begin
    Result := fHTTP.ResultCode = 200;
    tmps := TStringlist.Create;
    tmps.LoadFromStream(fHTTP.Document);
    s := tmps.Text;
    tmps.free;
  End;
  FreeHTML(html);
  form1.Memo1.Text := s;
  fHTTP.free;
End;
 


Die Antwort ist stets :

Code: Alles auswählen

<title>400 - Invalid Anti-Forgery Token</title>


Gemäß dem WinMSDN ist das so was ähnliches wie das VerificationToken nur irgendwie eingebettet. Jemand noch ne Idee für mich ?
--
Just try it

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von m.fuchs »

corpsman hat geschrieben:irgendwie komme ich nicht weiter, [...]


Boah, die geocaching.com-Seite ist echt ein Alptraum. Ich habe heute mal die HTTP-Requests aus dem Browser dahin analysiert und dann wirklich mal verstanden was da passiert.
Um da jetzt nicht in deinem Quellcode herzufuschen, habe ich ein kleines Test-Programm gebaut.

Download hier: https://www.michael-fuchs.net/newsgroups/lazarusforum.de/GcTest.zip

Es kann sich die AuthToken (es sind zwei) besorgen, Zugangsdaten senden und sich einloggen und im eingeloggten Zustand das Dashboard abfragen. Die Klasse zur gc.com-Kommunikation habe ich ein bisschen kommentiert.
Ich hoffe es hilft dir weiter.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Navigation auf einer Webseite durch Sourcecode

Beitrag von corpsman »

Vielen Dank, werde es nächste Woche testen und Analysieren.

Solltest du um den 11.11. wieder in Stuttgart sein, da gibts wieder ein Stuttgarter Lazarus Treffen...
--
Just try it

Antworten