web-dev-qa-db-ja.com

Alexa userIdを取得する方法は?

私はAlexaスキルを構築しており、ユーザーのuserIdを保存する必要があります。 _event.session.user.userId_で取得しようとしました。ただし、console.log(event.session.user.userId)を呼び出すと、出力は文字通り_amzn1.ask.account.[unique-value-here]_になります。私はいくつかの同様の質問を検討しましたが、どれも私に明確な十分な答えを提供していません。

これがバグなのか、開発者専用の問題なのか、userIdが単に匿名化されているのかはわかりません。もしそうなら、実際のuserIdを取得する方法はありますか? Amazonがガイド全体をここに書いているので、あると思います。

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

しかし、長い1日のデバッグの後で、何が本物で何がそうでないかはわかりません。

_ 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
_
13
Miki P

ええと、私はすべてを正しく(一度だけ)やっていました。 userIdが文字通りamzn1.ask.account。[unique-value-here]であった理由は、AWS Lambdaコンソールの「Alexa Start Session」テストイベントでテストしていたためです。エコードットにスキルの起動を要求すると、実際のキーが生成されました。問題が解決しました。

2
Miki P

あなたはそれを正しくやっています。この amzn1.ask.account.[unique-value-here]は実際には完全なユーザーIDです。 Echoからスキルを有効にし、Alexaスキルへのいくつかのリクエストをログに記録し、これらのリクエスト間のuseridが同じ値であることを確認することで、これを自分で確認できます。

JSONリファレンス ごと:

userId:リクエストを行ったユーザーの一意の識別子を表す文字列。このIDの長さはさまざまですが、255文字を超えることはできません。ユーザーがAlexaアプリでスキルを有効にすると、userIdが自動的に生成されます。

注:スキルを無効にして再度有効にすると、新しい識別子が生成されます。

セッション間でユーザー属性を保持するだけでよい場合は、この値で十分です。スキルを有効にしている限り、この値を使用してこのユーザーを一意に識別できます。

アカウントをリンクする必要がある場合、探している値はaccessTokenであり、アカウントのリンクが成功すると、同じuserオブジェクトに存在します。上記と同じJSONリファレンスによると:

accessToken:別のシステムでユーザーを識別するトークン。これは、ユーザーがアカウントを正常にリンクした場合にのみ提供されます。詳細については、 Alexaユーザーとシステム内のユーザーのリンク を参照してください。

10
Anthony Neace

ASKのテストコンソールに表示されるリクエストを読み取ってみてください。そこから、ラムダ関数に送信されているさまざまな変数にアクセスできます。また、必要に応じてそれらを操作または使用できます。

0
Shivanshu Garg