如何使用ASK SDK v2获取Node.js的设备地址

时间:2018-06-06 09:24:03

标签: alexa

我正在尝试使用ASK SDK v2 for Node.js构建一项需要访问设备地址的技能。但是,我发现这个v2的文档非常有限,即使它们在Github上提供的示例,它也不起作用。

到目前为止,我理解以下内容:

  1. 在您的Alexa技能权限中,您需要根据您的使用情况启用“完整地址”或“国家/地区和邮政编码”。
  2. 在对设备进行API调用之前,您需要获取deviceId,accessToken和apiEndpoint。我用以下方法做到了这一点:

    const LaunchRequestHandler = {
     canHandle(handlerInput) {
      return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
     },
     handle(handlerInput) {
      const speechText = 'Welcome to the Alexa Skills Kit, you can say hello!';
      const accessToken = handlerInput.requestEnvelope.context.System.apiAccessToken;
      const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;
      const apiEndpoint = handlerInput.requestEnvelope.context.System.apiEndpoint;
    
      console.log('accessToken: ' + accessToken + '; deviceId: ' + deviceId + '; apiEndpoint: ' + apiEndpoint);
    
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .withSimpleCard('Hello World', speechText)
      .getResponse();
     },
    };
    
  3. 在通话中,我们需要在标题中添加授权承载。

  4. 所有这一切都很棒,但我们如何打电话?

    提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您将必须这样调用Alexa地址终结点:

Host: api.amazonalexa.com
Accept: application/json
Authorization: Bearer MQEWY...6fnLok 
GET https://api.amazonalexa.com/v1/devices/{deviceId}/settings/address

有关地址API的更多详细信息,请参见here。使用Node Alexa SDK v2,如Nikhil所述,在deviceAddressServiceClient上调用getFullAddress(deviceId)方法可能会更容易。

答案 1 :(得分:0)

将近两年后,我同意文档数量有限。经过一番研究和反复试验后,我终于可以使Amazon's example正常工作了。我正在使用ask-sdk@2.8.0。

通常,您的handlerInput将带有serviceClientFactory对象。该对象具有一个工厂函数,该函数返回DeviceAddressServiceClient,而您不必担心设置accessToken或apiEndpoint。只需传递您的deviceId,就可以了。这是一个简化的示例,用于获取用户的完整地址的呼叫:

const Alexa = require("ask-sdk");
const address = await handlerInput
    .serviceClientFactory
    .getDeviceAddressServiceClient()
    .getFullAddress(Alexa.getDeviceId(handlerInput.requestEnvelope));

请注意,getFullAddress返回一个Promise。如果用户未授权“完全地址”权限,则此功能将在error.name === "ServiceError"error.statusCode === 403处引发错误。您将需要在catch子句/函数中查找此内容,并返回包含.withAskForPermissionsConsentCard(["read::alexa:device:all:address"])的响应。

如果未定义handlerInput.serviceClientFactory,请检查导出技能处理程序的代码。您使用的是SkillBuilders.custom()还是SkillBuilders.standard()?标准的技能构建器已经包含默认的ApiClient,因此您不应具有未定义的serviceClientFactory。但是使用自定义选项时,您确实需要指定一个ApiClient。您仍然可以使用默认客户端,也可以提供自己的客户端。在Amazon's example的底部,他们使用具有默认ApiClient的自定义生成器,如下所示:

const Alexa = require("ask-sdk");
exports.handler = Alexa.SkillBuilders.custom()
    .addRequestHandlers(<your request handlers>)
    .addErrorHandlers(<your error handlers>)
    .withApiClient(new Alexa.DefaultApiClient())
    .lambda();

this GitHub issue的评论帮助我找到了标准和自定义技能构建者之间的区别。