Ошибка ключа Alexa Lambda: «намерение»

#python #amazon-web-services #aws-lambda #alexa

#python #amazon-веб-сервисы #aws-lambda #alexa

Вопрос:

Я не очень разбираюсь в программировании, но уже несколько лет работаю с Raspberry Pi. Я хотел использовать Alexa в Pi и запускать скрипты для включения и выключения GPIO. Попробовав несколько руководств, я дошел до того, что подключил AWS Lambda с помощью навыка Alexa. Проблема в том, что я получаю ошибку при тестировании навыка. «Ответ навыка был помечен как сбой Идентификатор запроса Luces: amzn1.echo-api.request.49687858-4c4f-482f-b82d-dd0ffedc9841

Целевое лямбда-приложение вернуло ответ об ошибке»

Я проверяю журнал в облаке AWS, и вот что я получил.

 'intent': KeyError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 40, in lambda_handler
    intent_name = event['request']['intent']['name']
KeyError: 'intent 
  

Я понятия не имею, что делать. Я адаптировал код из hackster.io учебное пособие. Мой лямбда-код с python 2.7:

 import boto3

access_key = 
access_secret = 
region =
queue_url = 

def build_speechlet_response(title, output, reprompt_text, should_end_session):
    return {
        'outputSpeech': {
            'type': 'PlainText',
            'text': output
        },
        'card': {
            'type': 'Simple',
            'title': "SessionSpeechlet - "   title,
            'content': "SessionSpeechlet - "   output
        },
        'reprompt': {
            'outputSpeech': {
                'type': 'PlainText',
                'text': reprompt_text
            }
        },
        'shouldEndSession': should_end_session
    }

def build_response(session_attributes, speechlet_response):
    return {
        'version': '1.0',
        'sessionAttributes': session_attributes,
        'response': speechlet_response
    }

def post_message(client, message_body, url):
    response = client.send_message(QueueUrl = url, MessageBody= message_body)
    
def lambda_handler(event, context):
    client = boto3.client('sqs', aws_access_key_id = access_key, aws_secret_access_key = access_secret, region_name = region)
    intent_name = event['request']['intent']['name']
    if intent_name == "LightOn":
        post_message(client, 'on', queue_url)
        message = "on"
    elif intent_name == "LightOff":
        post_message(client, 'off', queue_url)
        message = "off"
    else:
        message = "Unknown"
        
    speechlet = build_speechlet_response("Mirror Status", message, "", "true")
    return build_response({}, speechlet)
  

Я просто хочу включить светодиод, а затем выключить, но я не знаю, нужен ли мне весь этот код. Если есть простой способ закодировать это в lamba, пожалуйста, скажите мне.

Заранее большое вам спасибо за помощь!

Ответ №1:

Существует несколько разных типов запросов, «стандартными» из которых являются: CanFulfillIntentRequest , LaunchRequest , IntentRequest , и SessionEndedRequest .

Сначала вы открываете навык, он будет LaunchRequest отправлен, который не содержит intent параметра. Вероятно, именно поэтому вы получаете KeyError .

Хороший подход — проверить тип запроса, прежде чем пытаться его обработать.

 if event['request']['type'] == "LaunchRequest":
    print("I'm a launch request.")
elif event['request']['type'] == "IntentRequest":
    print("I'm an intent request.")
  

Различные типы запросов и параметры, которые они могут содержать, можно найти в документации Alexa .

Комментарии:

1. Итак, LaunchRequest это похоже на объявление переменной? Итак, мне нужно начать с import boto3 LaunchRequest == intent ?

2. Хорошо! Мне удалось сделать то, что вы рекомендовали. Он напечатал «Я запрос на запуск». и получил ту же ошибку с запросом. Итак, мне нужно изменить это на «запрос намерения»?

3. @PablinhoRiveiro Если вы пытаетесь разобраться в том, как работают навыки Alexa и как они взаимодействуют с функциями lambda, хорошей идеей, вероятно, будет взглянуть на страницу Alexa GitHub , где есть множество примеров функциональности базовых навыков, которые полезны при запуске.