Alexa python 获取请求 returns 空。拉姆达很好
Alexa python get request returns null. Lambda is fine
您好,我正在尝试使用请求从后端请求 Alexa 获得响应。我在这些示例中使用 Python:https://github.com/alexa/skill-sample-python-fact。但是我的后端是 NodeJS。
来自我的 Lambda:
URL = 'https://alexa-app-nikko.herokuapp.com/alexa'
def get_post_response():
r = requests.get(URL)
speech_output = str(r.text)
return response(speech_response(speech_output, True))
在我的后端,它被路由到 /alexa:
router.get('/', function(request, response) {
//console.log('Logged from Alexa.');
response.send('Hello World, Alexa!');
});
我在 Lambda 上对其进行了测试,结果很好:
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "Hello World, Alexa!"
},
"shouldEndSession": true
}
}
但是我在技能输出上得到了 null
或来自 Alexa 的响应:
"There was a problem with the requested skill's response"
我如何从开发人员控制台进行调试,因为看起来 Lambda 没问题。
我不知道这个问题和我的要求有什么关系。现在正在运行。
def on_intent(request, session):
""" called on receipt of an Intent """
intent_name = request['intent']['name']
#intent_slots = request['intent']['slots']
# process the intents
if intent_name == "DebugIntent":
return get_debug_response()
elif intent_name == "PostIntent":
return get_post_response()
elif intent_name == "PowerIntent":
return get_power_response(request)
#return get_power_response(intent_slots)
# ----------- Amazon Built-in Intents -----------------
elif intent_name == "AMAZON.HelpIntent":
return get_help_response()
elif intent_name == "AMAZON.StopIntent":
return get_stop_response()
elif intent_name == "AMAZON.CancelIntent":
return get_stop_response()
elif intent_name == "AMAZON.FallbackIntent":
return get_fallback_response()
else:
print("invalid Intent reply with help")
return get_help_response()
我调试了它,我得到的是关键字 'slots' 的问题,所以我在我的代码中删除了 intent_slots = request['intent']['slots']
,我也用它来将它传递给另一个函数 return get_power_response(intent_slots)
.我将其注释掉并替换或只是放置 def on_intent(request, session):
中的原始 request
。
根据您自己的回答:
问题是,当您调用 LaunchIntent
或其他意图如 AMAZON.StopIntent
时,它们中没有密钥 "slots"
。你试图访问 slots
的值,它应该抛出 KeyError。
你可以做的是,当你确定调用任何使用某些槽的特定意图时,然后你尝试访问它们。
我就是这样做的:
def getSlotValue(intent, slot):
if 'slots' in intent:
if slot in intent['slots']:
if 'value' in intent['slots'][slot] and len(intent['slots'][slot]['value']) > 0:
return intent['slots'][slot]['value']
return -1
并尝试访问您意图函数中的插槽值(在您的 get_post_response
或 get_power_response
中)。
您好,我正在尝试使用请求从后端请求 Alexa 获得响应。我在这些示例中使用 Python:https://github.com/alexa/skill-sample-python-fact。但是我的后端是 NodeJS。
来自我的 Lambda:
URL = 'https://alexa-app-nikko.herokuapp.com/alexa'
def get_post_response():
r = requests.get(URL)
speech_output = str(r.text)
return response(speech_response(speech_output, True))
在我的后端,它被路由到 /alexa:
router.get('/', function(request, response) {
//console.log('Logged from Alexa.');
response.send('Hello World, Alexa!');
});
我在 Lambda 上对其进行了测试,结果很好:
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "Hello World, Alexa!"
},
"shouldEndSession": true
}
}
但是我在技能输出上得到了 null
或来自 Alexa 的响应:
"There was a problem with the requested skill's response"
我如何从开发人员控制台进行调试,因为看起来 Lambda 没问题。
我不知道这个问题和我的要求有什么关系。现在正在运行。
def on_intent(request, session):
""" called on receipt of an Intent """
intent_name = request['intent']['name']
#intent_slots = request['intent']['slots']
# process the intents
if intent_name == "DebugIntent":
return get_debug_response()
elif intent_name == "PostIntent":
return get_post_response()
elif intent_name == "PowerIntent":
return get_power_response(request)
#return get_power_response(intent_slots)
# ----------- Amazon Built-in Intents -----------------
elif intent_name == "AMAZON.HelpIntent":
return get_help_response()
elif intent_name == "AMAZON.StopIntent":
return get_stop_response()
elif intent_name == "AMAZON.CancelIntent":
return get_stop_response()
elif intent_name == "AMAZON.FallbackIntent":
return get_fallback_response()
else:
print("invalid Intent reply with help")
return get_help_response()
我调试了它,我得到的是关键字 'slots' 的问题,所以我在我的代码中删除了 intent_slots = request['intent']['slots']
,我也用它来将它传递给另一个函数 return get_power_response(intent_slots)
.我将其注释掉并替换或只是放置 def on_intent(request, session):
中的原始 request
。
根据您自己的回答:
问题是,当您调用 LaunchIntent
或其他意图如 AMAZON.StopIntent
时,它们中没有密钥 "slots"
。你试图访问 slots
的值,它应该抛出 KeyError。
你可以做的是,当你确定调用任何使用某些槽的特定意图时,然后你尝试访问它们。
我就是这样做的:
def getSlotValue(intent, slot):
if 'slots' in intent:
if slot in intent['slots']:
if 'value' in intent['slots'][slot] and len(intent['slots'][slot]['value']) > 0:
return intent['slots'][slot]['value']
return -1
并尝试访问您意图函数中的插槽值(在您的 get_post_response
或 get_power_response
中)。