Forum: PC-Programmierung Javascript/Tampermonkey: Passwort automatisch ausfüllen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Karsten D. (kenny7537)


Lesenswert?

Guten Abend,

ich versuche mich gerade daran, einen Login per Skript zu 
automaitisieren.

Die Anwendung vorab:
Es soll ein Weihnachtsgeschenk werden, nämlich ein kleines Display, das 
den aktuellen Zustand der Solaranlage bei meinen Eltern zeigt. Die 
Hardware ist ein Raspberry Pi 4 mit einem Display, auf dem ein 
FullpageOS läuft.
Da keine Eingabehardware vorgesehen ist, soll sich der Pi beim Start 
automatisch auf dem Webserver des KOSTAL KSEM (das ist das Energymeter) 
einloggen, woraufhin die aktuellen Energieflüsse dargestellt werden.

Das KSEM ist von außerhalb des lokalen Netzes nicht erreichbar, weshalb 
ich keine Sicherheitsbedenken habe, das Passwort in einem Skript zu 
verankern.

Hinweis: Die folgende Fehlerbeschreibung ist bisher nur auf dem PC 
getestet.

Ich konnte ein Skript anlegen, das das Passwort ausfüllt und auch das 
Absenden per button.click() funktioniert.
ABER: Das Passwort wird als falsch markiert. Natürlich übergebe ich dem 
Skript das richtige Passwort und konnte sogar nachvollziehen, dass es 
genügt, hinter dem per Skript ausgefüllten Passwort ein Zeichen zu 
tippen wieder zu löschen. Dann wird das Passwort als richtig erkannt.

Es scheint also, als würde das Passwortfeld noch irgendwelche 
Randbedingungen prüfen. Hat jemand von euch eine Idee, was ich hier tun 
kann?
Die Tastendrücke dem Eingabefeld manuell zu übergeben habe ich probiert, 
das geht leider nicht.

Sogar mit Begründung:
https://stackoverflow.com/questions/45457875/programmatically-send-keys-to-input-using-dispatchevent

Hier noch mein Skript:
(Das Setinterval wird benötigt, weil ich abwarten muss, bis das Popup 
mit der Passwortabfrage aufgeht).
1
// ==UserScript==
2
// @name         New Userscript
3
// @namespace    http://tampermonkey.net/
4
// @version      2024-12-20
5
// @description  try to take over the world!
6
// @author       You
7
// @match        http://192.168.10.65/login
8
// @icon         https://www.google.com/s2/favicons?sz=64&domain=10.65
9
// @grant        none
10
// ==/UserScript==
11
12
var LoginInterval;
13
14
(() => {
15
  LoginInterval = setInterval(CheckforInput, 1000);
16
})();
17
18
function CheckforInput() {
19
    var inputs = document.getElementsByTagName('input');
20
    if(inputs.length) {
21
        inputs[0].value = "Abcd1234567890";
22
        var buttons = document.getElementsByTagName('button');
23
        if(buttons.length) {
24
            buttons[5].click();
25
            clearInterval(LoginInterval);
26
        }
27
    }
28
}
Ja, das mit den festen Indizes ist nicht schön, funktioniert aber 
erstmal und der Webserver wird sich wohl auch nicht mehr ändern...

Falls jemand eine alternative Lösung für mein Problem hat: Gerne :)

Schonmal vielen Dank für eure Hilfe
Karsten

von Εrnst B. (ernst)


Lesenswert?

Erstmal im Browser-Debugger nachschauen, ob/was für EventListener an dem 
Input hängen.
Vielleicht reicht es, wenn du ein inputs[0].dispatchEvent mit einem 
entsprechend vorbereitetem "change" Event aufrufst.

von Karsten D. (kenny7537)


Angehängte Dateien:

Lesenswert?

Moin,

danke für die schnelle Reaktion!
Ich konnte da keine Eventlistener finden, habe aber mal den Baum aus dem 
Debugger rauskopiert. Vielleicht wird ja jemand schlau draus?

Da das ziemlich viel Text ist, habe ich es lieber angehängt. Anbei auch 
mal ein Bild der Loginseite, falls es interessiert...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.