it-swarm.com.de

Wie bekomme ich eine Alexa userId?

Ich baue eine Alexa-Fähigkeit, und dazu muss ich die Benutzer-ID eines Benutzers speichern. Ich habe versucht, es mit event.session.user.userId abzurufen. Wenn ich jedoch console.log(event.session.user.userId) anrufe, ist die Ausgabe wörtlich amzn1.ask.account.[unique-value-here]. Ich habe mir mehrere ähnliche Fragen angesehen, und keine davon liefert mir eine klare Antwort.

Ich bin nicht sicher, ob es sich um einen Fehler handelt, nur für Entwickler, oder ob die Benutzer-ID einfach anonymisiert ist. Wenn ja, gibt es eine Möglichkeit, die tatsächliche userId abzurufen? Ich stelle mir das vor, da Amazon hier eine komplette Anleitung dazu geschrieben hat: 

https://developer.Amazon.com/public/solutions/Alexa/alexa-skills-kit/docs/linking-an-Alexa-user-mit-a-user-in-your-system .

Nach einem langen Tag des Debugging bin ich jedoch nicht sicher, was wirklich ist und was nicht mehr.

 var request = require('request');
var firebase = require('firebase');
var config = {
    apiKey: "my-api-key",
    authDomain: "stuff...",
    databaseURL: "more stuff...",
    storageBucket: "even more stuff...",
};
firebase.initializeApp(config);
// Get a reference to the database
var database = firebase.database();

exports.handler = (event, context) => {
    try {
        // New session
        if (event.session.new) {
            // New Session
            console.log("NEW SESSION");
        }

        // Launch Request
        switch (event.request.type) {
            case "LaunchRequest":
                var url = "https://api.random.org/json-rpc/1/invoke";
                var myRequest = {
                    "jsonrpc": "2.0",
                    "method": "generateStrings",
                    "params": {
                        "apiKey": "another-api-key",
                        "n": "1",
                        "length": "3",
                        "characters": "abcdefghijklmnopqrstuvwxyz0123456789"
                    },
                    "id": 24
                }
                var pin;
                request.post(
                    url,
                    {json: myRequest},
                    function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            console.log(event.session.user.userId); // **Here**, output is literally amzn1.ask.account.[unique-value-here] 
                            pin = body.result.random.data[0];
                            writeUserPin(pin);
                            var welcome = "Welcome";
                            var pinStatement = "Your 3 letter or number pin is: " + processPinForSpeech(pin);
                            context.succeed(
                                generateResponse(
                                    buildSpeechletReponse(welcome + pinStatement, true),
                                    {}
                                )
                            );
                            console.log(pin);
                        }
                        else {
                            console.log(error);
                        }
                    }
                );
                console.log("LAUNCH REQUEST");
                break;
            // Intent Request
            case "IntentRequest":
                console.log("INTENT REQUEST");
                break;

            // Session Ended Request
            case "SessionEndedRequest":
                console.log("SESSION ENDED REQUEST");
                break;

            default:
                context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
        }
    }
    catch (error) {
        context.fail(`Exception: ${error}`);
    }

}
    // Helpers
buildSpeechletReponse = (outputText, shouldEndSession) => {
    return {
        outputSpeech : {
            type: "PlainText",
            text: outputText
        },
        shouldEndSession: shouldEndSession
    };
}

generateResponse = (speechletResponse, sessionAttributes) => {
    return {
        version: "1.0",
        sessionAttributes: sessionAttributes,
        response: speechletResponse
    };
}

function writeUserPin(pin) {
    console.log("writing stuff");
    firebase.database().ref('newPins/' + pin).set({
        num : ""
    });
}

function processPinForSpeech(pin) {
    var wordNumArr = ["zero", "one", "two", "three", "four",
     "five", "six", "seven", "eight", "nine"];
    processedPin = "";
    for (i = 0; i < pin.length; i++){
        var currentChar = pin.charAt(i);
        if (isNaN(Number(currentChar))){
            processedPin += currentChar + ". ";
        }
        else {
            processedPin += wordNumArr[Number(currentChar)] + ". ";
        }
    }
    return processedPin
}

Das Folgende ist die Ausgabe in den CloudWatch-Protokollen: 


16:16:19
START RequestId: 48e335c5-d819-11e6-bc01-a939911adc24 Version: $LATEST

16:16:19
2017-01-11T16:16:19.639Z    48e335c5-d819-11e6-bc01-a939911adc24    NEW SESSION

16:16:19
2017-01-11T16:16:19.758Z    48e335c5-d819-11e6-bc01-a939911adc24    LAUNCH REQUEST

16:16:20
2017-01-11T16:16:20.457Z    48e335c5-d819-11e6-bc01-a939911adc24    amzn1.ask.account.[unique-value-here]

16:16:20
2017-01-11T16:16:20.457Z    48e335c5-d819-11e6-bc01-a939911adc24    writing stuff

16:16:20
2017-01-11T16:16:20.520Z    48e335c5-d819-11e6-bc01-a939911adc24    dd2

16:16:20
END RequestId: 48e335c5-d819-11e6-bc01-a939911adc24

16:16:20
REPORT RequestId: 48e335c5-d819-11e6-bc01-a939911adc24  Duration: 1005.48 ms    Billed Duration: 1100 ms Memory Size: 128 MB    Max Memory Used: 38 MB
10
Miki P

Nun, es stellte sich heraus, dass ich alles einmal richtig gemacht habe. Der Grund, warum die userId buchstäblich amzn1.ask.account. [Unique-value-here] war, lag darin, dass ich sie bei einem Testereignis "Alexa Start Session" in der AWS Lambda-Konsole testete. Als ich meinen Echo Dot bat, die Fertigkeit zu starten, wurde der eigentliche Schlüssel generiert. Problem gelöst. 

2
Miki P

Du machst es richtig. Dieser amzn1.ask.account.[unique-value-here] ist tatsächlich die vollständige Benutzer-ID. Sie können dies selbst beobachten, indem Sie Ihre Fähigkeit aus einem Echo aktivieren, mehrere Anforderungen für Ihre Alexa-Fähigkeit protokollieren und beobachten, dass die userid zwischen diesen Anforderungen den gleichen Wert hat.

Nach der JSON-Referenz :

userId: Eine Zeichenfolge, die einen eindeutigen Bezeichner für den Benutzer darstellt, der die Anfrage gestellt. Die Länge dieses Bezeichners kann variieren, ist jedoch niemals mehr als 255 Zeichen. Die userId wird automatisch generiert, wenn ein Benutzer aktiviert die Fähigkeit in der Alexa-App. 

Hinweis: Durch Deaktivieren und erneutes Aktivieren einer Fertigkeit wird ein neuer Bezeichner generiert.

Wenn Sie nur Benutzerattribute zwischen Sitzungen beibehalten müssen, reicht dieser Wert aus, und Sie können ihn verwenden, um diesen Benutzer eindeutig zu identifizieren, solange er die Fähigkeit aktiviert hat.

Wenn Sie ein Konto verknüpfen möchten, lautet der Wert, nach dem Sie suchen, accessToken und befindet sich in demselben user-Objekt, nachdem eine erfolgreiche Kontoverbindung erfolgt. Nach der gleichen JSON-Referenz wie oben:

accessToken: Ein Token, das den Benutzer in einem anderen System identifiziert. Das ist Wird nur bereitgestellt, wenn der Benutzer sein Konto erfolgreich verknüpft hat. Sehen Einen Alexa-Benutzer mit einem Benutzer in Ihrem System verknüpfen für weitere Details.

10
Anthony Neace

Sie sollten versuchen, die Anforderung zu lesen, die in der Testkonsole von ASK angezeigt wird. Von dort aus können Sie auf die verschiedenen Variablen zugreifen, die an Ihre Lambda-Funktion gesendet werden. Sie können sie auch gemäß Ihren Anforderungen bearbeiten oder verwenden.

0
Shivanshu Garg