Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
OK. kein Stress.
kämpfe zurzeit an mehreren Fronten mit Software-Tücken.
Da wird mal wieder deutlich, wie sorgfältig Software entwickelt wird, aber auch, wie anfällig solche Systeme sind.
an alle die hier vieleicht was tun möchten - ich habe mal die OAuth-Identifizierung durchgespielt, mit folgendem Code-Snippet bekommt man einen access/refresh-Token. Alles "pure-requests".
Die Daten im Kopf entsprechend den Angaben in der Home-Connect-Developer Konsole eintragen. Ich hatte zum testen als Redirect-URL "https://www.smarthomeng.de" angegeben. Die Redirect-URL muss beim erstellen der Applikation in der Cloud von Anfang an korrekt sein. Nachträglich ändern geht schief da diese irgendwie in Client-ID und Client-Secret "gehasht" wird. Beim Ändern wird nicht neu berechnet, d.h. ClientId und ClientSecret passen nicht zur redirect-URI.
Ich habe den Code noch um eine Funktion für Token-Refresh ergänzt.
Vielleicht kann es ja jemand brauchen
Code:
import json
import requests
import urllib
import uuid
import time
######################################
# Your Information from HC-Cloud
######################################
hc_ClientId = '<YOUR_CLIENT_ID>'
hc_email = '<YOUR_MAIL_ADRESS>'
hc_pwd = '<YOUR_PASSWORD>'
hc_Scope = '<YOUR_SCOPE>' # -> "IdentifyAppliance Monitor Control Images Settings" for all
hc_ClientSecret = '<YOUR_CLIENT_SECRET>'
hc_redirect_URI = '<YOUR_REDIRECT_URL>
def getToken():
myHeader={
'Host' : 'api.home-connect.com',
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language' : 'de,en-US;q=0.7,en;q=0.3',
'Accept-Encoding' : 'gzip, deflate, br',
'Content-Type' : 'application/x-www-form-urlencoded',
'Host' : 'api.home-connect.com'
}
# Login to get a Code for getting a Token
myData = {'client_id' : hc_ClientId,
'redirect_uri' : hc_redirect_URI,
'response_type' : 'code',
'scope' : hc_Scope,
'state' : uuid.uuid4().hex
}
postfields = urllib.parse.urlencode(myData)
mySession = requests.session()
myResponse = mySession.get('https://api.home-connect.com/security/oauth/authorize',params=postfields,headers=myHeader)
if myResponse.status_code != 200:
print ('cold not get Login-Form : ' + myResponse.status_code)
myLines = (myResponse.content.decode()).split("\n")
for myString in myLines:
if 'hidden' in myString:
myArray = myString.split(" ")
if 'name="sessionId"' in myArray:
mySessionId=myArray[(myArray.index('name="sessionId"')+1)].replace("/>","").split("=")[1].replace('"','')
if 'name="sessionData"' in myArray:
mySessionData=myArray[(myArray.index('name="sessionData"')+1)].replace("/>","").split('"')[1]
if 'name="client_id"' in myArray:
myClientId=myArray[(myArray.index('name="client_id"')+1)].replace("/>","").split("=")[1].replace('"','')
if 'name="region"' in myArray:
myRegion=myArray[(myArray.index('name="region"')+1)].replace("/>","").split("=")[1].replace('"','')
if 'name="environment"' in myArray:
myEnvironment=myArray[(myArray.index('name="environment"')+1)].replace("/>","").split("=")[1].replace('"','')
myData = {
'sessionId' : mySessionId,
'sessionData' : mySessionData,
'aborted' : False,
'client_id' : myClientId,
'accept_language' : 'de',
'region' : myRegion,
'environment' : myEnvironment,
'email' : hc_email,
'password' : hc_pwd
}
postfields = urllib.parse.urlencode(myData)
myResponse = mySession.post('https://api.home-connect.com/security/oauth/login',data=postfields,headers=myHeader)
if myResponse.status_code != 200:
print ('cold not Login : ' + str(myResponse.status_code))
myData = {
'sessionId' : mySessionId,
'aborted' : False,
'accept_language' : 'de',
'client_id' : myClientId,
'email' : hc_email,
'region' : myRegion,
'environment' : myEnvironment,
'scope' : hc_Scope
}
postfields = urllib.parse.urlencode(myData)
myResponse = requests.post('https://api.home-connect.com/security/oauth/grant',data=postfields,headers=myHeader,allow_redirects=False)
if myResponse.status_code != 302:
print ('cold not get grant-access : ' + str(myResponse.status_code))
myLocation = urllib.parse.unquote(myResponse.headers['Location'])
myCode = myLocation.split("?")[1].split("&")[0].split(("="))[1]
my_grant_type = myLocation.split("?")[1].split("&")[2].split(("="))[1]
my_state = myLocation.split("?")[1].split("&")[1].split(("="))[1]
# Now get the Token
myData = {
'client_id' : myClientId,
'client_secret' : hc_ClientSecret,
'redirect_uri' : hc_redirect_URI,
'grant_type' : my_grant_type,
'code' : myCode
}
postfields = urllib.parse.urlencode(myData)
myResponse = requests.post('https://api.home-connect.com/security/oauth/token',data=postfields,headers=myHeader,allow_redirects=False)
if myResponse.status_code != 200:
print ('cold not get access-Token : ' + str(myResponse.status_code))
else:
myBearerDict = json.loads(myResponse.content.decode())
myAccessToken = myBearerDict['access_token']
myRefreshToken = myBearerDict['refresh_token']
myExperition = myBearerDict['expires_in']
myIdToken = myBearerDict['id_token']
myTokenType = myBearerDict['token_type']
print ('Got Access/Refresh-Token - Acces-Token : ' + myAccessToken )
return myAccessToken,myRefreshToken
def get_refresh_Token(refresh_Token):
#grant_type=refresh_token&refresh_token={refresh_token}&client_secret={client_secret}
myHeader={
'Host' : 'api.home-connect.com',
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language' : 'de,en-US;q=0.7,en;q=0.3',
'Accept-Encoding' : 'gzip, deflate, br',
'Content-Type' : 'application/x-www-form-urlencoded',
'Host' : 'api.home-connect.com'
}
myData = {
'grant_type' : 'refresh_token',
'refresh_token' : refresh_Token,
'client_secret' : hc_ClientSecret
}
postfields = urllib.parse.urlencode(myData)
myResponse = requests.post('https://api.home-connect.com/security/oauth/token',data=postfields,headers=myHeader,allow_redirects=False)
if myResponse.status_code != 200:
print ('cold not get new access-Token : ' + str(myResponse.status_code))
else:
myBearerDict = json.loads(myResponse.content.decode())
myAccessToken = myBearerDict['access_token']
myRefreshToken = myBearerDict['refresh_token']
return myAccessToken, myRefreshToken
if __name__ == '__main__':
myToken, myRefreshToken = getToken()
time.sleep(10)
myNewToken, myNewRefreshToken = get_refresh_Token(myRefreshToken)
print ('new Token : ' + myNewToken)
Viele Grüsse
Andre
Zuletzt geändert von AndreK; 31.01.2022, 22:20.
Grund: Code für Refresh-Token ergänzt
Zur Erstellung des initialen "config.json" benötigt man User+Pass+Cloud, und anschließend eben nicht mehr :-)
Ein Beispiel-Script schiebt den Status dann via MQTT weiter.
Ein kleiner Vorgeschmack, welche Infos sichtbar sind.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar