6

私はAlexaスキルを構築しており、ユーザーのuserIdを保存する必要があります。私はevent.session.user.userIdでそれを取得しようとしました。しかし、console.log(event.session.user.userId)と呼ぶと、出力は文字通りamzn1.ask.account.[unique-value-here]です。私はいくつかの同様の質問を見てきましたが、どれも私にとってはっきりとした答えを提供していません。AlexaのユーザーIDを取得するには?

これはバグか、開発者のみのものか、またはuserIdが単に匿名化されているかわかりません。もしそうなら、実際のユーザーIDを取得する方法はありますか?アマゾンはガイド全体をここに書いているので、そこには想像がつく。

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": "abcdefghijklmnopqrstuvwxyz" 
        }, 
        "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 

答えて

2

まあ、私はすべてを正しく(一度だけ)行っていたことが判明しました。 userIdが文字通りamzn1.ask.account。[unique-value-here]だったのは、AWS Lambdaコンソールの「Alexa Start Session」テストイベントでテストしていたためです。 Echo Dotにスキルを公開するように頼んだとき、実際の鍵が生成されました。問題が解決しました。

7

あなたは右のそれをやっています。このamzn1.ask.account.[unique-value-here]は完全なユーザーIDです。エコーからのスキルを有効にし、いくつかのリクエストをあなたのアレクサスキルに記録し、これらのリクエストの間のuseridが同じ値であることを確認することで、これを自分で観察することができます。 JSON Referenceパー

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

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

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

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

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

+0

まずはお返事いただきありがとうございます!それは非常に詳細です。私が理解できないことの一つは、これらの値がすべて同じ場合、event.session.user.userIdをFirebaseに保存してユーザを一意に識別できる方法です。もう少し詳しく説明できますか? –

+1

あなたのスキルの個々のユーザーの場合にのみ同じです。たとえば、別のエコーであなたのスキルを使用している他の人は、 'amzn1.ask.account'の後に異なる一意の値を持つでしょう。したがって、任意のユーザーに対して、Firebaseだけでなく、この値を任意のデータストアに保存することができます。この値は、そのユーザーに固有のものです。 –

+0

なぜ私の価値は文字通り「[unique-value-here]」で、ランダムな文字列ではないのですか?私は開発者だからですか? –

関連する問題