6

Tôi đang xây dựng một kỹ năng Alexa và yêu cầu tôi lưu trữ userId của người dùng. Tôi đã cố gắng truy xuất nó với event.session.user.userId. Tuy nhiên, khi tôi gọi console.log(event.session.user.userId), đầu ra theo nghĩa đen là amzn1.ask.account.[unique-value-here]. Tôi đã xem xét một số câu hỏi tương tự, và không ai trong số họ cung cấp một câu trả lời đủ rõ ràng cho tôi.Làm thế nào để có được một userId Alexa?

Tôi không chắc chắn đây có phải là lỗi hay không, chỉ là nhà phát triển hoặc nếu userId đơn giản được ẩn danh. Nếu vậy, có cách nào để có được userId thực tế không? Tôi tưởng tượng sẽ có, vì Amazon đã viết toàn bộ hướng dẫn về nó ở đây:

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

Tuy nhiên, sau một ngày dài gỡ lỗi, tôi không chắc chắn những gì có thật và những gì không còn nữa.

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 
} 

Sau đây là đầu ra trên các bản ghi 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 

Trả lời

2

Vâng, hóa ra tôi đã làm mọi thứ chính xác (một lần). Lý do tại sao userId là nghĩa đen amzn1.ask.account [unique-value-here] là vì tôi đã thử nghiệm nó trên một sự kiện kiểm tra "Alexa Start Session" trong bảng điều khiển AWS Lambda. Khi tôi hỏi Echo Dot của tôi để khởi động kỹ năng, nó tạo ra khóa thực sự. Đã giải quyết được sự cố.

7

Bạn đang làm điều đó đúng. amzn1.ask.account.[unique-value-here] này thực tế là userid đầy đủ. Bạn có thể quan sát điều này cho chính mình bằng cách cho phép kỹ năng của bạn từ một Echo, ghi lại một số yêu cầu kỹ năng alexa của bạn, và quan sát rằng userid giữa các yêu cầu này có cùng giá trị.

mỗi sự JSON Reference:

userId: Một chuỗi đại diện cho một định danh duy nhất cho người dùng đưa ra đề nghị. Độ dài của số nhận dạng này có thể thay đổi, nhưng không bao giờ là nhiều hơn 255 ký tự. UserId được tạo tự động khi người dùng bật kỹ năng trong ứng dụng Alexa.

Lưu ý: Tắt và bật lại kỹ năng sẽ tạo một số nhận dạng mới.

Nếu bạn chỉ cần duy trì thuộc tính người dùng giữa các phiên, giá trị này sẽ đủ và bạn có thể sử dụng nó để nhận dạng duy nhất người dùng này miễn là họ đã bật kỹ năng.

Nếu bạn cần liên kết tài khoản, giá trị bạn đang tìm kiếm là accessToken và sống trong cùng một đối tượng user sau liên kết tài khoản thành công. Trên cùng một Tham chiếu JSON như trên:

accessToken: mã thông báo xác định người dùng trong hệ thống khác. Đây là chỉ được cung cấp nếu người dùng đã liên kết thành công tài khoản của họ. Xem Linking an Alexa User with a User in Your System để biết thêm chi tiết.

+0

Trước hết, cảm ơn bạn rất nhiều vì câu trả lời của bạn! Nó rất chi tiết. Một điều tôi không chắc chắn tôi hiểu là làm thế nào tôi có thể xác định duy nhất một người dùng bằng cách lưu event.session.user.userId của họ vào Firebase, nếu tất cả các giá trị này đều giống nhau. Bạn có thể giải thích thêm một chút không? –

+1

Chúng chỉ giống nhau cho một người dùng cá nhân của kỹ năng của bạn; ví dụ, một người khác sử dụng kỹ năng của bạn với một echo khác nhau sẽ có một giá trị duy nhất khác sau 'amzn1.ask.account'. Vì vậy, đối với bất kỳ người dùng nào, bạn có thể lưu giá trị này vào bất kỳ cửa hàng dữ liệu nào - không chỉ Firebase - và nó sẽ là duy nhất cho người dùng đó. –

+0

Vậy tại sao giá trị của tôi theo nghĩa đen là "[unique-value-here]" và không phải là một chuỗi ngẫu nhiên? Có phải vì tôi là nhà phát triển không? –

Các vấn đề liên quan