【问题标题】:Alexa skills custom slot for date times日期时间的 Alexa 技能自定义插槽
【发布时间】:2018-07-06 13:59:19
【问题描述】:

所以,我正在使用 Amazon Echo 开展一个项目。我的目标是记录我何时执行特定操作并将其记录到数据库中。我的问题是时区,我通过使用纪元时间来避免这种情况。但是,根据我对意图的自定义插槽的了解,我的选择是没有时间的格式化日期字符串,或者没有日期的格式化时间字符串,最重要的是,我无法获取客户的时区根据我在 google fu 中找到的一些论坛帖子专门要求它。

回声只是讨厌约会吗?这似乎应该很容易,但我正在努力弄清楚如何去做,而不会感到非常尴尬并询问他们住在哪里,这样我就可以查找他们的时区。我已经不得不做出一个转变,从告诉他们他们做某事的具体时间到他们做某事的时间,因为我无法将日期传递回 Echo 并期望它能够翻译它。这是我必须做的另一个愚蠢的支点吗?

【问题讨论】:

    标签: date alexa-skills-kit


    【解决方案1】:

    正确,您无法从 Alexa 获取客户的 TZ 或位置。这是一个隐私问题。唯一的办法就是自己索取。

    有一个“五位数字”的自定义插槽,非常适合邮政编码。这是获取用户大致位置的最简单方法。

    如果您想获得更多创意,由于 Echo(几乎)仅在美国使用,您只需将其缩小到四个时区之一。 (牺牲了阿拉斯加、夏威夷和亚利桑那半年的时间。)你可以问他们在哪个时区,哪个时区不那么麻烦。

    或者,如果您想发挥创意,可以开个玩笑。

    • 答:“小测验:你是在东部标准时间吗?”
    • U:“否”
    • A:“Drat。让我再猜一下。你看起来像个山地人。”

    ...

    是的。这是一个令人讨厌的限制。但如果你能找到一种新颖的方法来解决它,你的技能会更受人喜爱。

    【讨论】:

    【解决方案2】:

    您似乎(还)无法检测到用户的时区,但您应该仍然能够实现您的目标。一些想法:

    • 您可以让系统完全不知道时区。每个用户可能有不同的时区,但特定用户的所有时间都在同一个时区,因此任何持续时间计算都可以正常工作。
    • 没有 DATETIME 槽类型,因此您需要将每个槽分别处理为 AMAZON.DATE 和 AMAZON.TIME。例如“在 {DATE} {TIME} 标记完成”
    • 另外,如果您是在现实世界中标记完成日期时间,您能否只在代码中生成时间戳,而不是让他们说出来?
    • 如有必要,请求 Zip 可能是设置时区的快捷方式。
    • Hacky:如果您使用帐户关联,您可能能够从登录页面的客户端检测到他们的时区。

    在用户时区中的服务器时间戳和口语时间之间进行转换会出现问题,但也许您可以解决这个问题,直到亚马逊包含时区数据。

    【讨论】:

      【解决方案3】:

      有一种方法可以从亚马逊提供的国家代码和邮政编码中找到用户的时区。您只需要在开发者控制台开启权限即可。

      之后,每当您收到来自 Alexa 语音服务的请求时,您都会收到一个consent token。表示用户已授予权限。

      然后您可以通过查询 Google API 来获取用户的时区。下面提到了相同的python代码。

      # to get the country code and postal code of user
      res = requests.get('{0}/v1/devices/{1}/settings/address/countryAndPostalCode'.format(context.System.apiEndpoint, context.System.device.deviceId),
                         headers = {'Authorization':'Bearer {}'.format(context.System.apiAccessToken)}).json()
      postCode = res['postalCode']
      countryCode = res['countryCode']
      
      # key specific to the user
      apiAccessKey = 'your-api-key'
      # Google Geocoding API: provides latitude and longitude from country code and postal code
      res = requests.get('https://maps.googleapis.com/maps/api/geocode/json?address={0},{1}&key={2}'
                         .format(countryCode, postCode, apiAccessKey)).json()
      
      lat = res['results'][0]['geometry']['location']['lat']
      lng = res['results'][0]['geometry']['location']['lng']
      
      # Google's Time Zone API: provides timezone from latitude and longitude.
      res = requests.get('https://maps.googleapis.com/maps/api/timezone/json?location={0},{1}&timestamp={2}&key={3}'
                         .format(lat, lng, datetime.datetime.timestamp(datetime.datetime.now()),apiAccessKey)).json()
      
      timezone = res['timeZoneId']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 2017-06-15
        • 1970-01-01
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 2022-08-17
        相关资源
        最近更新 更多