Запрос активных событий Amazon Alexa в Python - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь сделать запрос к Proactive Events API с помощью модуля запросов Python.

Однако я всегда получаю ответ о том, что область действия недопустима.Кто-нибудь может помочь?Что я делаю неправильно?Мой код выглядит так:

@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 голосов
/ 28 января 2019

Поскольку одна из причин, по которой вы получаете недопустимую область, заключается в том, что у вас нет событий, включенных в манифест вашего навыка, я привожу некоторые шаги здесь.Я нашел довольно громоздким использование SMAPI для обновления манифеста навыка, поэтому вместо этого я использовал ask cli.

  • install ask-cli: получите код авторизации для вашей учетной записи amazon.В моем случае это не лямбда-функция AWS, а внешний веб-сервер
  • , получающий манифест навыка в формате 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 для вашего конкретного навыка

Теперь вы сможете получить токен, и следующим шагом будет отправка уведомленияк устройству

0 голосов
/ 17 декабря 2018

Как ранее спрашивал Картик, вы пробовали звонить через почтальона?Сначала я предлагаю попробовать через почтальона, прежде чем пытаться его кодировать.

Если проблема по-прежнему сохраняется, скорее всего, потому что вы не включили необходимые разрешения для Проактивных событий в свой манифест навыков.Чтобы добавить необходимые разрешения в Skill Manifest, вам нужно использовать API Skill Management & ASK Cli.Следуйте этому разделу документации и перейдите по ссылкам, указанным там, чтобы правильно добавить необходимые разрешения для вашего навыка - https://developer.amazon.com/docs/smapi/proactive-events-api.html#onboard-smapi

Как только вы успешно добавили события и публикации с помощью схемы умений вы сможете успешно сгенерировать токен.Пожалуйста, не стесняйтесь спросить, хотите ли вы, чтобы я уточнил точные шаги.Ура!

0 голосов
/ 28 января 2019

Это то, что я пытался, и это сработало:

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
0 голосов
/ 17 декабря 2018

Вы пытались сделать вызов API с помощью любого другого метода?Я только что попробовал это с Почтальоном, и это сработало для меня.

Мой 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"))
...