#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 , где есть множество примеров функциональности базовых навыков, которые полезны при запуске.