Alexa Flask Python Skill using flask-ask-sdk - modification of Amazon "Hello World" Example
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
# You'll need a TLS terminating proxy (apache,nginx) in front of this | |
# This is a simple Hello World Alexa Skill, built using | |
# the decorators approach in skill builder. | |
import logging | |
from flask import Flask | |
from ask_sdk_core.skill_builder import SkillBuilder | |
from flask_ask_sdk.skill_adapter import SkillAdapter | |
from ask_sdk_core.utils import is_request_type, is_intent_name | |
from ask_sdk_core.handler_input import HandlerInput | |
from ask_sdk_model.ui import SimpleCard | |
from ask_sdk_model import Response | |
app = Flask(__name__) | |
sb = SkillBuilder() | |
logger = logging.getLogger(__name__) | |
logger.setLevel(logging.INFO) | |
@sb.request_handler(can_handle_func=is_request_type("LaunchRequest")) | |
def launch_request_handler(handler_input): | |
"""Handler for Skill Launch.""" | |
# type: (HandlerInput) -> Response | |
speech_text = "Welcome to the Alexa Skills Kit, you can say hello!" | |
return handler_input.response_builder.speak(speech_text).set_card( | |
SimpleCard("Hello World", speech_text)).set_should_end_session( | |
False).response | |
@sb.request_handler(can_handle_func=is_intent_name("HelloWorldIntent")) | |
def hello_world_intent_handler(handler_input): | |
"""Handler for Hello World Intent.""" | |
# type: (HandlerInput) -> Response | |
speech_text = "Hello Python World from Decorators!" | |
return handler_input.response_builder.speak(speech_text).set_card( | |
SimpleCard("Hello World", speech_text)).set_should_end_session( | |
True).response | |
@sb.request_handler(can_handle_func=is_intent_name("AMAZON.HelpIntent")) | |
def help_intent_handler(handler_input): | |
"""Handler for Help Intent.""" | |
# type: (HandlerInput) -> Response | |
speech_text = "You can say hello to me!" | |
return handler_input.response_builder.speak(speech_text).ask( | |
speech_text).set_card(SimpleCard( | |
"Hello World", speech_text)).response | |
@sb.request_handler( | |
can_handle_func=lambda handler_input: | |
is_intent_name("AMAZON.CancelIntent")(handler_input) or | |
is_intent_name("AMAZON.StopIntent")(handler_input)) | |
def cancel_and_stop_intent_handler(handler_input): | |
"""Single handler for Cancel and Stop Intent.""" | |
# type: (HandlerInput) -> Response | |
speech_text = "Goodbye!" | |
return handler_input.response_builder.speak(speech_text).set_card( | |
SimpleCard("Hello World", speech_text)).response | |
@sb.request_handler(can_handle_func=is_intent_name("AMAZON.FallbackIntent")) | |
def fallback_handler(handler_input): | |
"""AMAZON.FallbackIntent is only available in en-US locale. | |
This handler will not be triggered except in that locale, | |
so it is safe to deploy on any locale. | |
""" | |
# type: (HandlerInput) -> Response | |
speech = ( | |
"The Hello World skill can't help you with that. " | |
"You can say hello!!") | |
reprompt = "You can say hello!!" | |
handler_input.response_builder.speak(speech).ask(reprompt) | |
return handler_input.response_builder.response | |
@sb.request_handler(can_handle_func=is_request_type("SessionEndedRequest")) | |
def session_ended_request_handler(handler_input): | |
"""Handler for Session End.""" | |
# type: (HandlerInput) -> Response | |
return handler_input.response_builder.response | |
@sb.exception_handler(can_handle_func=lambda i, e: True) | |
def all_exception_handler(handler_input, exception): | |
"""Catch all exception handler, log exception and | |
respond with custom message. | |
""" | |
# type: (HandlerInput, Exception) -> Response | |
logger.error(exception, exc_info=True) | |
speech = "Sorry, there was some problem. Please try again!!" | |
handler_input.response_builder.speak(speech).ask(speech) | |
return handler_input.response_builder.response | |
# handler = sb.lambda_handler() | |
skill_adapter = SkillAdapter( | |
skill=sb.create(), skill_id='<YOUR-SKILL-ID-HERE>', app=app) | |
@app.route("/", methods=['POST']) | |
def invoke_skill(): | |
return skill_adapter.dispatch_request() | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment