我正在尝试使用ASK SDK v2 for Node.js构建一项需要访问设备地址的技能。但是,我发现这个v2的文档非常有限,即使它们在Github上提供的示例,它也不起作用。
到目前为止,我理解以下内容:
在对设备进行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();
},
};
在通话中,我们需要在标题中添加授权承载。
所有这一切都很棒,但我们如何打电话?
提前感谢您的帮助。
答案 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的评论帮助我找到了标准和自定义技能构建者之间的区别。