Beiträge von Code4Fun
-
-
Hallo zusammen,
bin mit den ersten 3 Anwendungen schon gut am laufen, aber meine 4. Anwendung macht mir Probleme. Es handel sich um die Desktop Version von Telegram.
Meine ganzen Koordinaten bestimme ich mit "AutoIt v3 Windows Info".
Leider arbeitet mein WinMove hier nicht
Code: Code für Telegram$iPID_W_04 = Run("C:\Users\Name\AppData\Roaming\Telegram Desktop\Telegram.exe") ; starte Telegram Local $hWnd04 = WinWaitActive("[TITLE:Telegram]", "", 20) ; Wartet maximal 20 Sekunden bis Telegram erscheint. If WinActive("[TITLE:Telegram]") Then; wenn das Telegram Fenster aktiv ist Send("1234{ENTER}"); schreibe den Login und drücke ENTER WinMove($hWnd04, "", -840, 34, 840, 626) ; Verschiebt Telegram auf die X-Position von -840 und Y-Position von 34 und setzt die Höhe auf 840 und Breite auf 626 EndIfHabt Ihr da eine Idee?
-
Hallo zusammen,
ich plane für demnächst einen kleinen "Anwendungs Starter" der folgendes können soll.
Da ich bald mit 5 Monitoren arbeiten werde und aktuell jeden Tag mindestes 16 Anwendungen parallel starten muss und diese aktuell von Hand auf die jeweiligen Monitore verschiebe, möchte ich mir das in Zukunft einfacher machen.
Der "Anwendungs Starter" soll ..
- automatisch alle 16 Anwendungen starten (das bekomme ich hin)
- die jeweilige Anwendung auf einen bestimmten Monitor ziehen
- dort dann die Anwendung links oben und rechts unten auf eine definierte Größe aufziehen
Ich denke mit einem MouseClickDrag kann man hier vermutlich was bewegen, jedoch wollte ich fragen, ob es vielleicht einen schickeren Lösungsansatz gibt. Vielleicht irgendwas, dass die Anwendung optisch da gleich richtig erscheint und nicht erst lange wie von Geisterhand durch die Monitore gezogen werden muss.
Danke für eure Vorschläge.
-
Hallo Bitnugger,
erst mal vielen Dank für den Code. Sieht für mich nicht einfach aus. Leider muss ich Dir sagen, dass das komplett am Thema vorbei ging. Ich versuche meine Anwendung mal zu beschreiben. Das was die Anwendung macht, geschieht normal durch ca. 18 Mausklicks in einem Browser. Ich habe das vor Jahren dann so angefangen, das ich einen Wert in eine Inputbox kopiere und dann noch einen Button drücke. Danach musst ich es erweitern um eine Checkbox (für Kunde A). Kurze Zeit Später kam die 2. Checkbox dazu (für Kunde B). Das hat jetzt in Summe 4 Checkboxen. Alle 4 Kunden sind von den Werten her fix definiert, da Sie oft benötigt werden. Ich habe dann noch eine Inputbox hinzugefügt, wo ich sozusagen viel 5. Kunden abbilden kann, indem ich den Wert - nach dem Starten der Anwendung - individuell eintragen kann. Da funktioniert auch alles. Jetzt würde ich gerne die 4 Checkboxen und das Inputfeld verwerfen und dafür eine ComboBox nutzen.
Die Positionen 2 bis 5 in der Combox (also wenn ich die öffne und man die Werte sieht), sollen meine Kunden A bis D abbilden (also fix sein). Die Position 1 (also der Wert der ComboBox, den man sieht, wenn man die ComboBox nicht aufklappt), soll als InputBox dienen. Sprich ich trage da was ein, dann klicke ich auf meinen Button und eine Aktion XYZ muss dann irgendwie die Position 1 der ComboBox auslesen (oder eben Position 2 bis 5, falls ich einen fixen Wert aus der ComboBox wähle) und verarbeiten.
Der Variable Wert muss überhaupt nicht fest verdrahtet werden. Der wird wirklich nur zum Zeitpunkt der Ausführung benötigt.
Trotz allem vielen Dank euch allen für eure Bemühungen.
-
Hallo BugFix,
jetzt kommen wir der Sache näher. Danke schon mal. Stell Dir jetzt aber statt dem Text "Neuen Eintrag speichern" den Text "DB abfragen" vor.
Wenn ich aktuell den Wert ausgeben via
CodeWhile True Switch GUIGetMsg() Case -3 Exit Case $cAdd $sCombo &= "|" & GUICtrlRead($cCombo) MsgBox(1,"ComboAusgabe", $sCombo) ;~ GUICtrlSetData($cCombo, "|" & $sCombo) EndSwitch WEnddann sieht das ja untergefähr so aus:
Die DB sollte aber gleich mit "Mein eigener Wert" los legen (oder eben mit Va_1 usw.). Es muss praktisch mit einem Klick der Wert ausgelesen, selektiert und verarbeitet werden.
-
Hallo zusammen,
ich suche einen Weg, eine ComboBox mit z.B. 4 festen Werten um einen weiteren 5. Wert zu erweitern.
Problem:
- Der Wert wird erst eingetragen, nachdem die Anwendung gestartet ist.
- Der Wert muss wärend der Ausführung ausgelesen und verarbeitet werden
- Der Wert muss danach nicht gespeichert werden
Ich habe als Beispiel mal den Code aus der Hilfe etwas umgeschrieben.
ComboBox Code
C
Alles anzeigen#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> Example() Func Example() ; Erstellt eine GUI mit verschiedenen Controls. Local $hGui = GUICreate("Example", 300, 200) ; Erstellt ein Combobox-Control. Local $idComboBox = GUICtrlCreateCombo("Platzhalter", 10, 10, 185, 20) Local $idButton_Close = GUICtrlCreateButton("Schließen", 210, 170, 85, 25) ; Fügt der Combobox zusätzliche Items hinzu. GUICtrlSetData($idComboBox, "Wert 1|Wert 2|Wert 3|Wert 4", "Platzhalter") ; Zeigt die GUI GUISetState(@SW_SHOW, $hGui) Local $sComboRead = "" ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idButton_Close ExitLoop Case $idComboBox GUISetState(@SW_SHOW, $hGui) $sComboRead = GUICtrlRead($idComboBox) MsgBox($MB_SYSTEMMODAL, "", "Die Combobox zeigt momentan folgendes an: " & $sComboRead, 0, $hGui) EndSwitch WEnd ; Löscht die vorherige GUI und alle Controls. GUIDelete($hGui) EndFunc ;==>ExampleWenn ich jetzt zur Laufzeit das Wort "Platzhalter" durch z.B. "Wert 5" ersetze, wird mir aber nie "Wert 5" angezeigt.
Was muss ich hier genau anpassen?
Vielen Dank
-
Hallo alpines, vielen Dank. Das war ja einfach.
-
Hallo zusammen,
ich stehe gerade auf dem Schlauch. Unter Windows kann man doch über eine beliebige Datei gehen, Kontextmenü öffnen und dort dann auf "Dateipfad öffnen" klicken. Danach öffnet sich der Explorer in dem Pfad, wo die Datei liegt. Ich möchte gerne einen Button auf meine GUI legen, die genau diese Funktion nachbildet. In der Hilfe komme ich aber nicht wirklich weiter. Dachte es muss was mit Verzeichnis öffnen sein. Könnt Ihr mir hier bitte weiterhelfen. Danke
-
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

-
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
CodeLocal $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?
-
Ja, ich denke das hat mich schon ein großes Stück nach vorne gebracht.
Da ich ja & - Zeichen und # - Zeichen habe, habe ich die mal mit %26 und %23 kaskadiert. Jetzt läuft es schon viel weiter. Aber jetzt kommt die nächste Fehler suche

Vielen Dank Euch allen
-
Von meinen 18 unterschiedlichen Benutzernamen, haben nur 5 KEIN "&" Zeichen. Wenn ich nur die 5 in die INI Datei nehme, kann ich mich am Stück anmelden. Ich muss irgendwie das "&" Zeichen kaskadieren, sonst sehe ich da irgendwie schwarz.
-
alpines, ich glaube Deine Info von vorher geht doch in eine richtige Richtung. Problem werden die Benutzernamen sein (die aber vom System vorgegeben werden). Da sind nämlich '&' Zeichen drin

Der Benutzernamen wird zwar richtig übergeben, aber für die action ist das ja dann
Leider sieht es im HTTP Header Live genauso aus. Glaubst Du, ich kann da mit '' arbeiten?
Nachtrag: habe gerade beide Varianten versucht, also
Code$sPOST ist: action=login&uname='FRITZ&MA659'&password='GEHEIM'&login=login $sPOST ist: action=login&uname="FRITZ&MA659"&password="GEHEIM"&login=loginHat beides nichts genützt.
Ich glaube jetzt habe ich ganz schlechte Karten
-
Haben deine Benutzerdaten vielleicht Zeichen die du nicht richtig kodierst? Was passiert denn wenn du die Reihenfolge der Anmeldedaten vertauscht.
Das einzige Sonderzeichen im Passwort ist eine Raute '#'. Die kommt aber z.B. beim 1. Login vor, beim 2. z.B. nicht. Habe schon früher mal versucht, die Reihenfolge in der INI zu ändern. Keine Änderung.
Ich habe mal die 14 erzeugten HTML Dateien beigefügt. Datei 1 bis 7 ist der erste Durchlauf, Datei 8 bis 14 ist der 2. Durchlauf. Vielleicht sehr Ihr ja was, was ich nicht sehe.
-
Hmm eigenartig, du kannst mir gerne das Skript mit Beispielszugangsdaten mal schicken und ich kanns von meiner Seite aus testen, ansonsten sehe ich da nichts.
Hallo alpines, vielen Dank für das Angebot, aber hier würde ich bzgl. DSGVO ziemlich Probleme bekommen
Was ich Dir aber anbieten kann, ist mein Mitschnitt vom Firefox Plugin "HTTP Header Live". Hier habe ich dann die Credentials auf neutral geändert
Mitschnitt von HTTP Header Live
Code
Alles anzeigenhttps://leanv.zks-abfall.de/LaenderEANV_Web/registrierung Host: leanv.zks-abfall.de User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?action=displaylogin Content-Type: application/x-www-form-urlencoded Content-Length: 145 DNT: 1 Connection: keep-alive Cookie: JSESSIONID=2C1F37D779DAB450F5A0CF7EE6F18757.zksa005pn2; zks_fontsize=77 Upgrade-Insecure-Requests: 1 action=login&uname=BENUTZERNAME&password=PASSWORD&callingUri=/LaenderEANV_Web/registrierung?BTN-initRegistration=start&login=login POST: HTTP/1.1 200 200 Date: Thu, 27 Dec 2018 08:10:20 GMT Server: Apache/2.4.6 (Red Hat Enterprise Linux) mod_jk/1.2.46 OpenSSL/1.0.2k-fips Strict-Transport-Security: max-age=63072000; includeSubdomains; preload X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Content-Type: text/html;charset=UTF-8 Via: 1.1 leanv.zks-abfall.de Connection: close Transfer-Encoding: chunked --------------------- https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?BTN-initRegistration=start Host: leanv.zks-abfall.de User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung DNT: 1 Connection: keep-alive Cookie: JSESSIONID=2C1F37D779DAB450F5A0CF7EE6F18757.zksa005pn2; zks_fontsize=77 Upgrade-Insecure-Requests: 1 GET: HTTP/1.1 200 200 Date: Thu, 27 Dec 2018 08:10:27 GMT Server: Apache/2.4.6 (Red Hat Enterprise Linux) mod_jk/1.2.46 OpenSSL/1.0.2k-fips Strict-Transport-Security: max-age=63072000; includeSubdomains; preload X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Content-Type: text/html;charset=UTF-8 Via: 1.1 leanv.zks-abfall.de Connection: close Transfer-Encoding: chunked --------------------- https://leanv.zks-abfall.de/LaenderEANV_Web/stammdaten Host: leanv.zks-abfall.de User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?BTN-initRegistration=start Content-Type: application/x-www-form-urlencoded Content-Length: 52 DNT: 1 Connection: keep-alive Cookie: JSESSIONID=2C1F37D779DAB450F5A0CF7EE6F18757.zksa005pn2; zks_fontsize=77 Upgrade-Insecure-Requests: 1 BTN-auswahl=Registrierung / Stammdatenpflege POST: HTTP/1.1 200 200 Date: Thu, 27 Dec 2018 08:10:29 GMT Server: Apache/2.4.6 (Red Hat Enterprise Linux) mod_jk/1.2.46 OpenSSL/1.0.2k-fips Strict-Transport-Security: max-age=63072000; includeSubdomains; preload X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Content-Type: text/html;charset=UTF-8 Via: 1.1 leanv.zks-abfall.de Connection: close Transfer-Encoding: chunked --------------------- https://leanv.zks-abfall.de/LaenderEANV_Web/stammdaten?action=auswahl Host: leanv.zks-abfall.de User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://leanv.zks-abfall.de/LaenderEANV_Web/stammdaten Content-Type: application/x-www-form-urlencoded Content-Length: 29 DNT: 1 Connection: keep-alive Cookie: JSESSIONID=2C1F37D779DAB450F5A0CF7EE6F18757.zksa005pn2; zks_fontsize=77 Upgrade-Insecure-Requests: 1 chooseBL=H&ok=Übernehmen POST: HTTP/1.1 302 302 Date: Thu, 27 Dec 2018 08:10:33 GMT Server: Apache/2.4.6 (Red Hat Enterprise Linux) mod_jk/1.2.46 OpenSSL/1.0.2k-fips Strict-Transport-Security: max-age=63072000; includeSubdomains; preload X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Location: /LaenderEANV_Web/stammdaten?BTN-main=Stammdaten Content-Length: 0 Content-Type: text/html;charset=utf-8 Via: 1.1 leanv.zks-abfall.de Connection: close --------------------- https://leanv.zks-abfall.de/LaenderEANV_Web/stammdaten?BTN-main=Stammdaten Host: leanv.zks-abfall.de User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://leanv.zks-abfall.de/LaenderEANV_Web/stammdaten DNT: 1 Connection: keep-alive Cookie: JSESSIONID=2C1F37D779DAB450F5A0CF7EE6F18757.zksa005pn2; zks_fontsize=77 Upgrade-Insecure-Requests: 1 POST: HTTP/1.1 200 200 Date: Thu, 27 Dec 2018 08:10:33 GMT Server: Apache/2.4.6 (Red Hat Enterprise Linux) mod_jk/1.2.46 OpenSSL/1.0.2k-fips Strict-Transport-Security: max-age=63072000; includeSubdomains; preload X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Content-Type: text/html;charset=UTF-8 Via: 1.1 leanv.zks-abfall.de Connection: close Transfer-Encoding: chunked --------------------- https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?action=logout Host: leanv.zks-abfall.de User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://leanv.zks-abfall.de/LaenderEANV_Web/stammdaten?BTN-main=Stammdaten DNT: 1 Connection: keep-alive Cookie: JSESSIONID=2C1F37D779DAB450F5A0CF7EE6F18757.zksa005pn2; zks_fontsize=77 Upgrade-Insecure-Requests: 1 GET: HTTP/1.1 200 200 Date: Thu, 27 Dec 2018 08:10:39 GMT Server: Apache/2.4.6 (Red Hat Enterprise Linux) mod_jk/1.2.46 OpenSSL/1.0.2k-fips Strict-Transport-Security: max-age=63072000; includeSubdomains; preload X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Content-Type: text/html;charset=UTF-8 Set-Cookie: JSESSIONID=D6BE7E25E8C4F44583D3940FC60327D7.zksa005pn2; Path=/LaenderEANV_Web; HttpOnly Via: 1.1 leanv.zks-abfall.de Connection: close Transfer-Encoding: chunked ---------------------Vielleicht muss ich ja noch was mit Cookies machen? Oder beende ich die Sitzung nicht korrekt? Ich finde es halt komisch, das beim unten stehenden ConsoleWrite der Benutzername und das Passwort auch beim 2. Durchgang stimmt, jedoch ich ab 3a feststellen kann, das der Login so nicht funktioniert hat. Ich habe hier eher das Gefühl, das der Logoff Prozess nicht sauber läuft und beim 2. Durchgang noch irgendwas aktiv ist, was den erneuten Login mit neuen Daten verhindert.
Code;(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 ; 3a)An dieser Stelle läuft was schief. Die erste Anmeldung geht, beim 2. Durchgang wird die neue Anmeldung - warum auch immer - nicht akzeptiert $aTestString = _StringBetween($sPaket, '<div id="zks_loginf">', '</div>') ; schauen, was in der Zwischenablage liegt _ArrayDisplay($aTestString, 'Array Inhalt') ; hier will ich überprüfen, ob die Anmeldung erfolgreich war.Hier nochmals der Link, wo das ganze Script zu sehen ist:
https://autoit.de/index.php?thread/86250-internetseite-auslesen-und-dann/&postID=693160#post693160
-
Hallo alpines,
erst mal Danke für die Kritik. Ich bitte meinen schlechten Stil zu verzeichen, da ich nur so zum Spass etwas code und das auch nur alle 1,5 Jahre, d.h. Routine werde ich nie bekommen. Aber Du darfst mir gerne sagen, was ich denn besser machen sollte.
Die For Schleife mit dem Ubound habe ich von Bugfix's Array Tutorial. Da sich der Inhalt der ini ja erweitern kann, liege ich doch mit dem Ubound nicht so falsch. Du hast den Aufbau der ini richtig erkannt. Ich habe mal das Script so umgebaut, dass ich mit deiner ini arbeite und nur die For Schleife laufen lasse und das Ergebnis in die Console schreibe. In meinen Augen passt hier alles, so bekomme ich es ja auch mit meiner ini dargestellt.
Code
Alles anzeigenFunc LESE_INI() ; INI Datei im Scriptverzeichnis auslesen, um den Benutzernamen und das Passwort zu ermitteln Local $aINI, $iZeilenZaehler, $iSpaltenZaehler; Variable für Array deklarieren $aINI = IniReadSection(@ScriptDir & "\ZKS-Teilnehmer.ini", "Zugangsdaten") ; Sektion einlesen If Not IsArray($aINI) Then ; Wenn zurückgegebene Variable kein Array ist MsgBox(0, '', 'INI-Sektion konnte nicht gelesen werden') Exit EndIf For $iZeilenZaehler = 1 To UBound($aINI) - 1 ; $iZeilenZaehler ist der Zaehler für die Zeilen $sBenutzerName = ($aINI[$iZeilenZaehler][0]) For $iSpaltenZaehler = 1 To UBound($aINI, 2) - 1 ; $iSpaltenZaehler ist der Zaehler für die Spalten $sPasswort = ($aINI[$iZeilenZaehler][$iSpaltenZaehler]) ConsoleWrite("Benutername ist: " & $sBenutzerName & " mit dem Passwort: " & $sPasswort & @CRLF) Next Next EndFunc ;==>LESE_INIHier der Text der Consolenausgabe:
Benutername ist: user1 mit dem Passwort: pass1
Benutername ist: user2 mit dem Passwort: pass2
Benutername ist: user3 mit dem Passwort: pass3
Benutername ist: user4 mit dem Passwort: pass4
Von daher verstehe ich nicht, warum ab dem 2. Durchgang es irgendwie nicht mehr passt
-
So, hier bin ich nochmals. Na ein paar Recherchen bin ich mir ziemlich sicher, das mein Problem wo anderst liegt. Hier mal mein aktuelles Script. Die Benutzernamen und Passwörter stimmen definitiv!
Aktuelles Script Stand 21.12.2018 - 16:48 Uhr
C
Alles anzeigen#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Language=1031 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #Region ; Includes #include <Array.au3> #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <String.au3> #include <WinHttp.au3> #EndRegion ; Includes #Region ; Script Kopf #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Code4Fun Script Function: GUI Script zum Auslesen unserer Postfächer, zur Ermittlung der aktiven Teilnehmer Erstellungendatum: vom 14.12.2018 bis Änderungsdatum: Version: 0.0.1 History: 0.0.1: Initialerstellung 0.0.2: #ce ---------------------------------------------------------------------------- #EndRegion ; Script Kopf #Region ; Vorgehensweise ; 1. Login auf ZKS in einem Postfach, dann den Quelltext anzeigen lassen ; 2. Alles markieren und kopieren, damit sich der Text in der Zwischenablage befindet ; 3. Script laufen lassen. Im Scriptverzeichnis wird eine TXT Datei erstellt, welche als Namen die behördliche Nummern enthält. ; 4. Liste irgendwie noch nach Excel bringen (spätere Priorität) #EndRegion ; Vorgehensweise #Region ; Globale Variablen Deklaration Opt("MustDeclareVars", 1) ; Variablen müssen deklariert sein Opt("GUICloseOnESC", 1) ; GUI schließt mit ESC Global $guiButton, $guiInput1, $guiInput2, $ReadCombo, $ReadInput, $ZKSFile, $msg, $sFileVersion Global $iCount = 1, $sBenutzerName, $sPasswort #EndRegion ; Globale Variablen Deklaration #Region ; Versionnummer If @Compiled Then $sFileVersion = FileGetVersion(@AutoItExe) Else $sFileVersion = " !!! Testlauf" EndIf #EndRegion ; Versionnummer #Region ; GUI wird gestartet GUI() #EndRegion ; GUI wird gestartet #Region ; While Schleife While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE GUIDelete() Exit Case $guiButton LESE_INI() EndSwitch WEnd #EndRegion ; While Schleife #Region ; Funktionen Func GUI() ; GUI erstellen GUICreate("ZKS Postfach Teilnehmer Parser " & $sFileVersion, 400, 80) $guiButton = GUICtrlCreateButton("Zwischenablage parsen", 110, 20, 200, 40, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_DEFPUSHBUTTON)) GUISetState(@SW_SHOW) EndFunc ;==>GUI Func LESE_INI() ; INI Datei im Scriptverzeichnis auslesen, um den Benutzernamen und das Passwort zu ermitteln Local $aINI, $iZeilenZaehler, $iSpaltenZaehler, $iLCount = 0 ; Variable für Array deklarieren $aINI = IniReadSection(@ScriptDir & "\ZKS-Teilnehmer.ini", "Zugangsdaten") ; Sektion einlesen If Not IsArray($aINI) Then ; Wenn zurückgegebene Variable kein Array ist MsgBox(0, '', 'INI-Sektion konnte nicht gelesen werden') Exit EndIf ;~ _ArrayDisplay($aINI, 'Inhalt INI-Sektion: [Zugangsdaten]') ; eingelesenes Array anzeigen For $iZeilenZaehler = 1 To UBound($aINI) - 1 ; $iZeilenZaehler ist der Zaehler für die Zeilen ;~ ConsoleWrite($aINI[$iZeilenZaehler][0] & " = "); Benutzername $sBenutzerName = ($aINI[$iZeilenZaehler][0]) For $iSpaltenZaehler = 1 To UBound($aINI, 2) - 1 ; $iSpaltenZaehler ist der Zaehler für die Spalten ;~ ConsoleWrite($aINI[$iZeilenZaehler][$iSpaltenZaehler] & @CRLF); Passwort $sPasswort = ($aINI[$iZeilenZaehler][$iSpaltenZaehler]) ;~ ConsoleWrite("Benutername ist: " & $sBenutzerName & " mit dem Passwort: " & $sPasswort & @CRLF) $iLCount += 1 ConsoleWrite("Runde " & $iLCount & " hat begonnen => ") ZKS_Abfragen() Next Next EndFunc ;==>LESE_INI Func ZKS_Abfragen() Local $sServerName, $sPaket, $sPOST, $hConnect, $hSession, $aTestString $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, 2000, 45000, 45000, 45000) ;(1)Aufruf der Seite: https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?BTN-initRegistration=start (GET) $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'GET', '/LaenderEANV_Web/registrierung?BTN-initRegistration=start') _FileWrite($sPaket) ; schreibe eine Kontroll HTML Datei ;(2)rechts oben auf Anmelden klicken (GET) $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'GET', '/LaenderEANV_Web/registrierung?action=displaylogin', 'https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?BTN-initRegistration=start') _FileWrite($sPaket) ; schreibe eine Kontroll HTML Datei ;(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 ; 3a)An dieser Stelle läuft was schief. Die erste Anmeldung geht, beim 2. Durchgang wird die neue Anmeldung - warum auch immer - nicht akzeptiert $aTestString = _StringBetween($sPaket, '<div id="zks_loginf">', '</div>') ; schauen, was in der Zwischenablage liegt _ArrayDisplay($aTestString, 'Array Inhalt') ; hier will ich überprüfen, ob die Anmeldung erfolgreich war. ;(4)Unter Menü Registrierung/Stammdatenpflege auf Registrierung/Stammdaten klicken (GET) $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'GET', 'LaenderEANV_Web/registrierung?BTN-initRegistration=start', 'https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung') _FileWrite($sPaket) ; schreibe eine Kontroll HTML Datei ;(5)Auf die große blaue Schaltfläche Registrierung/Stammdatenpflege klicken (POST) $sPOST = 'BTN-auswahl=Registrierung / Stammdatenpflege' $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'POST', '/LaenderEANV_Web/stammdaten', 'https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?BTN-initRegistration=start', $sPOST) _FileWrite($sPaket) ; schreibe eine Kontroll HTML Datei ;(6)Auf den Radio Button Baden-Württemberg klicken $sPOST = 'chooseBL=H&ok=Übernehmen' $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'POST', 'LaenderEANV_Web/stammdaten?action=auswahl', 'https://leanv.zks-abfall.de/LaenderEANV_Web/stammdaten', $sPOST) _FileWrite($sPaket) ; schreibe eine Kontroll HTML Datei ClipPut("") ; Zwischenablage zur Vorsicht einmal leeren ClipPut($sPaket) ; Zwischenablage mit Quellcode befüllen ;(7)rechts oben auf Abmelden klicken (GET) $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'GET', '/LaenderEANV_Web/registrierung?action=logout', 'https://leanv.zks-abfall.de/LaenderEANV_Web/stammdaten?BTN-main=Stammdaten') _FileWrite($sPaket) ; schreibe eine Kontroll HTML Datei _WinHttpCloseHandle($hConnect) ; die Handles werden beendet _WinHttpCloseHandle($hSession) ; die Handles werden beendet PARSEN_Dokumentenname() ; mit der befüllten Zwischenablage wird an die Funktion PARSEN_Dokumentenname() übergeben. EndFunc ;==>ZKS_Abfragen Func PARSEN_Dokumentenname() ; hier ermittle ich den Provider Namen und erstelle daraus ein Textdatei mit dessen Namen. Local $str, $line1, $line2 $str = ClipGet() ; Zwischenablage abfragen $line1 = _StringBetween($str, '<div class="zks_form_wrapper">', '<!-- Buttons -->') ; Erste Vorauswahl If StringInStr($line1[0], "Provider") Then $line2 = _StringBetween($line1[0], '<p class="zks_reg_details_content"><b>', ' / Provider</b>') ; den Postfachnamen rausbekommen falls mit Provider endet EndIf If StringInStr($line1[0], "Sonstiges") Then $line2 = _StringBetween($line1[0], '<p class="zks_reg_details_content"><b>', ' / Sonstiges</b>') ; den Postfachnamen rausbekommen falls mit Sonstiges endet EndIf If FileExists(@ScriptDir & "\" & $line2[0] & ".txt") Then ; überprüfen, ob die Datei schon besteht, wenn ja, dann löschen und Variable füllen FileDelete(@ScriptDir & "\" & $line2[0] & ".txt") Sleep(2000) $ZKSFile = @ScriptDir & "\" & $line2[0] & ".txt" Else $ZKSFile = @ScriptDir & "\" & $line2[0] & ".txt" ; wenn nein, dann nur Variable füllen EndIf FileWrite(@ScriptDir & "\" & $line2[0] & ".txt", "") ; die eigentliche leere Text Datei erstellen PARSEN_Inhalt() ; nachdem der Dateiname gefunden und erstellt wurde, geht es um den eigentlichen Inhalt. Weiter mit der Funktion PARSEN_Inhalt() EndFunc ;==>PARSEN_Dokumentenname Func PARSEN_Inhalt() ; hier ermittle ich die verschiedenen Nummern und Rollen Local $str, $line1, $line2, $line3, $sString $str = ClipGet() ; Zwischenablage erneut abfragen, da Variable local definiert wurde $line1 = _StringBetween($str, '<!-- <hr class="zks_separator" />-->', '</table>') ; Erste Vorauswahl $line2 = _StringBetween($line1[0], '<!-- Ruler -->', '<!-- Buttons -->') ; Zweite Vorauswahl ;~ For $i = 0 To UBound($line2) - 1 Step 3 ; Step 3 dachte ich war gut, aber es hat das Ergebnis verfälscht. Ohne ist alles OK For $i = 0 To UBound($line2) - 1 ; Abfrage der einzelnen Blöcke aus $line2 $line3 = _StringBetween($line2[$i], '<p class="zks_reg_details_content">', @TAB & @TAB & @TAB & '<br />') ; Richtigen String ausfindig machen ; gefundene Strings durch Abkürzung ersetzen Select Case StringInStr($line3[0], 'Bevollmächtigter des Erzeugers') ; wenn dieser String gefunden wurde $sString = StringReplace($line3[0], 'Bevollmächtigter des Erzeugers', 'BEV') ; ersetze ihn mit diese String | speziell hier gibt es noch Probleme, aber auf später verschoben. Prio 2 Case StringInStr($line3[0], "Erzeuger") ; wenn dieser String gefunden wurde $sString = StringReplace($line3[0], "Erzeuger", "ERZ") ; ersetze ihn mit diese String Case StringInStr($line3[0], "Beförderer") ; wenn dieser String gefunden wurde $sString = StringReplace($line3[0], "Beförderer", "BEF") ; ersetze ihn mit diese String Case StringInStr($line3[0], "Entsorger") ; wenn dieser String gefunden wurde $sString = StringReplace($line3[0], "Entsorger", "ENT") ; ersetze ihn mit diese String Case StringInStr($line3[0], "Makler") ; wenn dieser String gefunden wurde $sString = StringReplace($line3[0], "Makler", "MAK") ; ersetze ihn mit diese String Case StringInStr($line3[0], "kurzfr.Lag./Umschlag") ; wenn dieser String gefunden wurde $sString = StringReplace($line3[0], "kurzfr.Lag./Umschlag", "ZWL") ; ersetze ihn mit diese String ;~ Case Else ;~ MsgBox(48, "Keine Ersetzung gefunden", "In der Select Case Anweisung wurde kein String zum Ersetzen gefunden") EndSelect ;~ ConsoleWrite($sString) ; Ausgabe des Ergebnis in unteres Output Fenster - zur Kontrolle FileWrite($ZKSFile, $sString) ; Ausgabe in meine Text Datei Next EndFunc ;==>PARSEN_Inhalt Func _FileWrite($sHTML, $Zusatz = "") ; erstellt zu Kontrollzwecken lokale HTML Dateien, ConsoleWrite($iCount & "Vote" & $Zusatz & @CRLF) FileDelete($iCount & "Vote" & $Zusatz & ".html") FileWrite($iCount & "Vote" & $Zusatz & ".html", $sHTML) $iCount += 1 EndFunc ;==>_FileWrite #EndRegion ; FunktionenIn Zeile 124 überprüfe ich den aktuellen Benutzernamen und das Passwort. Hier ist immer alles OK
Auch die Consolenausgabe (Zeile 126) vom Inhalt der $aPOST Variable passt noch. Aber ab dem 2. Durchlauf hat das Array (Zeile 132) einen anderen Inhalt.
Hier der Inhalt vom 1. Durchlauf
und hier das Ergebnis vom 2. Durchlauf
Ich "hoffe" das ich hier vom Verständis alles richtig mache. Ich melde mich ja auch noch von der Seite ab und schließe die Handle. Das sollte doch reichen, oder?
Freue mich auf eure Antworten.
Gruß CodeFun
-
Hallo zusammen,
ich komme für meinen Geschmack ganz gut voran, habe jetzt aber ein Timing Problem
Code;(3)Benutzername und Passwort senden (POST) $sPOST = 'action=login&uname=' & $sBenutzerName & '&password=' & $sPasswort & '&login=login' $sPaket = _WinHttpSimpleSSLRequest($hConnect, 'POST', '/LaenderEANV_Web/registrierung', 'https://leanv.zks-abfall.de/LaenderEANV_Web/registrierung?action=displaylogin', $sPOST) _FileWrite($sPaket)Über eine For - Next Schleife werden aus einem Array für den $sPOST unterschiedliche Zugangsdaten erzeugt.
Jetzt ist es auch im Browser so, das es dort Postfächer mit viel Content und welche mit wenig Content gibt. Die mit wenig Cotent lassen sich schnell anmelden, die mit viel Content können durchaus auch mal 1 Minute dauern, im dümmsten Fall wird eine Proxy Meldung erzeugt (Browser fliegt weg).
Ich habe jetzt mit der Zeile $sPaket genau dieses Problem. Es gibt dort einen Account, der braucht wirklich sehr lange. Gibt es eine Möglichkeit _WinHttpSimpleSSLRequest einen Timeout mitzugeben? Aktuell scheint er nicht zu warten und es kommt dann die Meldung Anmeldung fehlgeschlagen - Anmeldename oder Passwort falsch. was aber nicht stimmt.
-
Stimmt! Danke für den Hinweis. Manchmal ist die Leitung doch recht dick, auf der man steht.
-