Alexa automatisiert "Fernsteuern"

Hier geht es um grundlegende Diskussionen bezüglich des Alexa Voice Service.
Benutzeravatar

adn77
Beiträge: 63
Registriert: Di 10. Okt 2017, 19:44

Mo 27. Nov 2017, 18:51

terny hat geschrieben: Mo 27. Nov 2017, 18:08 beim Kommando:
date --utc +%FT%T.%3NZ
Kommt folgende Antwort:
2017-11-27T16:39:23.%3NZ
Das ist der Fehler - normalerweise sollte dort ein Timestamp mit Millisekunden 2017-11-27T16:39:23.000Z kommen.
Aber bisher erzwingt Amazon das ja nicht...
terny hat geschrieben: Mo 27. Nov 2017, 18:08 Ich habe beim vergleichen der Skripte gemerkt, dass in der letzten Version in der Zeile OPTS='-k --compressed' das "-k" verschwunden ist.
Die "-k" Option für cURL ist optional und wird nur benötigt, wenn cURL keine Zertifikate überprüfen kann - das ist zunächst nur auf eurer CCU2 der Fall ;)
terny hat geschrieben: Mo 27. Nov 2017, 18:08 Desweiteren ist mir aufgefallen, dass das Skript im Vergleich mit dem Dragonfly-Skript deutlich länger benötigt, bis der Track auf dem Echo abgespielt wird. Ist jedoch nur ein Komfort-Thema...
Das sollte allerdings nur beim ersten Einloggen der Fall sein, denn sonst wird auch nur eine URL aufgerufen.

Alex
Zuletzt geändert von adn77 am Di 28. Nov 2017, 20:55, insgesamt 1-mal geändert.
0 x
Benutzeravatar

Fonzo
Beiträge: 1690
Registriert: Fr 24. Feb 2017, 00:06

Di 28. Nov 2017, 00:41

adn77 hat geschrieben: Sa 25. Nov 2017, 17:50 In meinem Post hier: alexa-allgemein-f14/alexa-automatisiert ... tml#p30994 und im Blog: http://blog.loetzimmer.de/2017/10/amazo ... -echo.html habe ich die verschiedenen Abspielmöglichkeiten erläutert, die mir bisher bekannt sind und wie man an die jeweiligen Parameter kommt.
Ich hätte mal ein paar Fragen zu deinem Vorgehen weil ich gern mein Modul umbauen will und den CRSF automatisch wöchentlich erneuern.
adn77 hat geschrieben: Sa 25. Nov 2017, 17:50 # get first cookie and write redirection target into referer
Wird hier nur die Session ID benötigt oder muss man hier noch mehr auslesen? Die Location ist ja immer gleich die könnte man ja auch fest hinterlegen oder?
adn77 hat geschrieben: Sa 25. Nov 2017, 17:50 # login empty to generate sessiion
Hier übergibts Du die Session ID von vorher und rufst die Location aus die Du im Ersten schritt ausgelesen hast oder? Wozu ist dieser Schritt eigentlich notwendig? Warum kann man nicht gleich sich mit Email und Passwort einloggen?
adn77 hat geschrieben: Sa 25. Nov 2017, 17:50 # login with filled out form
Welche Session ID übergibst Du da jetzt die aus Schritt 1 oder aus Schritt 2? Ist die URL die man aufrufen muss um sich einzuloggen fest oder setzt die sich dann jedes mal anderes zusammen?
adn77 hat geschrieben: Sa 25. Nov 2017, 17:50 # get CSRF
Sind hier nur bestimmte Cookies notwendig die übergeben werden müssen?
0 x
Benutzeravatar

adn77
Beiträge: 63
Registriert: Di 10. Okt 2017, 19:44

Di 28. Nov 2017, 21:52

Hallo Fonzo,
Fonzo hat geschrieben: Di 28. Nov 2017, 00:41 Ich hätte mal ein paar Fragen zu deinem Vorgehen weil ich gern mein Modul umbauen will und den CRSF automatisch wöchentlich erneuern.
Welches Modul (und welche Programmiersprache?)
Es ist nicht nötig, den CSRF wöchentlich zu erneuern - der ist mit dem Cookie verknüpft und wenn die Session abgelaufen ist, muss der gesamte Cookie erneuert werden.

Ich versuche den Ablauf nochmal zu erläutern, wie ich es mir zusammengereimt habe ;)

# get first cookie and write redirection target into referer
Aufruf von alexa.amazon.de (Accept-Language Header erforderlich für die Umleitung auf deutsch/englische Login Seite):
=> erstes Cookie wir geschrieben, Amazon Session hat alexa.amazon.de als Ziel nach erfolgreicher Authentifizierung hinterlegt, Weiterleitung auf Amazon Login Seite (das Umleitungsziel ist der Referer der nächsten Anfrage), die Hidden Felder werden zum Abschicken der Login-Form im nächsten Schritt benötigt.

# login empty to generate sessiion
Aufruf von www.amazon.de/ap/signin (mit Referrer aus dem Location Header der vorigen Anfrage und den Hidden Feldern als POST-Data)
=> Login Vorgang unter /ap/signin schlägt OHNE JAVASCRIPT erwartungsgemäß fehl, Session-Id wird generiert und im Cookie abgelegt, die Hidden Felder werden zum Abschicken der Login-Form im nächsten Schritt benötigt.

# login with filled out form
Aufruf von www.amazon.de/ap/signin (Referrer ist jetzt /ap/signin/<session-id>; Post Data enthält jetzt Login Informationen und Hidden Felder der vorigen Anfrage):
=> Cookie wird um gültige Login Session ergänzt und ist jetzt für den Zugriff ohne Anmeldung gültig, Weiterleitung zur Usprünglichen URLin Schritt 1. Damit ist das Cookie auch bei alexa.amazon.de gültig.

# get CSRF
Damit die XHR-Aufrufe gegen cross-site Attacken gesichert werden, muss für das Cookie noch ein CSRF Token erstellt werden. Dies erfolgt beim ersten Aufruf von einer API auf layla.amazon.de. z.B. /api/language unter Angabe des oben gespeicherten Cookies
=> CSRF wird ins Cookie geschrieben
Fonzo hat geschrieben: Di 28. Nov 2017, 00:41 Sind hier nur bestimmte Cookies notwendig die übergeben werden müssen?
Ehrlich gesagt, weiß ich nicht, welche Einträge der Cookie Datei genutzt werden. Ich übergebe fortan immer die gesamte Cookie-Datei.

Alex
0 x
Benutzeravatar

Fonzo
Beiträge: 1690
Registriert: Fr 24. Feb 2017, 00:06

Mi 29. Nov 2017, 00:04

adn77 hat geschrieben: Di 28. Nov 2017, 21:52 Welches Modul (und welche Programmiersprache?)
Amazon Echo Remote genutzt wird PHP also Curl mit PHP. Quellcode findest Du hier.
adn77 hat geschrieben: Di 28. Nov 2017, 21:52 Es ist nicht nötig, den CSRF wöchentlich zu erneuern - der ist mit dem Cookie verknüpft und wenn die Session abgelaufen ist, muss der gesamte Cookie erneuert werden.
Wie oft schätz Du denn das die Session abläuft? ich würde halt ungern jedes mal die ganze Prozedur aufrufen sondern eigentlich nur den Cookie erneuern bevor er abläuft. Der erste Cookie läuft bis 2037 an dem kann es nicht liegen daher muss das einer der anderen Cookies sein.
adn77 hat geschrieben: Di 28. Nov 2017, 21:52 # get first cookie and write redirection target into referer
Aufruf von alexa.amazon.de (Accept-Language Header erforderlich für die Umleitung auf deutsch/englische Login Seite):
=> erstes Cookie wir geschrieben, Amazon Session hat alexa.amazon.de als Ziel nach erfolgreicher Authentifizierung hinterlegt, Weiterleitung auf Amazon Login Seite (das Umleitungsziel ist der Referer der nächsten Anfrage), die Hidden Felder werden zum Abschicken der Login-Form im nächsten Schritt benötigt.
Ok den ersten Cookie bzw. die Session ID lese ich aus. Die Location im Header ist doch aber fest oder?
Würde es da nicht ausreichen einfach auswählen zu lassen ob der User z.B. die Deutsche oder Englische Seite aufrufen will und die URL kann man dann ja fest hinterlegen die im weiteren Schritt aufgerufen wird.

Diese sollte doch an sich immer bei der deutschen Seite

Code: Alles auswählen

https://www.amazon.de/ap/signin?showRmrMe=1&openid.return_to=https%3A%2F%2Falexa.amazon.de%2F&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=amzn_dp_project_dee_de&openid.mode=checkid_setup&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&
sein oder?

Den Header werte ich aus gibt bei mir ein Array

Code: Alles auswählen

Array
(
    [status] => HTTP/1.1 302 Found
    [x-amzn-RequestId] => ce69f64f-d48c-11e7-81e4-bba118075a27
    [Location] => https://www.amazon.de/ap/signin?showRmrMe=1&openid.return_to=https%3A%2F%2Falexa.amazon.de%2F&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=amzn_dp_project_dee_de&openid.mode=checkid_setup&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&
    [Content-Length] => 0
    [Date] => Tue, 28 Nov 2017 22:38:08 GMT
    [Server] => Server
    [Content-Type] => text/html;charset=UTF-8
    [Strict-Transport-Security] => max-age=47474747; includeSubDomains; preload
    [x-ua-compatible] => IE=edge
    [Pragma] => No-cache
    [Cache-Control] => max-age=0, no-cache, no-store, must-revalidate
    [Expires] => Thu, 01 Jan 1970 00:00:00 GMT
    [X-Frame-Options] => SAMEORIGIN
    [P3P] => policyref="http://www.amazon.de/w3c/p3p.xml",CP="CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC "
    [Vary] => user-agent
    [Transfer-Encoding] =>  chunked
    [Connection] => Transfer-Encoding
)
Welche Hidden Felder meinst Du denn da oder habe ich da was übersehen was ich noch auslesen muss?
adn77 hat geschrieben: Di 28. Nov 2017, 21:52 # login empty to generate sessiion
Aufruf von www.amazon.de/ap/signin (mit Referrer aus dem Location Header der vorigen Anfrage und den Hidden Feldern als POST-Data)
=> Login Vorgang unter /ap/signin schlägt OHNE JAVASCRIPT erwartungsgemäß fehl, Session-Id wird generiert und im Cookie abgelegt, die Hidden Felder werden zum Abschicken der Login-Form im nächsten Schritt benötigt.
Hier ist der Referrer die Location aus Schritt 1 aus dem Header s.o. hätte ich da noch etwas an der Loctaion ergänzen müssen oder ist das 1:1 das was im Header stand? Wie ich an die Hidden Felder ran komme muss ich mal schauen. Sind die im Header?
adn77 hat geschrieben: Di 28. Nov 2017, 21:52 # login with filled out form
Aufruf von www.amazon.de/ap/signin (Referrer ist jetzt /ap/signin/<session-id>; Post Data enthält jetzt Login Informationen und Hidden Felder der vorigen Anfrage):
=> Cookie wird um gültige Login Session ergänzt und ist jetzt für den Zugriff ohne Anmeldung gültig, Weiterleitung zur Usprünglichen URLin Schritt 1. Damit ist das Cookie auch bei alexa.amazon.de gültig.
Hier fehlen mir wohl die Hidden Felder da muss ich schauen wie ich da ran komme. Vorher habe ich ja die Cookie Daten einzeln ausgelesen, ab hier würdest Du dann den Cookie im Buffer zwischen speichern und diesen dann weiter zur Authentifizierung verwenden.
adn77 hat geschrieben: Di 28. Nov 2017, 21:52 # get CSRF
Damit die XHR-Aufrufe gegen cross-site Attacken gesichert werden, muss für das Cookie noch ein CSRF Token erstellt werden. Dies erfolgt beim ersten Aufruf von einer API auf layla.amazon.de. z.B. /api/language unter Angabe des oben gespeicherten Cookies
=> CSRF wird ins Cookie geschrieben
Es gibt ja unterschiedliche CSRF z.B. für TuneIn oder Amazon Music muss ich dann also eine spezifische URL aufrufen oder bekomme ich automatisch alle Cookies nach dem ersten Aufruf von layla.amazon.de zurück und speichere diese dann ab sofort im Buffer?
adn77 hat geschrieben: Di 28. Nov 2017, 21:52
Fonzo hat geschrieben: Di 28. Nov 2017, 00:41 Sind hier nur bestimmte Cookies notwendig die übergeben werden müssen?
Ehrlich gesagt, weiß ich nicht, welche Einträge der Cookie Datei genutzt werden. Ich übergebe fortan immer die gesamte Cookie-Datei.
Ok dann werde ich also alle Cookies einfach komplett wegspeichern bevor ich verscuhe die Cookies zu zerlegen bzw. nur bestimmte Dinge zu verwerten. Problem sehe ich momentan noch bei den Hidden Feldern, da muss ich mal schauen vielleicht hast Du da ja noch einen Tipp falls Du Dich mit PHP auskennen solltest.
0 x
Benutzeravatar

Cliff
Beiträge: 21
Registriert: Di 28. Feb 2017, 19:01
Wohnort: Itzehoe
Vorhandene Echos: 0
Vorhandene Echo Dots: 5

Mi 29. Nov 2017, 15:10

Mal eine Frage:

Hat schon mal jemand versucht die Fernsteuerung mit Hilfe eines ESP8266 (Arduino) hin zu bekommen?
Hier steht einem ein Werkzeug wie Curl ja nicht zur Verfügung...

Bastel gerade selber da ein wenig herum, stehe aber noch ganz am Anfang.
0 x
Benutzeravatar

Fonzo
Beiträge: 1690
Registriert: Fr 24. Feb 2017, 00:06

Mi 29. Nov 2017, 15:28

Cliff hat geschrieben: Mi 29. Nov 2017, 15:10 Hat schon mal jemand versucht die Fernsteuerung mit Hilfe eines ESP8266 (Arduino) hin zu bekommen?
Hier steht einem ein Werkzeug wie Curl ja nicht zur Verfügung...
Da würde ich dann eher einen Raspberry nehmen da kannst Du ja Curl nutzten.
0 x
Benutzeravatar

adn77
Beiträge: 63
Registriert: Di 10. Okt 2017, 19:44

Mi 29. Nov 2017, 19:43

Fonzo hat geschrieben: Mi 29. Nov 2017, 00:04 Amazon Echo Remote genutzt wird PHP also Curl mit PHP. Quellcode findest Du hier.
Ok, dann verwendest du also auch cURL - da kann ich dir nur die Cookie Verwaltung ans Herz legen, da brauchst du dir keine Gedanken machen, was wie lange läuft und wo steht.
Fonzo hat geschrieben: Mi 29. Nov 2017, 00:04 Wie oft schätz Du denn das die Session abläuft? ich würde halt ungern jedes mal die ganze Prozedur aufrufen sondern eigentlich nur den Cookie erneuern bevor er abläuft. Der erste Cookie läuft bis 2037 an dem kann es nicht liegen daher muss das einer der anderen Cookies sein.
Der Cookie ist ja einer Session bei Amazon zugeordnet, immer wenn die ihre Sessions aufräumen, wird der Cookie ungültig. Ich mache das auf meinen Servern normalerweise alle 6 Stunden (Inaktivität der Session).
Fonzo hat geschrieben: Mi 29. Nov 2017, 00:04 Ok den ersten Cookie bzw. die Session ID lese ich aus. Die Location im Header ist doch aber fest oder?
Würde es da nicht ausreichen einfach auswählen zu lassen ob der User z.B. die Deutsche oder Englische Seite aufrufen will und die URL kann man dann ja fest hinterlegen die im weiteren Schritt aufgerufen wird.

Diese sollte doch an sich immer bei der deutschen Seite

Code: Alles auswählen

https://www.amazon.de/ap/signin?showRmrMe=1&openid.return_to=https%3A%2F%2Falexa.amazon.de%2F&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=amzn_dp_project_dee_de&openid.mode=checkid_setup&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&
sein oder?
Momentan mag das stimmen, aber evtl. ändert Amazon daran ja auch etwas, daher nutzen wir doch einfach die Weiterleitungsmöglichkeiten von cURL (-L). Die Location braucht man eim nächsten Schritt allerdings als Referer.
Fonzo hat geschrieben: Mi 29. Nov 2017, 00:04 Den Header werte ich aus gibt bei mir ein Array
Welche Hidden Felder meinst Du denn da oder habe ich da was übersehen was ich noch auslesen muss?
Das sind die Form-Felder der Antwortseite. Die sind mit Werten vorbelegt und müssen als Post-Data mitgesendet werden. Theoretisch brauchst du ein Parse-HTML Modul dafür, oder du machst mit "preg_replace" eine übersetzung meiner "sed" Kommandos.
Fonzo hat geschrieben: Mi 29. Nov 2017, 00:04 Hier ist der Referrer die Location aus Schritt 1 aus dem Header s.o. hätte ich da noch etwas an der Loctaion ergänzen müssen oder ist das 1:1 das was im Header stand? Wie ich an die Hidden Felder ran komme muss ich mal schauen. Sind die im Header?
Der Location Header wird zum Referer - wenn man die HTML Seite sowieso parst, kann man daraus auch die ACTION-URL für die Form extrahieren - das ist bei meiner Methode eine kleine Unsauberkeit... ;) Ich lege die ACTION-URL auf "www.amazon.de/ap/signin" fest. Wegen der Hidden-Felder s.o.
Fonzo hat geschrieben: Mi 29. Nov 2017, 00:04 Hier fehlen mir wohl die Hidden Felder da muss ich schauen wie ich da ran komme. Vorher habe ich ja die Cookie Daten einzeln ausgelesen, ab hier würdest Du dann den Cookie im Buffer zwischen speichern und diesen dann weiter zur Authentifizierung verwenden.
Für die Cookie-Verwaltung unbedingt cURL nutzen! Man muss allerdings die Session-Id aus dem Cookie auslesen für diesen Schritt. Die Post-Daten (email,password) müssen über die Hidden-Form-Daten der Antwort aus dem vorigen Schritt ergänzt werden.
Fonzo hat geschrieben: Mi 29. Nov 2017, 00:04Es gibt ja unterschiedliche CSRF z.B. für TuneIn oder Amazon Music muss ich dann also eine spezifische URL aufrufen oder bekomme ich automatisch alle Cookies nach dem ersten Aufruf von layla.amazon.de zurück und speichere diese dann ab sofort im Buffer?
Solange die URL layla.amazon.de ist, sollte der CSRF der Gleiche sein. Zusätzlich zum Cookie muss er allerdings noch im Header mitgesendet werden => d.h. man muss ihn ebenfalls aus der Cookie Datei auslesen
Fonzo hat geschrieben: Di 28. Nov 2017, 00:41 Ok dann werde ich also alle Cookies einfach komplett wegspeichern bevor ich verscuhe die Cookies zu zerlegen bzw. nur bestimmte Dinge zu verwerten. Problem sehe ich momentan noch bei den Hidden Feldern, da muss ich mal schauen vielleicht hast Du da ja noch einen Tipp falls Du Dich mit PHP auskennen solltest.
s.o. PHP DOMDocument und getElementsByTagName('input') oder per preg_grep/preg_replace meine "grep/sed" Abfolge nachbauen.

Alex
Cliff hat geschrieben: Mi 29. Nov 2017, 15:10 Hat schon mal jemand versucht die Fernsteuerung mit Hilfe eines ESP8266 (Arduino) hin zu bekommen?
Hier steht einem ein Werkzeug wie Curl ja nicht zur Verfügung...
Was möchtest du denn erreichen? Ich denke, dass die String-Bearbeitung nicht unbedingt zu den Stärken des ESP8266 gehört. :')
Wenn du nicht DER C(++) Guru auf der Welt bist (ich bin's nicht), dann halte ich das Vorhaben zum Scheitern verurteilt.

Es gibt wahrscheinlich in jedem Haushalt irgendein Gerät, was eine Shell und cURL anbieten kann - damit müsste der ESP zumindest nur noch einfache HTTP-Requests absenden.

Alex
0 x
Benutzeravatar

Cliff
Beiträge: 21
Registriert: Di 28. Feb 2017, 19:01
Wohnort: Itzehoe
Vorhandene Echos: 0
Vorhandene Echo Dots: 5

Do 30. Nov 2017, 09:30

Was möchtest du denn erreichen?
Es gibt wahrscheinlich in jedem Haushalt irgendein Gerät, was eine Shell und cURL anbieten kann - damit müsste der ESP zumindest nur noch einfache HTTP-Requests absenden
Ist hier vielleicht (?) ein wenig Off Topic, aber ich möchte Alexa per Bewegungsmelder dazu überreden einen Radiosender zu starten, bzw. zu stoppen (Badezimmer). Weitere Befehle benötige ich (wahrscheinlich) nicht. Die Variante mit der Lautsprecherausgabe eines Befehls halte ich für nicht so elegant.
Irgendwie sperre ich mich noch davor nur für einen Bewegungsmelder einen PI abzustellen (Bei ca. 2W Ruheleistung).
Andererseits würde das dann natürlich noch andere Möglichkeiten eröffnen (Die ich aber im Moment noch nicht kenne/ brauche ;) ).

Sonstige brauchbare Geräte gibt es bei mir im Haushalt tatsächlich nicht. Meine Fritzbox ist gebrandet, bei der HUE- Bridge weiss ich nicht ob man da auch an das OS heran kann (Bzw. was das für Eines ist) und Homematic habe ich vor ca. einem Jahr rausgeschmissen nachdem sich die Heizkörperregler ständig festgefahren haben.
Vielleicht sollte ich meinen alten Linksys- Router reaktivieren ;)
0 x
Benutzeravatar

Fonzo
Beiträge: 1690
Registriert: Fr 24. Feb 2017, 00:06

Do 30. Nov 2017, 09:41

Cliff hat geschrieben: Do 30. Nov 2017, 09:30 Ist hier vielleicht (?) ein wenig Off Topic, aber ich möchte Alexa per Bewegungsmelder dazu überreden einen Radiosender zu starten, bzw. zu stoppen (Badezimmer). Weitere Befehle benötige ich (wahrscheinlich) nicht. Die Variante mit der Lautsprecherausgabe eines Befehls halte ich für nicht so elegant.
Irgendwie sperre ich mich noch davor nur für einen Bewegungsmelder einen PI abzustellen (Bei ca. 2W Ruheleistung).
Andererseits würde das dann natürlich noch andere Möglichkeiten eröffnen (Die ich aber im Moment noch nicht kenne/ brauche ;) ).
Keine Ahnung ob man das auch anders lösen kann und wegen nur einem Bewegungsmelder ist das sicher etwas viel Aufwand, allerdings hat man ja dann wie Du schon sagst mit einem Raspberry auch ganz andere Möglichkeiten, auch wenn Dir jetzt im Moment nichts einfällt, das kommt dann wenn man weis das es möglich ist, da kannst Du Dir in den dunklen Winterabenden jeden Abend was anderes ausdenken ;) .
0 x
Benutzeravatar

terny
Beiträge: 14
Registriert: Do 27. Apr 2017, 12:45

Do 30. Nov 2017, 22:47

Hallo Alex,

bei mir funktioniert das Skript soweit gut. Mich hat jedoch Dragonfly gerade darauf hingewiesen, dass scheinbar bei jedem Aufruf das Cookie neu geholt wird. Bei mir sehe ich auch am Änderungsdatum jeweils eine ständige Erneuerung pro Befehl. Ist dies so in deinem Sinne?
Dies würde vielleicht auch die teilweise langsame Reaktion auf Befehle erklären?


Gruß
Terny
0 x
Antworten

Zurück zu „Alexa Allgemein“

  • Information