Как только я начал развивать свой навык Alexa Skill (молочный ребенок), я понял, что нет простого способа узнать текущее время пользователя. Поле timestamp из запроса предоставляет только время с сервера, на котором размещен навык. В случае использования моего навыка необходимо было получить текущее время пользователя. Я собираюсь показать в этом посте один способ сэкономить время пользователей, запросив у пользователя почтовый индекс с конфигурацией разрешений для навыка.
Обобщенный процесс можно описать следующими шагами:
- Получите ZipCode и countryCode из Alexa API
- Получить город, штат, широту, долгосрочность из Google Maps Geocode API
- Получить timezoneId из API часовых поясов Google Maps
- Сохраните timezoneId в таблице пользователей (чтобы вам не приходилось повторять шаги, описанные выше)
- Получить текущее время с помощью пакета момент-часовой пояс
Теперь давайте рассмотрим детали по порядку, а в конце я поделюсь полным кодом.
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}×tamp=${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. Спасибо за прочтение.