Skill para Alexa (Amazon echo) usando Node.js

Tiempo de lectura: 3 minutos

Aquí tienes un ejemplo de cómo podrías crear un skill para Amazon Echo utilizando Node.js.

Este ejemplo muestra cómo crear un skill que te dé el pronóstico del tiempo para una ciudad específica.

Para empezar, necesitarás tener una cuenta de desarrollador de Amazon y un dispositivo Echo o la aplicación Alexa instalada en tu teléfono. También necesitarás una clave API de un servicio de pronóstico del tiempo, como OpenWeatherMap.

Una vez que tengas esto, puedes empezar a crear tu skill siguiendo estos pasos:

  1. Inicia sesión en la consola de desarrollo de skills de Amazon y selecciona «Crear un nuevo skill» en la página principal.
  2. Selecciona la opción «Custom» para crear un skill personalizado.
  3. Asigna un nombre y una palabra clave únicos a tu skill y selecciona el idioma en el que quieres que esté disponible.
  4. En la siguiente pantalla, selecciona la opción «Crear modelo desde cero» y haz clic en «Crear skill».
  5. En la consola de desarrollo, haz clic en «Intenciones» y luego en «Crear una intención». Asigna un nombre a tu intención, como «ObtenerPronóstico», y a
  6. ñade una frase de ejemplo que indique cómo se activará tu skill. Por ejemplo, «Dame el pronóstico del tiempo para {Ciudad}».
  7. Haz clic en «Crear» para guardar tu intención. Luego, haz clic en «Slots» y selecciona «Crear un slot». Asigna un nombre al slot, como «Ciudad», y selecciona el tipo «AMAZON.City». Esto le indicará a Alexa que espera recibir una ciudad como entrada para tu skill.
  8. Haz clic en «Crear» para guardar tu slot.
  9. Ahora, necesitarás escribir el código que controlará tu skill. Puedes hacerlo utilizando el editor de código en la consola de desarrollo de skills de Amazon.

  1. El código necesitará hacer lo siguiente:
    • Realizar una solicitud a la API de pronóstico del tiempo utilizando la ciudad proporcionada por el usuario.
    • Procesar la respuesta de la API y extraer la información relevante, como la temperatura y el estado del cielo.
    • Devolver una respuesta a Alexa con el pronóstico del tiempo para la ciudad solicitada.

Aquí tienes un ejemplo de código que hace todo lo anterior:

const Alexa = require('ask-sdk-core');
const https = require('https');

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
    },
    handle(handlerInput) {
        const speechText = 'Bienvenido a mi skill de pronóstico del tiempo. Puedes decirme "Dame el pronóstico del tiempo para Madrid" para obtener el pronóstico para una ciudad específica.';

        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .withSimpleCard('Bienvenido', speechText)
            .getResponse();
    },
};

const ObtenerPronosticoIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'ObtenerPronostico';
    },
    handle(handlerInput) {
        const ciudad = handlerInput.requestEnvelope.request.intent.slots.Ciudad.value;

        return new Promise((resolve, reject) => {
            https.get(`https://api.openweathermap.org/data/2.5/weather?q=${ciudad}&appid=YOUR_API_KEY_HERE`, (res) => {
                let body = '';
                res.on('data', (chunk) => { body += chunk; });
                res.on('end', () => {
                    const response = JSON.parse(body);
                    const temperature = response.main.temp;
                    const weather = response.weather[0].description;

                    const speechText = `El pronóstico del tiempo para ${ciudad} es de ${temperature} grados y ${weather}.`;

                    resolve(handlerInput.responseBuilder
                        .speak(speechText)
                        .withSimpleCard('Pronóstico del tiempo', speechText)
                        .getResponse());
                });
            }).on('error', (e) => {
                reject(e);
            });
        });

    },
};

const HelpIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'AMAZON.HelpIntent';
    },
    handle(handlerInput) {
        const speechText = 'Puedes decirme "Dame el pronóstico del tiempo para Madrid" para obtener el pronóstico para una ciudad específica.';

        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .withSimpleCard('Ayuda', speechText)
            .getResponse();

    },
};

const CancelAndStopIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && (handlerInput.requestEnvelope.request.intent.name === 'AMAZON.CancelIntent'

                || handlerInput.requestEnvelope.request.intent.name === 'AMAZON.StopIntent');
    },
    handle(handlerInput) {
        const speechText = '¡Hasta luego!';

        return handlerInput.responseBuilder
            .speak(speechText)
            .withSimpleCard('Hasta luego', speechText)
            .getResponse();

    },
};

const SessionEndedRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.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('Lo siento, ha habido un error. Por favor, inténtalo de nuevo.')
            .reprompt('Lo siento, ha habido un error. Por favor, inténtalo de nuevo.')
            .getResponse();

    },
};

const skillBuilder = Alexa.SkillBuilders.custom();

exports.handler = skillBuilder
    .addRequestHandlers(
        LaunchRequestHandler,
        ObtenerPronosticoIntentHandler,
        HelpIntentHandler,
        CancelAndStopIntentHandler,
        SessionEndedRequestHandler
    )
    .addErrorHandlers(ErrorHandler)
    .lambda();

Este código utiliza el módulo ask-sdk-core de Node.js para crear una aplicación de skill para Alexa. Utiliza la intención «ObtenerPronostico» y el slot «Ciudad» que configuramos anteriormente y realiza una solicitud a la API de pronóstico del tiempo utilizando la ciudad proporcionada por el usuario. Luego, procesa la respuesta de la API y extrae la información relevante, como la temperatura y el estado del cielo. Finalmente, devuelve una respuesta a Alexa con el pronóstico del tiempo para la ciudad solicitada.

Este es sólo un ejemplo básico de cómo crear un skill para Alexa utilizando Node.js. Puedes añadir más intenciones y slots y utilizar diferentes APIs para expandir las funcionalidades de tu skill.

Deja un comentario