【问题标题】:Get location from Alexa Skills Kit (ASK)从 Alexa Skills Kit (ASK) 获取位置
【发布时间】:2016-05-02 15:30:18
【问题描述】:

我正在寻找一种方法来获取用户的位置,理想情况下是经度/纬度,但地址也可以,从 Alexa 技能包请求到我的自定义技能。此外,我不想让用户链接到我的应用端的帐户。

这可能吗?如果有,怎么做?

【问题讨论】:

    标签: alexa-skills-kit


    【解决方案1】:

    亚马逊现已 (2017-04-05) 添加了此功能。请参阅 their blog post 了解他们的新 Device Address API。

    使用此新 API,您可以获得设备的地址(邮政编码或完整地址),如客户的设备设置中指定的那样。

    您可以使用地理编码 API(例如 Google Maps API 的一部分)将地址转换为位置坐标。

    【讨论】:

    • Google Maps API 并不是一个真正的选择,因为它们的使用政策非常严格:“Geocoding API 只能与在 Google 地图上显示结果一起使用。禁止使用 Geocoding API数据而不显示 Google 地图。”
    • @Pyves 我相信选择在设备上显示地图(例如 Echo Show)可以/会满足这个要求。
    【解决方案2】:

    根据this thread on the Amazon Developer forums,目前(截至 2016 年 5 月)没有一种方法可以通过公开可用的 API 获取用户位置。唯一能够做到这一点的技能,例如 Uber 或 Domino,是利用 Alexa Skills Kit 无法提供的 API。但是,希望可以添加它,因为“Jamie@Amazon”在那次讨论中留下了这个回复:

    你好,

    感谢发帖。

    现在已将其添加到路线图中。感谢您的反馈。

    杰米

    但是,在撰写本文时,尚未提供有关此类功能实施的进一步更新。

    【讨论】:

    • 这个答案现在已经过时了,小心!请参阅下面的其他答案
    【解决方案3】:

    正如@Tom 所指出的,现在可以在您的自定义技能中获取设备地址。如果您使用 Python 来创建自己的技能,那么实现新 API 非常容易。我已经写了一篇关于它的详细博客文章here。它还描述了如何获取检索到的地址的相应坐标,因此它可能对您有用。简而言之,这里有一个 Python 函数可以帮助您入门。我使用非常方便的 Flask-Ask 库来提高我的技能。因此,很容易获得 deviceId 和许可令牌对象的值。这些由 Alexa 包含在发送到您的技能的 JSON 请求中。它们是构建对 Amazon 地址 API 端点的请求所必需的:

    import requests
    from flask_ask import Ask, context
    
    def get_alexa_location():
        URL =  "https://api.amazonalexa.com/v1/devices/{}/settings" \
               "/address".format(context.System.device.deviceId)
        TOKEN =  context.System.user.permissions.consentToken
        HEADER = {'Accept': 'application/json',
                 'Authorization': 'Bearer {}'.format(TOKEN)}
        r = requests.get(URL, headers=HEADER)
        if r.status_code == 200:
            return(r.json())
    

    函数在调用成功时会返回如下内容:

    {u'city': u'Berlin', u'countryCode': u'DE',
    u'addressLine1': u'42 Unter den Linden',
    u'addressLine2': None, u'stateOrRegion': u'Berlin',
    u'districtOrCounty': u'Berlin', u'postalCode': u'10117',
    u'addressLine3': None}
    

    您可以使用geopy 将此地址转换为坐标。

    【讨论】:

    • 你如何添加 flask_ask 库呢?我已经尝试了上面的代码,但是当它尝试在开头导入 flask_ask 模块时,它现在使我的 lambda 函数失败
    • pip install flask-ask 应该足够了。您应该查看文档:flask-ask.readthedocs.io
    • 有谁知道不使用烧瓶询问的方法。
    【解决方案4】:

    现在可以使用Alexa Location Services 获取用户的实时地理位置(经度/纬度),这避免了按照其他答案的建议与单独的地理编码 API 集成。有关此功能发布的官方信息,请参阅相关的blogpost。

    如果设备兼容(context.System.device.supportedInterfaces.Geolocation 存在),定位服务正在运行,并且您的技能已授予alexa::devices:all:geolocation:read 权限,您可以通过请求的上下文检索Geolocation 对象,该对象将是相当于以下 JSON 负载:

    "Geolocation":{ 
        "locationServices": { 
            "access": "ENABLED",
            "status": "RUNNING",   
        },
        "timestamp": "2018-03-25T00:00:00Z+00:00",
        "coordinate": {
            "latitudeInDegrees": 38.2,
            "longitudeInDegrees": 28.3,
            "accuracyInMeters": 12.1 
        },
        "altitude": {
            "altitudeInMeters": 120.1,
            "accuracyInMeters": 30.1
        },
        "heading": { 
            "directionInDegrees": 180.0,
            "accuracyInDegrees": 5.0  
        },
        "speed": { 
            "speedInMetersPerSecond": 10.0,
            "accuracyInMetresPerSecond": 1.1
        }       
    }
    

    【讨论】:

      【解决方案5】:

      请按照以下 URL 从 Alexa Skills Kit (ASK) 获取位置

      网址: https://api.eu.amazonalexa.com/v1/devices/{devicesId}/settings/address/countryAndPostalCode

      您的标题将如下所示:

      主机:api.eu.amazonalexa.com [保持你的主机,你可以从 json 测试期间从开发者帐户获得] 接受:应用程序/json 授权:Bearer [KEEP YOUR apiAccessToken here]

      如果请求成功,您将得到如下响应:

      { "countryCode": "IN", “邮编”:“560102” }

      确保您已在 Alexa 应用中启用权限,并授予相应技能的权限,有关权限配置的更多详细信息,请参考以下 URL

      https://developer.amazon.com/blogs/alexa/post/0c975fc7-17dd-4f5c-8343-a37024b66c99/alexa-skill-recipe-using-the-device-address-api-to-request-information

      【讨论】:

        猜你喜欢
        • 2016-07-28
        • 2016-04-01
        • 1970-01-01
        • 2016-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 2017-05-29
        相关资源
        最近更新 更多