Anmeldung Website Server Growatt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Hallo ich würde mich gerne bei dem Server von growatt.com anmelden aber irgendwie werden meine Anmeldedaten nicht übernommen... Was mache ich falsch? Mein Python-Code ist:

import requests
import webbrowser

url = "https://server.growatt.com/login"
login = {'val_loginAccount.sameLogin.userNameVal': 'xxx',
'val_loginPwd.sameLogin.pasdVal': 'yyy'}

print("Original URL:", url)

r = requests.post(url, data=login)

print("\nNew URL", r.url)
print("Status Code:", r.status_code)
print("History:", r.history)

print("\nRedirection:")
for i in r.history:
print(i.status_code, i.url)

# Open r in the browser to check if I logged in
new = 2 # open in a new tab, if possible
webbrowser.open(r.url, new=new)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Webseite benutzt normalerweise Cookies, um zu wissen ob sich jemand eingeloggt hat oder nicht. Dein requests-Aufruf hat aber nichts mit dem anschließenden webbrowser Aufruf zu tun. Der Browser weiß also nichts davon dass du dich eingeloggt hast.
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Hallo Sirius, was müsste ich dann am Script ändern? Kannst du mir da bitte weiterhelfen? Import cookielib?
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kann er nicht. Weil das so ohne weiteres nicht geht. An den Browser Cookie Store ranzukommen ist eine ganz andere Aufgabe. Wenn du sowas willst, benutz stattdessen Greasmonkey oder Selenium, letzteres dann ohne Tabula Rasa zu machen (was man sonst will, um eben Cookies und andere Seiteneffekte zu kontrollieren).
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Sirius3 hat geschrieben: Sonntag 29. Januar 2023, 12:27 Eine Webseite benutzt normalerweise Cookies, um zu wissen ob sich jemand eingeloggt hat oder nicht. Dein requests-Aufruf hat aber nichts mit dem anschließenden webbrowser Aufruf zu tun. Der Browser weiß also nichts davon dass du dich eingeloggt hast.
Hallo Sirius3, kann man das nicht ohne Webbrowser lösen?
Was ist denn die einfachste Methode sich auf einer HTML Seite einzuloggen und dann einfach die Daten zu sehen? Sowas muss doch auch schon millionenfach zB für Facebook erstellt worden sein? Hab auch mal was von import cookiejar gelesen...
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Chrissili: _Du_ öffnest doch in deinem Script den Webbrowser?! Wenn du das nicht möchtest, dann tu das doch nicht? Und Webbrowser sind dafür da, Webinhalte anzuzeigen. Wenn du also Daten sehen willst, sind die doch das Mittel der Wahl?

Was hast du denn _eigentlich_ vor?
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit requests bekommst du doch schon die Daten der Webseite. Die kannst du dann verarbeiten. Der Browser wird nur bei JavaScript-Einsatz nötig.
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Ich will letztlich nur Werte von der url = "https://server.growatt.com/login" auslesen und dafür muss ich "nur" meinen Account eingeben
login = {'val_loginAccount.sameLogin.userNameVal': 'xxx',
'val_loginPwd.sameLogin.pasdVal': 'yyy'} und auf der anschließenden Seite stehen verschiedene Kennzahlen, die ich aus dem Quelltext natürlich ziehen könnte.
Aber wie komme ich da am einfachsten oder elegantesten dran?
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Webbrowser bräuchte ich eigentlich nicht
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Entweder baust du die entsprechenden Aufrufe mit requests komplett nach oder du steuerst mit Selenium einen Browser fern.
Letzteres kann nötig sein, falls Daten per Javascript in die Seite eingefügt werden und sich die entsprechenden Aufrufe nicht abbilden lassen.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt halt schauen, was in `r.content` drinsteht, und ob Du darin die Daten findest, die Du brauchst.
Oder ob Du nach dem Login noch eine weitere Seite abfragen mußt.
Diese Arbeit kann Dir hier niemand abnehmen, weil es sehr unwahrscheinlich ist, dass hier noch jemand dieses growatt kennt.
(Naja, wahrscheinlich das json das https://server.growatt.com/selectPlant/getPlantTotal liefert).
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Also ich verstehe es leider immer noch nicht, habe es mit Selenium probiert:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
browser = webdriver.Firefox()
browser.get("https://server.growatt.com/login")
username = browser.find_element_by_id("val_loginAccount")
password = browser.find_element_by_id("val_loginPwd")
submit = browser.find_element_by_id("loginBtn")
username.send_keys("MeinUsername")
password.send_keys("MeinPasswort")
submit.click()
Aber es passiert nichts und es wird auch nichts in die Felder geschrieben
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Und bei requests:
import requests
pload = {'val_loginAccount':'MeinUsername','val_loginPwd':'MeinPwd'}
r = requests.post("https://Server.growatt.com/login", pload)
print(r.text)

Kommt nur {"result":-2,"msg":....}
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

Chrissili hat geschrieben: Samstag 25. Februar 2023, 23:19 username = browser.find_element_by_id("val_loginAccount")
password = browser.find_element_by_id("val_loginPwd")
submit = browser.find_element_by_id("loginBtn")

Findet er da denn überhaupt irgendwelche bzw. die korrekten Felder?
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Leider eben nicht oder wie meinst du das?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Chrissli: Selenium steuert den Browser fern. Wenn der in ein Feld schreiben soll, dann muss das auch genau so im DOM der Webseite enthalten sein. Sind sie das?
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

grubenfox hat geschrieben: Sonntag 26. Februar 2023, 03:23
Chrissili hat geschrieben: Samstag 25. Februar 2023, 23:19 password = browser.find_element_by_id("val_loginPwd")
Findet er da denn überhaupt irgendwelche bzw. die korrekten Felder?
val_loginPwd findet sich in dem Quelltext der Webseite. Einmal als id von einem Input-Feld. Hätte mich auch extrem gewundert wenn browser.find_element_by_id da nichts finden würde und password dann z.b. None enthält.

Aber dann gibt es da noch 8 andere Fundstellen. Alles in irgendwelchem Javascript. :( Vielleicht klemmt da was.... Darf/kann der Browser unter der Steuerung von Selenium denn auch den JavaScript-code ausführen? Würde bei mir vermutlich zuerst am installierten "NoScript" scheitern.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@grubenfox: Würde es nicht. Da starten keine Plugins. Es sei denn, man konfiguriert das explizit. Die Instanz des Browsers, die Selenium öffnet, hat nichts mit der der Instanz zu tun, die der Benutzer zum Browsen verwendet.

Chrissili: Wie gesagt, ich würde erst einmal schauen, ob die Felder, die du befüllen willst, überhaupt (schon) in dem DOM der Webseite enthalten sind. Und zumidst den Button wirst du auf die Weise nicht finden, denn der hat keine ID.
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

sparrow hat geschrieben: Sonntag 26. Februar 2023, 15:17 Es sei denn, man konfiguriert das explizit.
Eben drum.... wenn Chrissili da nichts (ver)konfiguriert hat, dann sollte das also kein Problem sein.
sparrow hat geschrieben: Sonntag 26. Februar 2023, 15:17 Chrissili: Wie gesagt, ich würde erst einmal schauen, ob die Felder, die du befüllen willst, überhaupt (schon) in dem DOM der Webseite enthalten sind. Und zumidst den Button wirst du auf die Weise nicht finden, denn der hat keine ID.
Aha! Die zwei Mal wo ich mir jetzt den Quelltext der Webseite angeschaut hatte, da hatte ich nur nach den IDs der Felder, die Chrissili im Pythoncode angegeben hatte, geschaut. Aber wenn das Programm den Button nicht findet und der "Klick" auf das Login im Nirvana verschwindet....
Chrissili
User
Beiträge: 42
Registriert: Sonntag 22. Januar 2023, 10:09

Ne ich habe nichts korrigiert, aber es wundert mich eben dass nichts befüllt wird... ist dann der Button falsch definiert oder wo liegt mein Fehler?
Antworten