Last active
August 12, 2021 16:19
-
-
Save jamespo/0522d39eff41a5acc0491e1cd5e1d957 to your computer and use it in GitHub Desktop.
Alexa Flask Python Skill using flask-ask-sdk - modification of Amazon "Hello World" Example
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
#!/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