6

我正在構建一個Alexa技能,它需要我存儲用戶的userId。我試圖用event.session.user.userId來檢索它。但是,當我撥打console.log(event.session.user.userId)時,輸出字面上是amzn1.ask.account.[unique-value-here]。我查看了幾個類似的問題,沒有一個能夠爲我提供足夠明確的答案。如何獲取Alexa用戶ID?

我不確定這是一個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": "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]實際上是完整的用戶名。您可以通過在Echo中啓用您的技能,將多個請求記錄到您的alexa技能並觀察這些請求之間的值是相同的值,從而爲您自己觀察。

JSON Reference

用戶名:一個表示誰 發出請求的用戶的唯一標識符的字符串。此標識符的長度可能會有所不同,但絕不會超過255個字符。當用戶啓用Alexa應用程序中的技能時,會自動生成userId。

注意:禁用和重新啓用技能會生成新的標識符。

如果您只需要在會話之間保留用戶屬性,該值就足夠了,您可以使用它來唯一標識此用戶,只要他們具有啓用的技能。

如果您需要關聯一個帳戶,那麼您正在查找的值爲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]」,而不是一個隨機的字符串?是因爲我是開發人員嗎? –