Alexa python get请求返回null。 Lambda很好

时间:2018-07-04 14:54:06

标签: python python-requests aws-lambda alexa alexa-skills-kit

嗨,我正在尝试从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
  }
}

但是我在技能输出或Alexa的回复中得到null

"There was a problem with the requested skill's response"

由于Lambda看起来不错,因此如何从开发者控制台进行调试。

2 个答案:

答案 0 :(得分:0)

我不知道此问题与我的请求有什么关系。现在正在工作。

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)。我将其注释掉,然后替换或仅放置了request中的原始def on_intent(request, session):

答案 1 :(得分:0)

根据您自己的答案:

问题是,当您调用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_responseget_power_response中)。