4

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

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

4

3 回答 3

1

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

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

如果您想获得更多创意,因为 Echo(几乎)仅在美国使用,您只需将其缩小到四个时区之一。(以阿拉斯加、夏威夷和亚利桑那州半年为代价。)你可以问他们在哪个时区,哪个时区干扰较小。

或者,如果你想发挥创造力,就开个玩笑吧。

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

...

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

于 2016-07-15T03:06:50.567 回答
1

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

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

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

于 2016-09-28T02:35:51.960 回答
0

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

之后,每当您收到来自 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']
于 2018-07-06T05:59:19.700 回答