Как только я начал развивать свой навык Alexa Skill (молочный ребенок), я понял, что нет простого способа узнать текущее время пользователя. Поле timestamp из запроса предоставляет только время с сервера, на котором размещен навык. В случае использования моего навыка необходимо было получить текущее время пользователя. Я собираюсь показать в этом посте один способ сэкономить время пользователей, запросив у пользователя почтовый индекс с конфигурацией разрешений для навыка.

Обобщенный процесс можно описать следующими шагами:

  1. Получите ZipCode и countryCode из Alexa API
  2. Получить город, штат, широту, долгосрочность из Google Maps Geocode API
  3. Получить timezoneId из API часовых поясов Google Maps
  4. Сохраните timezoneId в таблице пользователей (чтобы вам не приходилось повторять шаги, описанные выше)
  5. Получить текущее время с помощью пакета момент-часовой пояс

Теперь давайте рассмотрим детали по порядку, а в конце я поделюсь полным кодом.

1. Получение почтового индекса и кода страны

Прежде всего, убедитесь, что ваше приложение настроено так, чтобы запрашивать эту информацию. На вкладке конфигурации установите следующий флажок и сохраните.

Затем в нашем коде навыков нам нужно вызвать API amazon alexa, чтобы получить почтовый индекс и код страны (я буду использовать axios в своей демонстрации, кстати, но вы можете использовать свою собственную библиотеку HTTP-запросов)

const consentToken = this.event.session.user.permissions.consentToken;
const deviceId = this.event.context.System.device.deviceId;
axios.get(`https://api.amazonalexa.com/v1/devices/${deviceId}/settings/address/countryAndPostalCode`, { 
  headers: { 'Authorization': `Bearer ${consentToken}` }
})
.then((response) => {
  countryCode = response.data.countryCode
  zipcode = response.data.postalCode
});

2. Получите город, штат, широту и долготу из Google Maps Geocode API.

В этом разделе наша цель - получить город, штат, широту и долготу (приблизительные) почтового индекса и кода страны, предоставленных Alexa API. Для этого мы будем использовать API геокода Google Maps, поэтому вам нужно будет получить токен из консоли Google API.

axios.get(`https://maps.googleapis.com/maps/api/geocode/json?address=${countryCode},${zipcode}&key=${process.env.MAPS_TOKEN}`)
.then((response) => {
  city = response.data.results[0].address_components[1].short_name
  state = response.data.results[0].address_components[3].short_name
  lat = response.data.results[0].geometry.location.lat
  lng = response.data.results[0].geometry.location.lng
})

3. Получите timezoneId из API часовых поясов Google Maps.

В этом разделе наша цель - получить timezoneId для заданных координат широты и долготы. Для этого мы будем использовать API часовых поясов Google Maps.

axios.get(`https://maps.googleapis.com/maps/api/timezone/json?location=${lat},${lng}&timestamp=${moment().unix()}&key=${process.env.MAPS_TOKEN}`)
.then((response) => {
  timeZoneId = response.data.timeZoneId
})

TimezoneId - это строка, представляющая часовой пояс, например America / New_York или America / Los_Angeles.

4. Сохраните timezoneId в таблице пользователей (* необязательно)

С помощью timezoneId легко получить текущее время часового пояса, но перед этим рекомендуется сохранить timezoneId в таблице пользователей, чтобы вам не приходилось повторять шаги, которые мы только что описали выше.

Я не буду показывать код для этого, поскольку это зависит от того, какую базу данных вы используете и как вы храните информацию о пользователях.

5. Получите текущее время с помощью пакета момент-часовой пояс.

Получив timezoneId, мы можем использовать момент-часовой пояс пакета npm, чтобы получить текущее время для данного timezoneId.

const currDate = new moment()
const userDatetime = currDate.tz(timeZoneId).format('YYYY-MM-DD HH:mm')

Вот мой полный код:

Это мой способ узнать текущее время пользователя. Надеюсь, он вам понравится и вы сможете использовать его в своих навыках работы с Alexa. Спасибо за прочтение.