Internetseite auslesen und dann?

  • Erst mal Danke für das Script. Damit werde ich mich aber später beschäftigen. Aktuell habe ich erst 18 verschiedene Zugangsdaten, da war es schneller mit suchen und ersetzen erledigt.

    Ich habe aber noch ein Problem, wo ich nicht so richtig weiss, wie ich das angehen soll. Weiter oben habe ja schon mal beschrieben, das die Website sich bei den unterschiedlichen Anmeldung sehr oft komisch verhält. Aktuell habe ich meine Anmeldedaten in der INI Datei so sortiert, dass der Account, mit den wenigsten Teilnehmern (das sind die Werte, die ich nach erfolgreicher Anmeldung auslese) vorne stehen. Wir haben hier grob eine Spannweite von 200 bis 1400 Teilnehmer.

    Leider scheint es hier keine saubere Logik zu geben. Ich kann ja hier auch nur von Hand mich anmelden und mit der Stoppuhr mal die Loginzeit protokollieren. Da kann es aber durchaus vorkommen, das ein Account mit 350 Teilnehmer eine Loginzeit von 70 Sekunden hat, der Account mit 1300 Teilnehmer aber nur 50 Sekunden.

    Aktuell habe ich ja folgende Timeout Werte gesetzt

    Code
    $hSession = _WinHttpOpen('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0')
    ;host
    $sServerName = 'leanv.zks-abfall.de'
    $hConnect = _WinHttpConnect($hSession, $sServerName)
    
    _WinHttpSetTimeouts($hConnect, 10000, 60000, 120000, 120000)

    So richtig ziehen, tun die aber nicht. Das merke ich daher, das mir mein Script irgendwann um die Ohren fliegt, weil der Login noch nicht durch ist, es aber bereits die weiteren Informationen erwartet.

    Wie geht man den bei sowas vernünftig vor?

    Nachtrag:

    Habe jetzt mal die Zeiten für den Login Vorgang gemessen

    Code
    Local $hTimer = TimerInit() ; Beginnt den Timer speichert das Handle in einer Variable.
    ;(3)Benutzername und Passwort senden (POST)
    ConsoleWrite("Benutername in der ZKS_Abfrage ist: " & $sBenutzerName & " mit dem Passwort: " & $sPasswort & @CRLF)
    $sPOST = 'action=login&uname=' & $sBenutzerName & '&password=' & $sPasswort & '&login=login'
    ConsoleWrite("$sPOST ist: " & $sPOST & @CRLF)
    $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'POST', '/LaenderEANV_Web/registrierung', 'https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?action=displaylogin', $sPOST)
    _FileWrite($sPaket) ; schreibe eine Kontroll HTML Datei
    Local $fDiff = TimerDiff($hTimer) ; Findet den Zeitunterschied zum vorherigen Aufruf von TimerInit. Die Variable wird im TimerInit Handle gespeichert und als Handle an TimerDiff übergeben.
    ConsoleWrite("Zeitunterschied beim Logon: " & $fDiff & " Millisekunden" & @CRLF)

    Die ersten 11 Anmeldung lagen im Schnitt zwischen 2500 und 5500 Millisekunden. Alles gut soweit. Dann kommt ein Ausreiser mit 32000 Millisekunden. Wenn ich mir dann die HTML Datei anschaue, die er geschrieben hat, steht da nur ein "0" drin. Bei den erfolgreichen HTMLs da dann sowas wie Angemeldet: FRITZ&MA815, Letzte Anmeldung: 28.12.2018, 08:51 Uhr

    Was kann ich im obigen Code machen, das er so lange wartet, bis die Anmeldung wirklich vollzogen ist?

    Einmal editiert, zuletzt von Code4Fun (28. Dezember 2018 um 09:43)

  • Kannst du (rein von der Logik her) nicht prüfen ob du "keine 0" zurückbekommst?

    Code
    while $sPaket = "0" ;Entweder auf "0" = Zeichen oder 0 = Zahl prüfen, ich kenne hier die Art der Rückgabe nicht, gehe aber mal von einem string aus
        $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'POST', '/LaenderEANV_Web/registrierung', 'https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?action=displaylogin', $sPOST)
    Wend
  • Hallo Moombas, den theoretischen Ansatz habe ich verstanden. Da ich ich die Variable $sPaket aber ja kurz dafür mit dem "ich klicke auf den Anmeldebutton" Inhalt versehen habe, wird diese ja zum Zeitpunkt von

    while $sPaket = "0" ;Entweder auf "0" = Zeichen oder 0 = Zahl prüfen

    einen Inhalt haben, der ungleich "0" ist. Aber versuchen tu ich es mal :)

  • Ich bin jetzt natürlich nur von deinem letzten Post ausgegangen und da füllst du $sPaket ja in der genannten Abfrage, welche ich hier in eine While-schleife gepackt habe, damit diese so lange immer wieder befüllt wird.

    Aber ich merke gerade, so würdest du immer wieder auch den Loginversuch neu starten. Dürfte also nicht funktionieren. Theoretisch müsste es also so heißen:

    Code
    $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'POST', '/LaenderEANV_Web/registrierung', 'https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?action=displaylogin', $sPOST)
    $timeout = 0
    while $sPaket = "0"
        sleep(500)
        $timeout = $timeout + 1
        if $timeout = 40 then ;Nach 20 Sekunden Abbrechen
            ;Fehlermeldung ausgeben
            Exitloop
        Endif
    WEnd

    ABER: Ich weiß nun nicht, ob sich an diesem Punkt $sPaket noch ändert.

  • _WinHttpSimpleSSLRequest ist eine pausierende Funktion. Wenn du nebenbei noch was machen willst musst du die Anfrage selber senden und mit ReceiveResponse u. ä. dann ablesen.

    Die While-Schleife in Moombas Schleife bringt absolut nichts, da sie solange wartet bis ein Timeout eintritt (der in den Timeouts gesetzt wurde) und danach erst in die While-Schleife springt.