首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获得Alexa userId?

如何获得Alexa userId?
EN

Stack Overflow用户
提问于 2017-01-11 12:28:14
回答 3查看 14.4K关注 0票数 14

我正在构建一个Alexa技能,它要求我存储用户的userId。我尝试过用event.session.user.userId检索它。但是,当我调用console.log(event.session.user.userId)时,输出从字面上看是amzn1.ask.account.[unique-value-here]。我看过几个类似的问题,但没有一个能给我提供足够清晰的答案。

我不确定这是一个bug,一个仅限开发人员使用的东西,或者userId只是匿名的。如果是这样的话,有没有办法获得实际的userId?我想会有的,因为亚马逊在这里写了一个完整的指南:

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

然而,经过一天的调试,我不再确定什么是真的,什么是假的。

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
}

以下是CloudWatch日志的输出:


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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-12 02:15:24

好吧,事实证明我做的每件事都是正确的(只有一次)。userId的字面意思是amzn1.ask.account.[unique-value-here]的原因是因为我在AWS Lambda控制台的"Alexa Start Session“测试事件中测试了它。当我请求我的Echo Dot启动技能时,它生成了实际的密钥。问题解决了。

票数 4
EN

Stack Overflow用户

发布于 2017-01-11 22:45:01

你做得很对。这个amzn1.ask.account.[unique-value-here]实际上是完整的userId。您可以通过从Echo启用您的技能,将几个请求记录到您的alexa技能,并观察到这些请求之间的userId是相同的值来观察到这一点。

根据JSON Reference

userId:表示发出请求的用户的唯一标识符的字符串。此标识符的长度可以变化,但不能超过255个字符。当用户在Alexa应用程序中启用该技能时,会自动生成userId。注意:禁用并重新启用技能会生成新的标识符。

如果您只需要在会话之间保持用户属性,那么这个值就足够了,只要他们启用了该技能,您就可以使用它来唯一地标识该用户。

如果您需要链接一个帐户,那么您要查找的值是accessToken,并且在成功链接帐户之后位于同一个user对象中。根据与上述相同的JSON参考:

accessToken:标识另一个系统中的用户的令牌。只有当用户成功链接其帐户时,才会提供此选项。有关详细信息,请参阅Linking an Alexa User with a User in Your System

票数 11
EN

Stack Overflow用户

发布于 2019-09-08 20:04:55

您应该尝试读取ASK的Test console中显示的请求。从那里,您可以访问发送到lambda函数的不同变量。此外,您还可以根据自己的需求操作或使用它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41582708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档