1

我正在尝试使用 Python 的 requests 模块向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

4 回答 4

3

由于您获得无效范围的原因之一是您的技能清单中没有包含事件,因此我在此处包含了一些步骤。我发现使用 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 应用程序中的通知

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

于 2019-01-28T14:39:11.617 回答
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"))
于 2018-12-17T09:35:47.557 回答
0

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

如果问题仍然存在,很可能是因为您没有在技能清单中包含主动事件所需的必要权限。要向技能清单添加必要的权限,您需要使用技能管理 API 和 ASK Cli。按照文档的这一部分并访问其中引用的链接,以正确地为您的技能添加所需的权限 - https://developer.amazon.com/docs/smapi/proactive-events-api.html#onboard-smapi

使用技能模式成功添加事件发布后,您应该能够成功生成令牌。请随时询问您是否希望我详细说明确切的步骤。干杯!

于 2018-12-17T17:48:20.923 回答
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
于 2019-01-28T09:15:26.370 回答