NEWS
Script "AlexaLogOn": Alexa LogOn mit User/Pass + 2FA Code
-
Letzte Woche habe ich hier im Forum ein Script zum Schalten des Lichts veröffentlicht, womit automatisch erkannt wird, welches Echo-Gerät angesprochen wurde - und dann nur die entsprechenden Lichter geschaltet werden (siehe http://forum.iobroker.net/viewtopic.php?f=37&t=9115). Mittlerweile habe ich mehrere Scripte, die Abhängig vom angesprochenen Echo, verschiedene Funktionen/Geräte in verschiedenen Räumen steuern (neben dem Licht, zum Beispiel Fernseher). Um das zu Realisieren wird ein Cookie gebraucht, um sich per API in seinen Account einwählen zu können.
Das Raussuchen des Cookies ist nicht unbedingt schwer, aber doch irgendwie aufwändig und fehleranfällig. Außerdem wollte ich es nicht in jedes neues Script kopieren müssen (und wieder Ändern, wenn es abgelaufen ist).
Also habe ich gesucht, wie man das Einloggen und Erstellen des Cookies automatisieren könnte. Ich hatte gehofft, dass es da schon irgendwas für node js gibt, aber habe nicht das richtige für den Zweck hier gefunden. Also habe ich mir nochmal genauer das Script angeschaut, dass ich letzte Woche schon in meinem Post angesprochen hatte:
https://forum.fhem.de/index.php/topic,77458.0.html.
Der User Markus M. hat dort in Perl die Logonsequenz für einein Amazonaccount mit https Aufrufen nachgebaut. Ich habe dieses Script nun nach JavaScript portiert und an die Gegebenheiten in ioBroker angepasst. Soll heißen, am Ende wird das Ergebnis (Cookie & CSRF) in zwei Datenpunkte geschrieben.
Jetzt auch mit Unterstützung von 2 Factor Authentication Codes und Cron-Job jeden Tag 24 Uhr zur Überprüfung, ob Cookie noch valide ist. Außerdem gibt es einen Datenpunkt, der angibt (true/false), ob Cookie valide ist. Das Handling von Instanznummern wird jetzt automatisch vorgenommen. Das Script unterstützt jetzt auch Sonderzeichen im Passwort.
! ```
`//------------------------------------------------------------------------------
// AlexaLogOn
//------------------------------------------------------------------------------
// Dieses Script ermöglicht es das Cookie für den Amazon-Account mit der Angabe
// von User und Passwort (und falls konfiguriert, 2FA code) erzeugen zu lassen.
// Das Cookie wird dann in einen Datenpunkt geschrieben, wo es für andere Skripe
// zugriffbar ist.
//
// Skript arbeitet unabhängig vom Cloud Adapter.
//
// Version: v0.7
// Feedback: http://forum.iobroker.net/viewtopic.php?f=37&t=9237
! //------------------------------------------------------------------------------
// Changelog:
// v0.7: Sonderzeichenunterstützung für user/pass
// v0.6: Automatische Anpassung der Instanznummer
// v0.5: Datenpunkt für Cookie Status
// v0.4: Cron schedule
// v0.3: 2 Factor Authentication
// v0.2: CSRF wird berechnet
// v0.1: initialer Release
! //------------------------------------------------------------------------------
// Einrichtung:
// 1. User und Passwort (und wenn konfiguriert, 2FA Code) eintragen.
//
// WARNUNG: Die Login-Daten sollten nicht in diesem Script gespeichert werden,
// sondern nur für die einmalige Ausführung eingetragen werden. Sobald
// das Cookie in dem Datenpunkt erzeugt ist, sollten die Eingaben in
// den beiden folgenden Felder wieder gelöscht werden.
// Erst bei der nächsten Ausführung (z.B. wenn das Cookie
// abgelaufen ist) sollten sie wieder neu eintragen werden.
! var username = "";
var password = "";
var twofacode = "";
! // 2. Datenpunkte konfigurieren (optional)
//
// Wenn gewünscht, Pfad und Name nach eigenen Vorstellungen anpassen
// ("javascript.#instanznummer#." nicht angeben, wird automatisch berechnet).
var idAlexaLogonCookie = 'productive.alexalogon.cookie';
var forecreation = false;
! // Wenn gewünscht, Name und desc für den Datenpunkt anpassen.
createState(idAlexaLogonCookie, instance, forecreation, {
name: 'Alexa LogOn Cookie',
desc: 'Alexa LogOn Cookie',
type: 'string',
unit: '',
role: 'value'
});
! // Wenn gewünscht, Pfad und Name nach eigenen Vorstellungen anpassen.
// ("javascript.#instanznummer#." nicht angeben, wird automatisch berechnet).
var idAlexaLogonCSRF = 'productive.alexalogon.csrf';
! // Wenn gewünscht, Name und desc für den Datenpunkt anpassen.
createState(idAlexaLogonCSRF, instance, forecreation, {
name: 'Alexa LogOn CSRF',
desc: 'Alexa LogOn CSRF',
type: 'string',
unit: '',
role: 'value'
});
! // Wenn gewünscht, Pfad und Name nach eigenen Vorstellungen anpassen.
// ("javascript.#instanznummer#." nicht angeben, wird automatisch berechnet).
var idAlexaLogonCookieValid = 'productive.alexalogon.cookievalid';
! // Wenn gewünscht, Name und desc für den Datenpunkt anpassen.
createState(idAlexaLogonCookieValid, instance, forecreation, {
name: 'Alexa LogOn Cookie Valid',
desc: 'Alexa LogOn Cookie Valid',
type: 'state',
unit: '',
role: 'switch.active'
});
! // Ende der Einrichtung.
// Nachfolgend der eigentliche Source Code des Scripts.
//------------------------------------------------------------------------------
! //------------------------------------------------------------------------------
// Global Variables
! var request = require('request');
! var logOn = true;
! var locationURL;
var formParameter;
var postData = "";
var sessionID;
var cookieStr = "";
! var cronStr = "0 0 * * *";
! //------------------------------------------------------------------------------
// Start der Script-Logik
! // Construct fullnames of data points
idAlexaLogonCookie = 'javascript.' + instance + '.' + idAlexaLogonCookie;
idAlexaLogonCSRF = 'javascript.' + instance + '.' + idAlexaLogonCSRF;
idAlexaLogonCookieValid = 'javascript.' + instance + '.' + idAlexaLogonCookieValid;
! // Cron Schedule
schedule(cronStr, main);
! // Sofortstart
setTimeout(main, 1000);
! function main() {
! if(logOn) log("Start LogOn Process");
! var storedCookie = "" + getState(idAlexaLogonCookie).val;
! if (storedCookie !== null && storedCookie !== "") {
storedCookie = storedCookie.replace(/\/g, "");
checkIfCookieIsStillValid(storedCookie);
} else {
logIntoAmazonAccount();
}
! }
! function checkIfCookieIsStillValid(cookie) {var options = { url : "https://layla.amazon.de/api/bootstrap?version=0", method : "GET", followAllRedirects : true, headers : { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Content-Type': 'text/plain', 'Accept-Language': 'de,en', 'DNT' : '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests' : '1', 'Referer' : 'https://layla.amazon.de/spa/index.html/', 'Cookie' : cookie } };
! var req = request.get(options, function(err, res, body){
var bodyTrim = res.body.trim();
if(logOn) log("First Char: " + bodyTrim.startsWith("{"));
if(logOn) log("Auth String Exists: " + bodyTrim.indexOf("authenticated"));
if(bodyTrim.startsWith("{") === false && bodyTrim.indexOf("authenticated") == -1) {
setState(idAlexaLogonCookie, "");
setState(idAlexaLogonCSRF, "");
setState(idAlexaLogonCookieValid, "false");
logIntoAmazonAccount();
return;
}var bodyObject = JSON.parse(res.body); if(bodyObject.authentication.authenticated === true) { log("Stored Cookie is still valid. No LogOn Required."); } });
! }
! function logIntoAmazonAccount() {var options = { url : "https://layla.amazon.de/", method : "GET", followRedirect : false, headers : { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Content-Type': 'text/plain', 'Accept-Language': 'de,en', 'DNT' : '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests' : '1' } };
! if(username === "" || password === "") {
if(logOn) log("User or password variable empty.");
return;
}locationURL = ""; postData = ""; sessionID = ""; cookieStr = "";
! request.get(options, function(err, res, body){
if(logOn) log("Referer Location: " + JSON.stringify(res.headers.location));
locationURL = res.headers.location;getRedirectCookieAndLogonParameter(); });
}
! function getRedirectCookieAndLogonParameter() {
var options = { url : "https://layla.amazon.de/", method : "GET", followAllRedirects : true, headers : { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Content-Type': 'text/plain', 'Accept-Language': 'de,en', 'DNT' : '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests' : '1' } };
! formParameter = [
"appActionToken",
"appAction",
"showRmrMe",
"openid.return_to",
"prevRID",
"openid.identity",
"openid.assoc_handle",
"openid.mode",
"failedSignInCount",
"openid.claimed_id",
"pageId",
"openid.ns",
"showPasswordChecked"
];
! request.get(options, function(err, res, body){
var setCookies = res.headers['set-cookie'];
if(logOn) log("Set-Cookies: " + JSON.stringify(setCookies));
if(logOn) log("Request: " + JSON.stringify(res.request));for(var i = 0; i < setCookies.length; i++) { var setCookie = JSON.stringify(setCookies[i]);
! if(setCookie.indexOf("1970") == -1){
var setCookieArray = setCookie.match(/"(.*) Domain=|Expires=|Version=/);
cookieStr = cookieStr + setCookieArray[1] + " ";
}
}
cookieStr = cookieStr.replace(/\/g, "");
if(logOn) log("Cookie Part 1: " + cookieStr);for(i = 0; i < formParameter.length; i++) { var regex = eval("/type=\"hidden\" name=\"" + formParameter[i] + "\" value=\"(.*)\"/"); var parameterValueArray = regex.exec(body); var parameterValue = parameterValueArray[1]; parameterValueArray = parameterValue.match(/^(.*?)"/); if (parameterValueArray !== null) { parameterValue = parameterValueArray[1]; } if(logOn) log("Parameter Value: " + parameterValue); postData = postData + formParameter[i] + "=" + parameterValue + "&"; } if(logOn) log("LogOn Parameter: " + postData); postLogonParameters(); });
}
! function postLogonParameters() {
var options = { url : "https://www.amazon.de/ap/signin?" + postData, method : "POST", followAllRedirects : true, headers : { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Content-Type': 'text/plain', 'Accept-Language': 'de,en', 'DNT' : '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests' : '1', 'Referer' : locationURL, 'Cookie' : cookieStr } };
! request.post(options, function(err, res, body){
var setCookies = res.headers['set-cookie'];
if(logOn) log("Set-Cookies: " + JSON.stringify(setCookies));var cookieStrTemp = ""; for(var i = 0; i < setCookies.length; i++) { var setCookie = JSON.stringify(setCookies[i]);
! if(setCookie.indexOf("1970") == -1){
var setCookieArray = setCookie.match(/"(.) Domain=|Expires=|Version=/);
cookieStrTemp = cookieStrTemp + setCookieArray[1] + " ";
var cookieStrTempArray = cookieStrTemp.match(/ubid-acbde=(.);/);
sessionID = cookieStrTempArray[1];
}
}
cookieStrTemp = cookieStrTemp.replace(/\/g, "");
cookieStr = cookieStr + cookieStrTemp;
if(logOn) log("Cookie Part 2: " + cookieStr);postdata = ""; for(i = 0; i < formParameter.length; i++) { var regex = eval("/type=\"hidden\" name=\"" + formParameter[i] + "\" value=\"(.*)\"/"); var parameterValueArray = regex.exec(body); var parameterValue = parameterValueArray[1]; parameterValueArray = parameterValue.match(/^(.*?)"/); if (parameterValueArray !== null) { parameterValue = parameterValueArray[1]; } if(logOn) log("Parameter Value: " + parameterValue); postData = postData + formParameter[i] + "=" + parameterValue + "&"; } if(logOn) log("LogOn Parameter: " + postData); postUserAndPassword(); });
}
! function postUserAndPassword() {
var options = { url : "https://www.amazon.de/ap/signin?" + postData + "email=" + encodeURIComponent(username) + "&password=" + encodeURIComponent(password) + twofacode, method : "POST", followRedirect : false, headers : { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Content-Type': 'text/plain', 'Accept-Language': 'de,en', 'DNT' : '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests' : '1', 'Referer' : 'https://www.amazon.de/ap/signin/' + sessionID, 'Cookie' : cookieStr } };
! request.post(options, function(err, res, body){
var setCookies = res.headers['set-cookie'];
if(logOn) log("Set-Cookies: " + JSON.stringify(setCookies));var cookieStrTemp = ""; for(var i = 0; i < setCookies.length; i++) { var setCookie = JSON.stringify(setCookies[i]);
! if(setCookie.indexOf("1970") == -1){
setCookie = setCookie.replace(/Version=1; /g, "");
var setCookieArray = setCookie.match(/"(.*) Domain=|Expires=|Version=/);
if(cookieStr.indexOf(setCookieArray[1]) == -1) {
cookieStrTemp = cookieStrTemp + setCookieArray[1] + " ";
}
}
}
cookieStrTemp = cookieStrTemp.replace(/\/g, "");
cookieStr = cookieStr + cookieStrTemp;
if(logOn) log("Cookie Part 3: " + cookieStr);signIntoAlexa(); });
}
! function signIntoAlexa() {
var options = { url : "https://layla.amazon.de/api/bootstrap?version=0", method : "GET", followAllRedirects : true, headers : { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Content-Type': 'text/plain', 'Accept-Language': 'de,en', 'DNT' : '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests' : '1', 'Referer' : 'https://layla.amazon.de/spa/index.html/', 'Cookie' : cookieStr } };
! request.get(options, function(err, res, body){
var setCookies = res.headers['set-cookie'];
if(logOn) log("Set-Cookies: " + JSON.stringify(setCookies));var cookieStrTemp = ""; for(var i = 0; i < setCookies.length; i++) { var setCookie = JSON.stringify(setCookies[i]);
! if(setCookie.indexOf("1970") == -1){
setCookie = setCookie.replace(/Version=1; /g, "");
var setCookieArray = setCookie.match(/"(.*) Domain=|Expires=|Version=/);
if(cookieStr.indexOf(setCookieArray[1]) == -1) {
cookieStrTemp = cookieStrTemp + setCookieArray[1] + " ";
}
}
}
cookieStrTemp = cookieStrTemp.replace(/\/g, "");
cookieStr = cookieStr + cookieStrTemp;
if(logOn) log("Cookie Complete: " + cookieStr);if (cookieStr.indexOf("csrf") != -1) { log("LogOn successfull!"); } else { log("LogOn Failed."); setState(idAlexaLogonCookie, ""); setState(idAlexaLogonCSRF, ""); setState(idAlexaLogonCookieValid, "false"); return; } setState(idAlexaLogonCookie, cookieStr); var csrfArray = cookieStr.match(/csrf=(.*?); /); setState(idAlexaLogonCSRF, csrfArray[1]); setState(idAlexaLogonCookieValid, 'true'); });
! }
! Sobald die Datenpunkte mit dem Cookie und CSRF gefüllt sind, können andere Scripte darauf zugreifen und so https-Anfragen an die Amazon-API stellen. Beim Cookie müssen allerdings noch "\" herausgefiltert werden. Bin mir nicht ganz sicher, warum das so ist... !
~~[code]~~var cookie = getState('productive.alexalogon.cookie').val;
cookie = cookie.replace(/\/g, "");
[/code]`
! Würde mich freuen, wenn es mal jemand ausprobieren würde und Feeback gibt, Danke ;-)[/i][/i][/i][/i][/i][/i][/i][/i] -
Hi,
So ganz verstanden was ich damit machen kann habe ich noch nicht. :roll:
Kann ich über die erzeugten Datenpunkte Alexa befehle in Verbindung mit Scripten/Blockly nutzen ohne iobroker cloud nutzen zu müssen?
Kannst du mal ein Beispiel posten oder beschreiben?
Danke und Gruß
Mirko
-
Gerne,
es gibt die Möglichkeit, Alexa über die Amazon-API zu steuern oder Daten auszulesen (hier zwei Beispiele):
-
- Script für Kommandos an Alexa findest Du in diesem Thread: http://forum.iobroker.net/viewtopic.php?f=37&t=6035
* Script zum Auslesen, welches Echo-Gerät angesprochen wurde: [http://forum.iobroker.net/viewtopic.php?f=37&t=9115](http://forum.iobroker.net/viewtopic.php?f=37&t=9115)
Um so etwas machen zu können, muss man aber in den entsprechenden Account eingeloggt sein. Dafür wurde bisher immer die Methode verwendet, dass man sich in Chrome in die Alexa-Seite einloggt und dann über die Developer-Tools das Cookie raussucht. Diesen langen Text muss man dann in die Scripte eintragen, damit sie sich authentifizieren können und die API die Befehle auch ausführt.
Das Script dient dazu, den Umweg über den Browser nicht gehen zu müssen.
-
-
Wie cool ist das denn!
Top-Arbeit. Das werde ich direkt mal ausprobieren
-
mhhh… habe ich befürchtet, dass das bei mir nicht funktioniert. Schade.
Mein Amazon-Konto ist durch 2fa geschützt. Es wird bei mir daran scheitern.
Ich ziehe meinen Hut. Ich bin schwer beeindruckt. Klasse Skript!
Ich hatte mir daran die Zähne ausgebissen.
-
Kann man dieses Script zusammen mit der Steuerung von ruhr70 nicht irgendwie zum Adapter machen?
Das würde es doch für die User einfacher machen und man hätte nicht so viele Scripte, oder?
-
mhhh… habe ich befürchtet, dass das bei mir nicht funktioniert. Schade.
Mein Amazon-Konto ist durch 2fa geschützt. Es wird bei mir daran scheitern.
Ich ziehe meinen Hut. Ich bin schwer beeindruckt. Klasse Skript!
Ich hatte mir daran die Zähne ausgebissen. `
Danke
Mit 2fa geht es nicht. Kommt da noch eine Seite dazwischen, wo man einen Code eingeben muss? Oder dann in einer App den Zugang bestätigen?
-
Mit 2fa geht es nicht. Kommt da noch eine Seite dazwischen, wo man einen Code eingeben muss? Oder dann in einer App den Zugang bestätigen? `
Ja. Man gibt erst den Usernamen ein, dann das Passwort.
Bei 2fa kommt dann eine weitere Abfrage/Seite, in der man den 6-stelligen PIN eingeben muss. Dieser wird minütlich neu generiert wird.
Z.b. mit dem Google Authenticator.
-
Währe dies hier nicht eine Möglichkeit den 2FA von Google teils zu automatisieren?
https://www.google.nl/amp/s/www.howtoge … ation/amp/
Send from mobile device
-
Kann man dieses Script zusammen mit der Steuerung von ruhr70 nicht irgendwie zum Adapter machen?
Das würde es doch für die User einfacher machen und man hätte nicht so viele Scripte, oder? `
Hab ich nichts dagegen, wenn das jemand machen würde. Ich kenne mich mit ioBroker nicht genug aus, um einen Adapter zu bauen.
Wenn es nur um das eine Script von Ruhr70 geht, dann kannst Du die beiden Scripte ja zusammenführen. Das LogOnScript erkennt jetzt schon, ob das Cookie noch aktuell ist und wenn nicht, wird sich eingeloggt (dafür müsste man aber user/pass im script speichern). Insofern kann man die Logik sicher mit dem Script zur Steuerung kombinieren. Dann hättest Du nur ein Script.
Aber was ist, wenn morgen eine neue tolle Idee in Form eines Scriptes daherkommt, die Du auch wieder haben willst, dann musst Du den LogOn-Teil wieder aus der Steuerung heraustrennen und das Cookie an mehrere Scripte verteilen. Deshalb habe ich mich dafür entschieden die beiden Funktionen getrennt zu halten und über Datenpunkte synchronisieren.
Im Moment habe ich schon eine handvoll Scripte, die Licht, Fernseher, Harmony Hub Geräte und so weiter steuern. Alle diese Scripte können auf das Cookie zugreifen und so die API verwenden. Wenn es noch bessere Wege gibt, das so umzusetzen, immer her damit
-
Währe dies hier nicht eine Möglichkeit den 2FA von Google teils zu automatisieren?
Genau darauf hatte ich mit meiner zweiten Frage abgeziehlt. Du bekommst einen Request ans Handy geschickt (ob jetzt in einer App oder als Notification ist egal). Dann sagst Du ja oder nein. Wenn ich es aber richtig verstehe, dann hat Amazon diese Variante nicht?
Für den automatisierten LogOn ist die erste Variante mit der Zwischenseite aber lösbar, weil Du die Seite im Script auslesen kannst und es nur darauf ankommt, die richtigen https-Request zu senden. Wenn der 6-stellige Code eine Minute aktuell ist, dann kann man den locker in das Script eintragen, starten und dann sollte es in den meisten Fällen direkt funktionieren.
Ich werde mal sehen, ob ich am Wochende dafür Zeit habe, denn eigentlich möchte ich den Amazon-Account lieber mit 2FA versehen haben… (Ich hatte jetzt für Alexa erstmal einen extra Account angelegt).
-
Ich werde mal sehen, ob ich am Wochende dafür Zeit habe, denn eigentlich möchte ich den Amazon-Account lieber mit 2FA versehen haben… (Ich hatte jetzt für Alexa erstmal einen extra Account angelegt). `
Ich kann 2fa nur empfehlen… :mrgreen: :mrgreen:
-
Am besen die "createState" Befehle nah unten ziehen - oder die Definition der Variable "forcecreation" nach oben. Wenn die creates kommen ist der Wert von forcecreation immer "undefined".
Und vllt noch ein schedule was den cookie einmal pro Tag checkt … falls ungültig und username/passwort leer dann cookie im state löschen. so kann man drauf reagieren und sich erin notify schicken
-
Am besen die "createState" Befehle nah unten ziehen - oder die Definition der Variable "forcecreation" nach oben. Wenn die creates kommen ist der Wert von forcecreation immer "undefined".
Und vllt noch ein schedule was den cookie einmal pro Tag checkt … falls ungültig und username/passwort leer dann cookie im state löschen. so kann man drauf reagieren und sich erin notify schicken `
Gute Vorschläge, kommen in die nächste Version, Danke.
-
Sensationell! Habe fast diesen (für mich) wichtigen thread überlesen.
Nun kann ich wieder das tolle Script von ruhr70 für die Alexa Steuerung benutzen. War mir zu nervig mit dem wiederholten Raussuchen von csrf und cookie.
Zuerst dachte ich eben das Script AlexaLogOn würde falsche Werte liefern. Aber es funktioniert!
Vergleich:
cookie korrekt: session-id=259-6758….....................
cookie unkorrekt: x-amzn-dat-gui-client-v=1..............
-
Am besen die "createState" Befehle nah unten ziehen - oder die Definition der Variable "forcecreation" nach oben. Wenn die creates kommen ist der Wert von forcecreation immer "undefined".
Und vllt noch ein schedule was den cookie einmal pro Tag checkt … falls ungültig und username/passwort leer dann cookie im state löschen. so kann man drauf reagieren und sich erin notify schicken `
In Version 0.4 jetzt eingebaut. Neuen Code findest Du im ersten Post des Threads.
-
mhhh… habe ich befürchtet, dass das bei mir nicht funktioniert. Schade.
Mein Amazon-Konto ist durch 2fa geschützt. Es wird bei mir daran scheitern.
Ich ziehe meinen Hut. Ich bin schwer beeindruckt. Klasse Skript!
Ich hatte mir daran die Zähne ausgebissen. `
Hab jetzt 2FA in meinem Konto auch aktiviert und entsprechend in das Script eingebaut.
Funktioniert bei mir wie gewünscht
Probier mal bitte.
-
mhhh… habe ich befürchtet, dass das bei mir nicht funktioniert. Schade.
Mein Amazon-Konto ist durch 2fa geschützt. Es wird bei mir daran scheitern.
Ich ziehe meinen Hut. Ich bin schwer beeindruckt. Klasse Skript!
Ich hatte mir daran die Zähne ausgebissen. `
Hab jetzt 2FA in meinem Konto auch aktiviert und entsprechend in das Script eingebaut.
Funktioniert bei mir wie gewünscht
Probier mal bitte. `
Ich ziehe meinen Hut!
Funktioniert 1A, inkl. 2FA
Ich habe mein Skript deswegen auch angepackt und die Abfrage des Cookies über einen Datenpunkt eingebaut, der von Deinem Skript gefüllt wird.
Folgende Anmerkungen/Wünsche hätte ich noch zu Deine Skript:
- Beim ersten Start des Skripts erhält man eine Fehlermeldung, da main() früher ausgeführt wird, als die Datenpunkte mit angelegt wurden. (passiert wg. der Asynchronität von Javascript unabhängig davon, wie die Reihenfolge der Kommados im Skript ist.
ab dem zweiten Start sind die Datenpunkte dann immer da. Einfachste Variante das zu umgehen ist main() verzögert auszuführen: ```` setTimeout(main, 1000); // startet main() ````
-
Link im Skript zu Deinem ersten Post hier, in dem Du das gepflegte Skript ablegst.
Ich muss mir das angewöhnen. Hätte fast mein Skript aus April nicht mehr gefunden
.
-
Einen Datenpunkt (true/false), wenn der Cookie abgelaufen ist.
Man kann diesen dann in VIS visualisieren oder z.B. eine Nachricht per Telegram schicken, damit der Anwender informiert ist.
Andere Skripte können darauf reagieren und die Arbeit "pausieren".
…und noch einmal. Daumen hoch!
-
Hallo,
erstmal vielen Dank für deine Arbeit. Habe aufgrund des Skriptes in diesem Post auch mal die Sprachsteuerung ohne Raumnamen ausprobiert. Ich nutze (noch kein 2FA), das machte keine Probleme.
Im anderen Skript ("Licht an" http://forum.iobroker.net/viewtopic.php?f=37&t=9115) musste ich die Variable csrf noch nachträglich definieren. Habe da immer den Fehler bekommen, sie sei nicht bekannt.
!
// setzt die Options für den https Request function setOptions(path,method) { var options = { host: 'layla.amazon.de', path: path, method: method, timeout:10000, headers: { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Content-Type': 'text/plain', 'csrf' : getState("javascript.2.Alexa.logon.csrf"/*Alexa LogOn CSRF*/).val,//csrf, 'Cookie' : cookie } }; return options; } !
Ausserdem wär es schön, wenn man ALLE Einstellungen im oberen Bereich der Skripte erledigen könnte.
Der Pfad zu den anzulegenden Objekten könnte oben zentral festgelegt werden (ich nutze javascript.2.Alexa.xxxxx)
Neben der Mapping Tabelle kann man auch den Namen des Smart Gerätes (idAlexaTrigger) gleich in createState() festlegen
! ````
// Wenn gewünscht, Name und Beschreibung (desc) für den Datenpunkt anpassen.
createState(idAlexaTrigger, 0, forecreation, {
name: 'Trigger für Alexa',
desc: 'Trigger mit Level für Alexa',
type: 'number',
unit: '',
role: 'value',
smartName: {
de: 'Sonos Party',
en: 'Sonos Party'
}
});Es läuft jetzt fehlerfrei, hat mich aber ganz schön Gehirnschmalz gekostet :-D Werde meine Mapping Tabelle nachher ausweiten und dann den WAF-Test machen :) Gruß Pix
-
Hallo zusammen,
erstmal einen ganz herzlichen Dank für das Script !!!
Jetzt aber mal eine blöde Frage:
Ich erhalte seit heute ca. 12:30 Uhr einen "Login-Error".
Kann es sein, dass Amazon die Login-Seite irgendwie geändert hat, oder muss ich das Problem bei mir Lokal suchen ?
Schon mal danke für die Antwort !!!
Gruss
gBonfire