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)
Anmeldung Website Server Growatt
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.
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).
Hallo Sirius3, kann man das nicht ohne Webbrowser lösen?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.
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...
@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?
Was hast du denn _eigentlich_ vor?
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?
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?
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.
Letzteres kann nötig sein, falls Daten per Javascript in die Seite eingefügt werden und sich die entsprechenden Aufrufe nicht abbilden lassen.
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).
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).
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
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
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":....}
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":....}
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.
@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.
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.
Eben drum.... wenn Chrissili da nichts (ver)konfiguriert hat, dann sollte das also kein Problem sein.
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....