ЗАДАЧА:
garmin.cn
и garmin.com
Если что-то не работает, сначала проверьте https://connect.garmin.com/status/.
В настоящее время большинство предыдущих функций работают, но некоторые Rest API не добавлены, например Gear
, Workout
, Badge
и т. д. Поэтому, если вам нужны эти функции, добавьте PR.
Все вышеперечисленные работы вдохновлены https://github.com/matin/garth. Большое спасибо.
Мощная библиотека JavaScript для подключения к Garmin Connect для отправки и получения данных о состоянии здоровья и тренировках. Он поставляется с некоторыми предопределенными методами для получения и установки различных типов данных для вашей учетной записи Garmin, но также имеет возможность выполнять собственные запросы GET
, POST
и PUT
в настоящее время поддерживаются. Это позволяет легко реализовать все, что может отсутствовать, в соответствии с вашими потребностями.
Эта библиотека потребует от вас добавить в корень вашего проекта файл конфигурации с именем garmin.config.json
содержащий ваше имя пользователя и пароль для службы Garmin Connect.
{
"username" : " [email protected] " ,
"password" : " MySecretPassword "
}
$ npm install garmin-connect
const { GarminConnect } = require ( 'garmin-connect' ) ;
// Create a new Garmin Connect Client
const GCClient = new GarminConnect ( {
username : '[email protected]' ,
password : 'MySecretPassword'
} ) ;
// Uses credentials from garmin.config.json or uses supplied params
await GCClient . login ( ) ;
const userProfile = await GCClient . getUserProfile ( ) ;
Теперь вы можете проверить userProfile.userName
, чтобы убедиться, что ваш вход в систему прошел успешно.
GCClient . saveTokenToFile ( '/path/to/save/tokens' ) ;
Результат:
$ ls /path/to/save/tokens
oauth1_token.json oauth2_token.json
Повторное использование токена:
GCClient . loadTokenByFile ( '/path/to/save/tokens' ) ;
const oauth1 = GCClient . client . oauth1Token ;
const oauth2 = GCClient . client . oauth2Token ;
// save to db or other storage
...
Повторное использование токена:
GCClient . loadToken ( oauth1 , oauth2 ) ;
Это экспериментальная функция, которая может еще не обеспечить полную стабильность.
После успешного входа в систему методы получения и установки sessionJson
можно использовать для экспорта и восстановления вашего сеанса.
// Exporting the session
const session = GCClient . sessionJson ;
// Use this instead of GCClient.login() to restore the session
// This will throw an error if the stored session cannot be reused
GCClient . restore ( session ) ;
Экспортированный сеанс должен быть сериализуемым и храниться в виде строки JSON.
Сохраненный сеанс можно повторно использовать только один раз, и его необходимо будет сохранять после каждого запроса. Это можно сделать, присоединив некоторое хранилище к событию sessionChange
.
GCClient . onSessionChange ( ( session ) => {
/*
Your choice of storage here
node-persist will probably work in most cases
*/
} ) ;
Чтобы по возможности использовать сохраненный сеанс, но вернуться к обычному входу в систему, можно использовать метод restoreOrLogin
. Аргументы username
и password
являются необязательными, и в случае сбоя восстановления сеанса будет вызвана обычная функция .login()
.
await GCClient . restoreOrLogin ( session , username , password ) ;
sessionChange
сработает при изменении текущего sessionJson
Чтобы присоединить прослушиватель к событию, используйте метод .on()
.
GCClient . on ( 'sessionChange' , ( session ) => console . log ( session ) ) ;
В настоящее время нет возможности удалить прослушиватели.
Получайте основную информацию о пользователе
GCClient . getUserInfo ( ) ;
Получать информацию о социальных пользователях
GCClient . getSocialProfile ( ) ;
Получить список всех социальных связей
GCClient . getSocialConnections ( ) ;
Получите список всех зарегистрированных устройств, включая номера моделей и версии прошивки.
GCClient . getDeviceInfo ( ) ;
getActivities(start: number, limit: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>
Получает список действий на основе указанных параметров.
start
(число, необязательно): индекс для начала получения действий.limit
(число, необязательно): количество действий для получения.activityType
(ActivityType, необязательно): тип действия (если указано, значение start должно быть нулевым).subActivityType
(ActivitySubType, необязательно): подтип действия (если указано, значение start должно быть нулевым). Promise<IActivity[]>
: обещание, которое разрешается в массив действий. const activities = await GCClient . getActivities (
0 ,
10 ,
ActivityType . Running ,
ActivitySubType . Outdoor
) ;
getActivity(activity: { activityId: GCActivityId }): Promise<IActivity>
Получает сведения о конкретном действии на основе предоставленного activityId
.
activity
(объект): объект, содержащий свойство activityId
.
activityId
(GCActivityId): идентификатор желаемого действия. Promise<IActivity>
: обещание, которое разрешается в соответствии с деталями указанного действия. const activityDetails = await GCClient . getActivity ( {
activityId : 'exampleActivityId'
} ) ;
Чтобы получить список действий в вашей ленте новостей, используйте метод getNewsFeed
. Эта функция принимает два аргумента: start и limit , которые используются для нумерации страниц. Оба являются необязательными и по умолчанию используются все, что использует Garmin Connect. Чтобы быть уверенным в выполнении всех действий, используйте это правильно.
// Get the news feed with a default length with most recent activities
GCClient . getNewsFeed ( ) ;
// Get activities in feed, 10 through 15. (start 10, limit 5)
GCClient . getNewsFeed ( 10 , 5 ) ;
Используйте ActivityId для загрузки исходных данных о активности. Обычно он поставляется в виде ZIP-файла.
const [ activity ] = await GCClient . getActivities ( 0 , 1 ) ;
// Directory path is optional and defaults to the current working directory.
// Downloads filename will be supplied by Garmin.
GCClient . downloadOriginalActivityData ( activity , './some/path/that/exists' ) ;
Загружает файл активности как новое действие. Это может быть файл gpx
, tcx
или fit
. Если действие уже существует, результат будет иметь код состояния 409. Загрузка исправлена в версии 1.4.4, Garmin изменил API загрузки, ответ detailedImportResult
не содержит новый идентификатор активности.
const upload = await GCClient . uploadActivity ( './some/path/to/file.fit' ) ;
// not working
const activityId = upload . detailedImportResult . successes [ 0 ] . internalId ;
const uploadId = upload . detailedImportResult . uploadId ;
Загружает изображение в действие
const [ latestActivty ] = await GCClient . getActivities ( 0 , 1 ) ;
const upload = await GCClient . uploadImage (
latestActivty ,
'./some/path/to/file.jpg'
) ;
Удаление изображения из активности
const [ activity ] = await GCClient . getActivities ( 0 , 1 ) ;
const activityDetails = await GCClient . getActivityDetails ( activity . activityId ) ;
await GCClient . deleteImage (
activity ,
activityDetails . metadataDTO . activityImages [ 0 ] . imageId
) ;
getSteps(date?: Date): Promise<number>
Получает общее количество шагов за заданную дату.
date
(Дата, необязательно): дата запрошенной информации о шагах; по умолчанию — сегодня, если дата не указана. Promise<number>
: обещание, которое разрешается в общее количество шагов за указанную дату. const totalSteps = await GCClient . getSteps ( new Date ( '2020-03-24' ) ) ;
getSleepData(date: string): Promise<SleepData>
Получает все данные о сне на заданную дату
date
(Дата, необязательно): дата запрошенной информации, по умолчанию используется сегодняшняя дата, если дата не указана. Promise<SleepData>
: обещание, которое преобразуется в объект, содержащий подробную информацию о сне.
dailySleepDTO
(объект): информация о ежедневном сне пользователя.id
(номер): уникальный идентификатор записи сна.userProfilePK
(число): идентификатор профиля пользователя.calendarDate
(строка): дата записи сна.sleepMovement
(массив): массив данных о движении во сне.remSleepData
(логическое значение): указывает, доступны ли данные быстрого сна.sleepLevels
(массив): массив данных об уровнях сна.restlessMomentsCount
(число): количество моментов беспокойства во время сна. const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getSleepDuration(date: string): Promise<{hours: number, minutes: number}
Получает часы и минуты сна для заданной даты.
date
(Дата, необязательно): дата запрошенной информации, по умолчанию используется сегодняшняя дата, если дата не указана. Promise<{hours: string, minutes: string }>
: обещание, которое преобразуется в объект, содержащий информацию о продолжительности сна.
hours
(строка): количество часовminutes
(строка): количество минут const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getDailyWeightData(date?: Date): Promise<number>
Получает ежедневный вес и конвертирует его из граммов в фунты.
date
(Дата, необязательно): Дата запрошенной информации. По умолчанию используется текущая дата. Promise<number>
: Promise, который преобразуется в ежедневный вес, преобразованный из граммов в фунты. Error
: если для указанной даты не найдены действительные данные о ежедневном весе. const weightData = await GCClient . getDailyWeightData ( new Date ( '2023-12-25' ) ) ;
getDailyWeightInPounds(date?: Date): Promise<number>
Получает ежедневный вес в фунтах на заданную дату.
date
(Дата, необязательно): Дата запрошенной информации; по умолчанию — сегодня, если дата не указана. Promise<number>
: обещание, которое выражается в ежедневном весе в фунтах. const weightInPounds = await GCClient . getDailyWeightInPounds (
new Date ( '2020-03-24' )
) ;
getDailyHydration(date?: Date): Promise<number>
Получает ежедневные данные о гидратации и конвертирует их из миллилитров в унции.
date
(Дата, необязательно): Дата запрошенной информации. По умолчанию используется текущая дата.Promise<number>
: Promise, который преобразует ежедневные данные о гидратации, преобразованные из миллилитров в унции.Error
: если действительные данные о ежедневной гидратации не найдены на указанную дату или если ответ недействителен. const hydrationInOunces = await GCClient . getDailyHydration (
new Date ( '2023-12-25' )
) ;
getGolfSummary(): Promise<GolfSummary>
Получает сводку данных системы показателей гольфа.
Promise<GolfSummary>
: обещание, которое преобразуется в сводную таблицу показателей гольфа. const golfSummary = await GCClient . getGolfSummary ( ) ;
getGolfScorecard(scorecardId: number): Promise<GolfScorecard>
Извлекает данные системы показателей гольфа для конкретной системы показателей.
scorecardId
(число): Идентификатор желаемой системы показателей гольфа. Promise<GolfScorecard>
: обещание, которое преобразуется в данные системы показателей гольфа. const scorecardId = 123 ; // Replace with the desired scorecard ID
const golfScorecard = await GCClient . getGolfScorecard ( scorecardId ) ;
getHeartRate(date?: Date): Promise<HeartRate>
Получает ежедневные данные о частоте пульса на заданную дату.
date
(Дата, необязательно): дата запроса данных о частоте пульса; по умолчанию — сегодня, если дата не указана. Promise<HeartRate>
: обещание, которое преобразуется в ежедневные данные о частоте пульса. const heartRateData = await GCClient . getHeartRate ( new Date ( '2020-03-24' ) ) ;
const activities = await GCClient . getActivities ( 0 , 1 ) ;
const activity = activities [ 0 ] ;
activity [ 'activityName' ] = 'The Updated Name' ;
await GCClient . updateActivity ( activity ) ;
Удаляет действие.
const activities = await GCClient . getActivities ( 0 , 1 ) ;
const activity = activities [ 0 ] ;
await GCClient . deleteActivity ( activity ) ;
updateHydrationLogOunces(date?: Date, valueInOz: number): Promise<WaterIntake>
Добавляет запись журнала гидратации в унциях на заданную дату.
date
(Дата, необязательно): Дата записи в журнале; по умолчанию — сегодня, если дата не указана.valueInOz
(число): количество потребляемой воды в унциях. Принимает отрицательное число. Promise<WaterIntake>
: обещание, которое преобразуется в запись журнала гидратации. const hydrationLogEntry = await GCClient . addHydrationLogOunces (
new Date ( '2020-03-24' ) ,
16
) ;
updateWeight(date = new Date(), lbs: number, timezone: string): Promise<UpdateWeight>
Обновляет информацию о весе
date
(необязательно): объект даты, представляющий дату ввода веса. По умолчанию используется текущая дата, если она не указана.lbs
(число): значение веса в фунтах.timezone
(строка): строка, представляющая часовой пояс для записи веса. Promise<UpdateWeight>
: обещание, которое преобразуется в результат обновления веса. await GCClient . updateWeight ( undefined , 202.9 , 'America/Los_Angeles' ) ;
Чтобы добавить пользовательскую тренировку, используйте addWorkout
или, точнее, addRunningWorkout
.
GCClient . addRunningWorkout ( 'My 5k run' , 5000 , 'Some description' ) ;
Добавит беговую тренировку на 5 км под названием «Мой забег на 5 км» и вернет объект JSON, представляющий сохраненную тренировку.
Чтобы добавить тренировку в календарь, сначала найдите ее, а затем добавьте ее к определенной дате.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . scheduleWorkout ( { workoutId : id } , new Date ( '2020-03-24' ) ) ;
Это добавит тренировку к определенной дате в вашем календаре и автоматически отобразит ее, если вы используете какие-либо часы Garmin.
Удаление тренировки очень похоже на ее планирование.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . deleteWorkout ( { workoutId : id } ) ;
Эта библиотека будет обрабатывать пользовательские запросы к вашему активному сеансу Garmin Connect. Используется много разных URL-адресов, а это означает, что эта библиотека, вероятно, не охватит их всех. С помощью инструмента анализа сети вы можете найти URL-адреса, которые Garmin Connect использует для получения данных.
Предположим, я нашел GET
запросы на следующий URL-адрес:
https://connect.garmin.com/modern/proxy/wellness-service/wellness/dailyHeartRate/22f5f84c-de9d-4ad6-97f2-201097b3b983?date=2020-03-24
Запрос можно отправить с помощью GCClient
запустив
// You can get your displayName by using the getUserInfo method;
const displayName = '22f5f84c-de9d-4ad6-97f2-201097b3b983' ;
const url =
'https://connect.garmin.com/modern/proxy/wellness-service/wellness/dailyHeartRate/' ;
const dateString = '2020-03-24' ;
GCClient . get ( url + displayName , { date : dateString } ) ;
и даст вам тот же результат, что и при использовании предоставленного способа
GCClient . getHeartRate ( ) ;
Обратите внимание, как клиент будет отслеживать URL-адреса, вашу пользовательскую информацию, а также поддерживать сеанс.
Во многих ответах Garmin Connect отсутствуют определения типов и по умолчанию установлено значение unknown
. Не стесняйтесь добавлять типы, открыв запрос на включение.
На данный момент эта библиотека поддерживает только следующее: