Last active
May 4, 2019 17:04
-
-
Save germanviscuso/ba0c8e5af0491a6cb88c39bd7cd5c0c7 to your computer and use it in GitHub Desktop.
Alexa Skill Basics: Access to external data in Fact skill (using the http module)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"interactionModel": { | |
"languageModel": { | |
"invocationName": "cat facts", | |
"intents": [ | |
{ | |
"name": "AMAZON.CancelIntent", | |
"samples": [] | |
}, | |
{ | |
"name": "AMAZON.HelpIntent", | |
"samples": [] | |
}, | |
{ | |
"name": "AMAZON.StopIntent", | |
"samples": [] | |
}, | |
{ | |
"name": "AMAZON.FallbackIntent", | |
"samples": [] | |
}, | |
{ | |
"name": "GetNewFactIntent", | |
"samples": [ | |
"a fact", | |
"a cat fact", | |
"tell me a fact", | |
"tell me a cat fact", | |
"give me a fact", | |
"give me a cat fact", | |
"tell me trivia", | |
"tell me a cat trivia", | |
"give me trivia", | |
"give me a cat trivia", | |
"give me some information", | |
"give me some cat information", | |
"tell me something", | |
"give me something" | |
], | |
"slots": [] | |
} | |
] | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint-disable func-names */ | |
/* eslint-disable no-console */ | |
const Alexa = require('ask-sdk'); | |
const GetNewFactHandler = { | |
canHandle(handlerInput) { | |
const request = handlerInput.requestEnvelope.request; | |
return request.type === 'LaunchRequest' | |
|| (request.type === 'IntentRequest' | |
&& request.intent.name === 'GetNewFactIntent'); | |
}, | |
async handle(handlerInput) { | |
let outputSpeech = 'Sorry, we could not access the data!'; | |
await getData('https://catfact.ninja/fact') | |
.then((response) => { | |
const data = JSON.parse(response); | |
outputSpeech = data.fact; | |
}) | |
.catch((err) => { | |
//set an optional error message here | |
//outputSpeech = err.message; | |
}); | |
return handlerInput.responseBuilder | |
.speak(GET_FACT_MESSAGE + outputSpeech) | |
.getResponse(); | |
} | |
}; | |
const HelpHandler = { | |
canHandle(handlerInput) { | |
const request = handlerInput.requestEnvelope.request; | |
return request.type === 'IntentRequest' | |
&& request.intent.name === 'AMAZON.HelpIntent'; | |
}, | |
handle(handlerInput) { | |
return handlerInput.responseBuilder | |
.speak(HELP_MESSAGE) | |
.reprompt(HELP_REPROMPT) | |
.getResponse(); | |
}, | |
}; | |
const ExitHandler = { | |
canHandle(handlerInput) { | |
const request = handlerInput.requestEnvelope.request; | |
return request.type === 'IntentRequest' | |
&& (request.intent.name === 'AMAZON.CancelIntent' | |
|| request.intent.name === 'AMAZON.StopIntent'); | |
}, | |
handle(handlerInput) { | |
return handlerInput.responseBuilder | |
.speak(STOP_MESSAGE) | |
.getResponse(); | |
}, | |
}; | |
const SessionEndedRequestHandler = { | |
canHandle(handlerInput) { | |
const request = handlerInput.requestEnvelope.request; | |
return request.type === 'SessionEndedRequest'; | |
}, | |
handle(handlerInput) { | |
console.log(`Session ended with reason: ${handlerInput.requestEnvelope.request.reason}`); | |
return handlerInput.responseBuilder.getResponse(); | |
}, | |
}; | |
const ErrorHandler = { | |
canHandle() { | |
return true; | |
}, | |
handle(handlerInput, error) { | |
console.log(`Error handled: ${error.message}`); | |
return handlerInput.responseBuilder | |
.speak('Sorry, an error occurred.') | |
.reprompt('Sorry, an error occurred.') | |
.getResponse(); | |
}, | |
}; | |
const SKILL_NAME = 'Cat Facts'; | |
const GET_FACT_MESSAGE = 'Here\'s your fact: '; | |
const HELP_MESSAGE = 'You can say tell me a cat fact, or, you can say exit... What can I help you with?'; | |
const HELP_REPROMPT = 'What can I help you with?'; | |
const STOP_MESSAGE = 'Goodbye!'; | |
const getData = function (url) { | |
return new Promise((resolve, reject) => { | |
const client = url.startsWith('https') ? require('https') : require('http'); | |
const request = client.get(url, (response) => { | |
if (response.statusCode < 200 || response.statusCode > 299) { | |
reject(new Error('Failed with status code: ' + response.statusCode)); | |
} | |
const body = []; | |
response.on('data', (chunk) => body.push(chunk)); | |
response.on('end', () => resolve(body.join(''))); | |
}); | |
request.on('error', (err) => reject(err)) | |
}) | |
}; | |
const skillBuilder = Alexa.SkillBuilders.standard(); | |
exports.handler = skillBuilder | |
.addRequestHandlers( | |
GetNewFactHandler, | |
HelpHandler, | |
ExitHandler, | |
SessionEndedRequestHandler | |
) | |
.addErrorHandlers(ErrorHandler) | |
.lambda(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment