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