HACER:
garmin.cn
y garmin.com
Si algo no funciona, consulte primero https://connect.garmin.com/status/.
Actualmente, la mayoría de las funciones anteriores están funcionando, pero algunas de las API Rest no están agregadas, como Gear
, Workout
, Badge
, etc. Entonces, si necesita estas funciones, agregue un PR.
Todo el trabajo anterior está inspirado en https://github.com/matin/garth. Muchas gracias.
Una potente biblioteca de JavaScript para conectarse a Garmin Connect para enviar y recibir datos de salud y entrenamiento. Viene con algunos métodos predefinidos para obtener y configurar diferentes tipos de datos para su cuenta de Garmin, pero también tiene la posibilidad de realizar solicitudes personalizadas. Actualmente se admiten GET
, POST
y PUT
. Esto facilita la implementación de lo que pueda faltar para satisfacer sus necesidades.
Esta biblioteca requerirá que agregue un archivo de configuración a la raíz de su proyecto llamado garmin.config.json
que contenga su nombre de usuario y contraseña para el servicio 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 ( ) ;
Ahora puede verificar userProfile.userName
para verificar que su inicio de sesión se haya realizado correctamente.
GCClient . saveTokenToFile ( '/path/to/save/tokens' ) ;
Resultado:
$ ls /path/to/save/tokens
oauth1_token.json oauth2_token.json
Ficha de reutilización:
GCClient . loadTokenByFile ( '/path/to/save/tokens' ) ;
const oauth1 = GCClient . client . oauth1Token ;
const oauth2 = GCClient . client . oauth2Token ;
// save to db or other storage
...
Ficha de reutilización:
GCClient . loadToken ( oauth1 , oauth2 ) ;
Esta es una característica experimental y es posible que aún no proporcione una estabilidad total.
Después de iniciar sesión correctamente, el getter y setter sessionJson
se pueden utilizar para exportar y restaurar su sesión.
// 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 ) ;
La sesión exportada debe ser serializable y almacenarse como una cadena JSON.
Una sesión almacenada solo se puede reutilizar una vez y deberá almacenarse después de cada solicitud. Esto se puede hacer adjuntando algo de almacenamiento al evento sessionChange
.
GCClient . onSessionChange ( ( session ) => {
/*
Your choice of storage here
node-persist will probably work in most cases
*/
} ) ;
Para asegurarse de utilizar una sesión almacenada si es posible, pero recurrir al inicio de sesión normal, se puede utilizar el método restoreOrLogin
. Los argumentos username
y password
son opcionales y se llamará al .login()
normal si falla la restauración de la sesión.
await GCClient . restoreOrLogin ( session , username , password ) ;
sessionChange
se activará ante un cambio en el sessionJson
actual Para adjuntar un oyente a un evento, utilice el método .on()
.
GCClient . on ( 'sessionChange' , ( session ) => console . log ( session ) ) ;
Actualmente no hay forma de eliminar oyentes.
Recibir información básica del usuario
GCClient . getUserInfo ( ) ;
Recibir información de usuarios sociales
GCClient . getSocialProfile ( ) ;
Obtenga una lista de todas las conexiones sociales
GCClient . getSocialConnections ( ) ;
Obtenga una lista de todos los dispositivos registrados, incluidos los números de modelo y las versiones de firmware.
GCClient . getDeviceInfo ( ) ;
getActivities(start: number, limit: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>
Recupera una lista de actividades basadas en parámetros especificados.
start
(número, opcional): índice para comenzar a buscar actividades.limit
(número, opcional): número de actividades a recuperar.activityType
(ActivityType, opcional): tipo de actividad (si se especifica, el inicio debe ser nulo).subActivityType
(ActivitySubType, opcional): subtipo de actividad (si se especifica, el inicio debe ser nulo). Promise<IActivity[]>
: una promesa que se resuelve en una serie de actividades. const activities = await GCClient . getActivities (
0 ,
10 ,
ActivityType . Running ,
ActivitySubType . Outdoor
) ;
getActivity(activity: { activityId: GCActivityId }): Promise<IActivity>
Recupera detalles de una actividad específica según el activityId
proporcionado.
activity
(objeto): un objeto que contiene la propiedad activityId
.
activityId
(GCActivityId): Identificador de la actividad deseada. Promise<IActivity>
: una promesa que resuelve los detalles de la actividad especificada. const activityDetails = await GCClient . getActivity ( {
activityId : 'exampleActivityId'
} ) ;
Para obtener una lista de actividades en su servicio de noticias, utilice el método getNewsFeed
. Esta función toma dos argumentos, inicio y límite , que se utilizan para la paginación. Ambos son opcionales y se utilizarán de forma predeterminada en cualquier dispositivo que esté utilizando Garmin Connect. Para asegurarse de obtener todas las actividades, utilice esto correctamente.
// 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 ) ;
Utilice el ID de actividad para descargar los datos de actividad originales. Normalmente se suministra como un archivo .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' ) ;
Carga un archivo de actividad como una nueva actividad. El archivo puede ser un archivo gpx
, tcx
o fit
. Si la actividad ya existe, el resultado tendrá un código de estado de 409. Carga corregida en 1.4.4, Garmin cambió la API de carga, la respuesta detailedImportResult
no contiene el nuevo ID de actividad.
const upload = await GCClient . uploadActivity ( './some/path/to/file.fit' ) ;
// not working
const activityId = upload . detailedImportResult . successes [ 0 ] . internalId ;
const uploadId = upload . detailedImportResult . uploadId ;
Sube una imagen a la actividad
const [ latestActivty ] = await GCClient . getActivities ( 0 , 1 ) ;
const upload = await GCClient . uploadImage (
latestActivty ,
'./some/path/to/file.jpg'
) ;
Eliminar una imagen de la actividad
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>
Recupera el total de pasos para una fecha determinada.
date
(Fecha, opcional): Fecha de los pasos solicitados; El valor predeterminado es hoy si no se proporciona ninguna fecha. Promise<number>
: una promesa que se resuelve en el total de pasos para la fecha especificada. const totalSteps = await GCClient . getSteps ( new Date ( '2020-03-24' ) ) ;
getSleepData(date: string): Promise<SleepData>
Recupera todos los datos de sueño para una fecha determinada.
date
(Fecha, opcional): fecha de la información solicitada; de forma predeterminada, será hoy si no se proporciona ninguna fecha. Promise<SleepData>
: una promesa que se resuelve en un objeto que contiene información detallada sobre el sueño.
dailySleepDTO
(objeto): Información sobre el sueño diario del usuario.id
(número): el identificador único del registro de sueño.userProfilePK
(número): el identificador del perfil del usuario.calendarDate
(cadena): la fecha del registro de sueño.sleepMovement
(matriz): una matriz de datos de movimientos del sueño.remSleepData
(booleano): indica si los datos del sueño REM están disponibles.sleepLevels
(matriz): una matriz de datos de niveles de sueño.restlessMomentsCount
(número): recuento de momentos de inquietud durante el sueño. const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getSleepDuration(date: string): Promise<{hours: number, minutes: number}
Recupera horas y minutos dormidos para una fecha determinada.
date
(Fecha, opcional): fecha de la información solicitada; de forma predeterminada, será hoy si no se proporciona ninguna fecha. Promise<{hours: string, minutes: string }>
: una promesa que se resuelve en un objeto que contiene información sobre la duración del sueño.
hours
(cadena): número de horasminutes
(cadena): número de minutos const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getDailyWeightData(date?: Date): Promise<number>
Recupera el peso diario y lo convierte de gramos a libras.
date
(Fecha, opcional): Fecha de la información solicitada. El valor predeterminado es la fecha actual. Promise<number>
: una promesa que se resuelve en el peso diario convertido de gramos a libras. Error
: si no se pueden encontrar datos de peso diario válidos para la fecha especificada. const weightData = await GCClient . getDailyWeightData ( new Date ( '2023-12-25' ) ) ;
getDailyWeightInPounds(date?: Date): Promise<number>
Recupera el peso diario en libras para una fecha determinada.
date
(Fecha, opcional): Fecha de la información solicitada; El valor predeterminado es hoy si no se proporciona ninguna fecha. Promise<number>
: una promesa que se resuelve en el peso diario en libras. const weightInPounds = await GCClient . getDailyWeightInPounds (
new Date ( '2020-03-24' )
) ;
getDailyHydration(date?: Date): Promise<number>
Recupera los datos de hidratación diaria y los convierte de mililitros a onzas.
date
(Fecha, opcional): Fecha de la información solicitada. El valor predeterminado es la fecha actual.Promise<number>
: una promesa que se resuelve en los datos de hidratación diaria convertidos de mililitros a onzas.Error
: si no se pueden encontrar datos de hidratación diaria válidos para la fecha especificada o si la respuesta no es válida. const hydrationInOunces = await GCClient . getDailyHydration (
new Date ( '2023-12-25' )
) ;
getGolfSummary(): Promise<GolfSummary>
Recupera un resumen de los datos del cuadro de mando de golf.
Promise<GolfSummary>
: una promesa que se resuelve en el resumen del cuadro de mandos de golf. const golfSummary = await GCClient . getGolfSummary ( ) ;
getGolfScorecard(scorecardId: number): Promise<GolfScorecard>
Recupera datos del cuadro de mando de golf para un cuadro de mando específico.
scorecardId
(número): Identificador del cuadro de mando de golf deseado. Promise<GolfScorecard>
: una promesa que se resuelve en los datos del cuadro de mando de golf. const scorecardId = 123 ; // Replace with the desired scorecard ID
const golfScorecard = await GCClient . getGolfScorecard ( scorecardId ) ;
getHeartRate(date?: Date): Promise<HeartRate>
Recupera datos de frecuencia cardíaca diaria para una fecha determinada.
date
(Fecha, opcional): Fecha de los datos de frecuencia cardíaca solicitados; El valor predeterminado es hoy si no se proporciona ninguna fecha. Promise<HeartRate>
: una promesa que se resuelve en los datos de frecuencia cardíaca diaria. 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 ) ;
Elimina una actividad.
const activities = await GCClient . getActivities ( 0 , 1 ) ;
const activity = activities [ 0 ] ;
await GCClient . deleteActivity ( activity ) ;
updateHydrationLogOunces(date?: Date, valueInOz: number): Promise<WaterIntake>
Agrega una entrada de registro de hidratación en onzas para una fecha determinada.
date
(Fecha, opcional): Fecha de la entrada del registro; El valor predeterminado es hoy si no se proporciona ninguna fecha.valueInOz
(número): Cantidad de agua consumida en onzas. Acepta números negativos. Promise<WaterIntake>
: una promesa que se resuelve en la entrada del registro de hidratación. const hydrationLogEntry = await GCClient . addHydrationLogOunces (
new Date ( '2020-03-24' ) ,
16
) ;
updateWeight(date = new Date(), lbs: number, timezone: string): Promise<UpdateWeight>
Actualiza la información de peso.
date
(opcional): Objeto de fecha que representa la fecha de entrada del peso. El valor predeterminado es la fecha actual si no se proporciona.lbs
(número): Valor del peso en libras.timezone
(cadena): cadena que representa la zona horaria para la entrada de peso. Promise<UpdateWeight>
: una promesa que se resuelve con el resultado de la actualización del peso. await GCClient . updateWeight ( undefined , 202.9 , 'America/Los_Angeles' ) ;
Para agregar un entrenamiento personalizado, use addWorkout
o más específicamente addRunningWorkout
.
GCClient . addRunningWorkout ( 'My 5k run' , 5000 , 'Some description' ) ;
Agregará un entrenamiento de carrera de 5 km llamado "Mi carrera de 5 km" y devolverá un objeto JSON que representa el entrenamiento guardado.
Para agregar un entrenamiento a su calendario, primero busque su entrenamiento y luego agréguelo a una fecha específica.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . scheduleWorkout ( { workoutId : id } , new Date ( '2020-03-24' ) ) ;
Esto agregará el entrenamiento a una fecha específica en tu calendario y hará que se muestre automáticamente si estás usando alguno de los relojes Garmin.
Eliminar un entrenamiento es muy similar a programar uno.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . deleteWorkout ( { workoutId : id } ) ;
Esta biblioteca manejará solicitudes personalizadas para su sesión activa de Garmin Connect. Se utilizan muchas URL diferentes, lo que significa que esta biblioteca probablemente no las cubrirá todas. Al utilizar la herramienta de análisis de red, puede encontrar las URL que utiliza Garmin Connect para recuperar datos.
Supongamos que encontré solicitudes GET
en la siguiente URL:
https://connect.garmin.com/modern/proxy/wellness-service/wellness/dailyHeartRate/22f5f84c-de9d-4ad6-97f2-201097b3b983?date=2020-03-24
La solicitud se puede enviar utilizando GCClient
ejecutando
// 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 } ) ;
y obtendrá el mismo resultado que si utilizara la forma proporcionada
GCClient . getHeartRate ( ) ;
Observe cómo el cliente realizará un seguimiento de las URL y de su información de usuario, además de mantener viva la sesión.
A muchas respuestas de Garmin Connect les faltan definiciones de tipo y el valor predeterminado es unknown
. Siéntete libre de agregar tipos abriendo una solicitud de extracción.
Por ahora, esta biblioteca solo admite lo siguiente: