Python flask-ask中的Amazon Alexa主动事件请求

时间:2018-12-15 17:06:24

标签: python python-requests alexa flask-ask

我正在尝试使用Python的请求模块向Proactive Events API发出请求。

但是,我总是收到范围无效的响应。 有人可以帮忙吗?我究竟做错了什么?我的代码如下:

@ask.launch
def launch():
    content_type = "application/x-www-form-urlencoded;charset=utf-8"
    client_id = "amzn1.application-oa2-client.6a48XXXXXXX408"
    client_secret = "592XXXXxxxxxxx6"
    scope = "alexa::proactive_events"
    grant_type = "client_credentials"

    data = {"grant_type": grant_type, "client_id": client_id, "client_secret": client_secret, "scope": scope}
    r = requests.post("https://api.amazon.com/auth/O2/token", data=data, headers={"content-type": content_type})

    speech = render_template("welcome")
    reprompt = render_template("welcome_reprompt")
    return question(speech).reprompt(reprompt)

那是我得到的答复:

{'error_description': 'The request has an invalid parameter : scope', 'error': 'invalid_scope'}

4 个答案:

答案 0 :(得分:1)

您是否尝试过通过其他任何方法进行API调用?我只是和Postman尝试过,对我有用。

我的Python有点生锈,但这是Postman为Python自行生成的代码。也许这应该有所帮助?

import http.client

conn = http.client.HTTPConnection("api,amazon,com")

payload = "grant_type=client_credentials&client_id=amzn1.application-oa2-client.whatever-value&client_secret=client-secret&scope=alexa%3A%3Aproactive_events&undefined="

headers = {
  'Content-Type': "application/x-www-form-urlencoded"
}

conn.request("POST", "auth,O2,token", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))

答案 1 :(得分:1)

由于得到无效作用域的原因之一是您没有在技能清单中包含事件,因此在此包括一些步骤。我发现使用SMAPI更新技能清单非常麻烦,所以我改用Ask cli。

  • 安装ask-cli:获取您的亚马逊帐户的授权代码。在我的情况下,后端不是AWS Lambda函数,而是外部Web服务器
  • 以json格式获取技能清单: ask api get-skill -s "amzn1.ask.skill.ZZZYYYZZ" --stage development > skill.json
  • 将通知权限和事件元素添加到清单:

    { "name": "alexa::devices:all:notifications:write" }

    "events": { "publications": [ { "eventName": "AMAZON.AAABBBCC" } ], "endpoint": { "uri": "https://XXXYYYZZ:443/whatevercontext" } }

  • 更新清单: ask api update-skill -s "amzn1.ask.skill.ZZZYYYZZ" --stage development -f skill.json

    • 根据您的特定技能在alexa应用程序中启用通知

现在您应该可以获取令牌,下一步就是将通知发送到设备

答案 2 :(得分:0)

如Karthik先前所问,您是否尝试过邮递员拨打电话?我首先建议在尝试编码之前先尝试通过邮递员。

如果问题仍然存在,则很可能是因为您尚未在“技能清单”中包含“主动事件”所需的必要权限。 要将必要的权限添加到“技能清单”,您需要使用“技能管理API”和“ ASK Cli”。 请遵循文档的本部分,并访问那里引用的链接以正确地为您的技能添加所需的权限-https://developer.amazon.com/docs/smapi/proactive-events-api.html#onboard-smapi

一旦您成功添加了具有技能模式的事件出版物,您就应该能够成功生成令牌。 请问您是否要我详细说明确切步骤。 干杯!

答案 3 :(得分:0)

这是我尝试过的并且有效的方法:

amazon_token_url = "https://api.amazon.com/auth/O2/token"
headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}
body = "grant_type=client_credentials&client_id=amzn1.application-oa2-client.XXXYYYZZ&client_secret=ZZZYYYXXX&scope=alexa::proactive_events"
log.debug("Sending token request with body: %s", body)
resp = requests.post(amazon_token_url, data=body, headers=headers)
resp_json = json.loads(resp.content.decode('utf-8'))

if (resp.status_code < 299) and (resp.status_code > 199):
   log.debug("token received from Amazon")
   log.debug("Content : %s", resp.content)
   token = resp_json["access_token"]
   return token