TODO:
garmin.cn
und garmin.com
Wenn etwas nicht funktioniert, überprüfen Sie bitte zuerst https://connect.garmin.com/status/.
Derzeit funktionieren die meisten früheren Funktionen, einige der Rest-APIs wurden jedoch nicht hinzugefügt, z. B. Gear
, Workout
, Badge
usw. Wenn Sie diese Funktionen benötigen, fügen Sie bitte eine PR hinzu.
Alle oben genannten Arbeiten wurden von https://github.com/matin/garth inspiriert. Vielen Dank.
Eine leistungsstarke JavaScript-Bibliothek zur Verbindung mit Garmin Connect zum Senden und Empfangen von Gesundheits- und Trainingsdaten. Es verfügt über einige vordefinierte Methoden zum Abrufen und Festlegen verschiedener Arten von Daten für Ihr Garmin-Konto, bietet aber auch die Möglichkeit, benutzerdefinierte Anfragen zu stellen. GET
, POST
und PUT
werden derzeit unterstützt. Dies macht es einfach, alles, was möglicherweise fehlt, entsprechend Ihren Anforderungen zu implementieren.
Für diese Bibliothek müssen Sie eine Konfigurationsdatei namens garmin.config.json
zu Ihrem Projektstamm hinzufügen, die Ihren Benutzernamen und Ihr Passwort für den Garmin Connect-Dienst enthält.
{
"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 ( ) ;
Jetzt können Sie userProfile.userName
überprüfen, um sicherzustellen, dass Ihre Anmeldung erfolgreich war.
GCClient . saveTokenToFile ( '/path/to/save/tokens' ) ;
Ergebnis:
$ ls /path/to/save/tokens
oauth1_token.json oauth2_token.json
Token wiederverwenden:
GCClient . loadTokenByFile ( '/path/to/save/tokens' ) ;
const oauth1 = GCClient . client . oauth1Token ;
const oauth2 = GCClient . client . oauth2Token ;
// save to db or other storage
...
Token wiederverwenden:
GCClient . loadToken ( oauth1 , oauth2 ) ;
Dies ist eine experimentelle Funktion und bietet möglicherweise noch nicht die volle Stabilität.
Nach einer erfolgreichen Anmeldung können die sessionJson
Getter und -Setter zum Exportieren und Wiederherstellen Ihrer Sitzung verwendet werden.
// 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 ) ;
Die exportierte Sitzung sollte serialisierbar sein und kann als JSON-String gespeichert werden.
Eine gespeicherte Sitzung kann nur einmal wiederverwendet werden und muss nach jeder Anfrage gespeichert werden. Dies kann erreicht werden, indem dem sessionChange
Ereignis etwas Speicher hinzugefügt wird.
GCClient . onSessionChange ( ( session ) => {
/*
Your choice of storage here
node-persist will probably work in most cases
*/
} ) ;
Um sicherzustellen, dass nach Möglichkeit eine gespeicherte Sitzung verwendet wird, aber auf die reguläre Anmeldung zurückgegriffen wird, kann die Methode restoreOrLogin
verwendet werden. Die Argumente username
und password
sind beide optional und die reguläre .login()
wird aufgerufen, wenn die Sitzungswiederherstellung fehlschlägt.
await GCClient . restoreOrLogin ( session , username , password ) ;
sessionChange
wird bei einer Änderung im aktuellen sessionJson
ausgelöst Um einen Listener an ein Ereignis anzuhängen, verwenden Sie die Methode .on()
.
GCClient . on ( 'sessionChange' , ( session ) => console . log ( session ) ) ;
Derzeit gibt es keine Möglichkeit, Listener zu entfernen.
Erhalten Sie grundlegende Benutzerinformationen
GCClient . getUserInfo ( ) ;
Erhalten Sie soziale Benutzerinformationen
GCClient . getSocialProfile ( ) ;
Erhalten Sie eine Liste aller sozialen Verbindungen
GCClient . getSocialConnections ( ) ;
Erhalten Sie eine Liste aller registrierten Geräte einschließlich Modellnummern und Firmware-Versionen.
GCClient . getDeviceInfo ( ) ;
getActivities(start: number, limit: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>
Ruft eine Liste von Aktivitäten basierend auf angegebenen Parametern ab.
start
(Zahl, optional): Index zum Starten des Abrufens von Aktivitäten.limit
(Anzahl, optional): Anzahl der abzurufenden Aktivitäten.activityType
(ActivityType, optional): Art der Aktivität (falls angegeben, muss Start null sein).subActivityType
(ActivitySubType, optional): Untertyp der Aktivität (falls angegeben, muss Start null sein). Promise<IActivity[]>
: Ein Promise, das sich in eine Reihe von Aktivitäten auflöst. const activities = await GCClient . getActivities (
0 ,
10 ,
ActivityType . Running ,
ActivitySubType . Outdoor
) ;
getActivity(activity: { activityId: GCActivityId }): Promise<IActivity>
Ruft Details für eine bestimmte Aktivität basierend auf der bereitgestellten activityId
ab.
activity
(Objekt): Ein Objekt, das die activityId
-Eigenschaft enthält.
activityId
(GCActivityId): Kennung für die gewünschte Aktivität. Promise<IActivity>
: Ein Versprechen, das die Details der angegebenen Aktivität auflöst. const activityDetails = await GCClient . getActivity ( {
activityId : 'exampleActivityId'
} ) ;
Um eine Liste der Aktivitäten in Ihrem Newsfeed zu erhalten, verwenden Sie die Methode getNewsFeed
. Diese Funktion benötigt zwei Argumente, start und limit , die für die Paginierung verwendet werden. Beide sind optional und werden standardmäßig auf das verwendet, was Garmin Connect verwendet. Um sicherzustellen, dass Sie alle Aktivitäten erhalten, verwenden Sie dies richtig.
// 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 ) ;
Verwenden Sie die Aktivitäts-ID, um die ursprünglichen Aktivitätsdaten herunterzuladen. Normalerweise wird dies als ZIP-Datei geliefert.
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' ) ;
Lädt eine Aktivitätsdatei als neue Aktivität hoch. Die Datei kann eine gpx
, tcx
oder fit
-Datei sein. Wenn die Aktivität bereits vorhanden ist, hat das Ergebnis den Statuscode 409. Der Upload wurde in 1.4.4 behoben, Garmin hat die Upload-API geändert, die Antwort detailedImportResult
enthält nicht die neue Aktivitäts-ID.
const upload = await GCClient . uploadActivity ( './some/path/to/file.fit' ) ;
// not working
const activityId = upload . detailedImportResult . successes [ 0 ] . internalId ;
const uploadId = upload . detailedImportResult . uploadId ;
Lädt ein Bild zur Aktivität hoch
const [ latestActivty ] = await GCClient . getActivities ( 0 , 1 ) ;
const upload = await GCClient . uploadImage (
latestActivty ,
'./some/path/to/file.jpg'
) ;
Ein Bild aus der Aktivität löschen
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>
Ruft die Gesamtschritte für ein bestimmtes Datum ab.
date
(Datum, optional): Datum der angeforderten Schrittinformationen; Wenn kein Datum angegeben wird, wird standardmäßig der heutige Tag verwendet. Promise<number>
: Ein Promise, das die Gesamtzahl der Schritte für das angegebene Datum auflöst. const totalSteps = await GCClient . getSteps ( new Date ( '2020-03-24' ) ) ;
getSleepData(date: string): Promise<SleepData>
Ruft alle Schlafdaten für ein bestimmtes Datum ab
date
(Datum, optional): Datum der angeforderten Informationen. Wenn kein Datum angegeben wird, wird standardmäßig das heutige Datum verwendet Promise<SleepData>
: Ein Promise, das in ein Objekt aufgelöst wird, das detaillierte Schlafinformationen enthält.
dailySleepDTO
(Objekt): Informationen über den täglichen Schlaf des Benutzers.id
(Nummer): Die eindeutige Kennung des Schlafdatensatzes.userProfilePK
(Nummer): Die Profilkennung des Benutzers.calendarDate
(Zeichenfolge): Das Datum der Schlafaufzeichnung.sleepMovement
(Array): Ein Array von Schlafbewegungsdaten.remSleepData
(boolean): Gibt an, ob REM-Schlafdaten verfügbar sind.sleepLevels
(Array): Ein Array von Schlafniveaudaten.restlessMomentsCount
(Zahl): Anzahl der unruhigen Momente im Schlaf. const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getSleepDuration(date: string): Promise<{hours: number, minutes: number}
Ruft Stunden und Minuten ab, die für ein bestimmtes Datum geschlafen haben
date
(Datum, optional): Datum der angeforderten Informationen. Wenn kein Datum angegeben wird, wird standardmäßig das heutige Datum verwendet Promise<{hours: string, minutes: string }>
: Ein Versprechen, das in ein Objekt aufgelöst wird, das Informationen über die Schlafdauer enthält
hours
(Zeichenfolge): Anzahl der Stundenminutes
(Zeichenfolge): Anzahl der Minuten const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getDailyWeightData(date?: Date): Promise<number>
Ruft das Tagesgewicht ab und rechnet es von Gramm in Pfund um.
date
(Datum, optional): Datum der angeforderten Informationen. Standardmäßig wird das aktuelle Datum verwendet. Promise<number>
: Ein Promise, das sich in das von Gramm in Pfund umgerechnete Tagesgewicht auflöst. Error
: Wenn für das angegebene Datum keine gültigen Tagesgewichtsdaten gefunden werden können. const weightData = await GCClient . getDailyWeightData ( new Date ( '2023-12-25' ) ) ;
getDailyWeightInPounds(date?: Date): Promise<number>
Ruft das Tagesgewicht in Pfund für ein bestimmtes Datum ab.
date
(Datum, optional): Datum der angeforderten Informationen; Wenn kein Datum angegeben wird, wird standardmäßig der heutige Tag verwendet. Promise<number>
: Ein Versprechen, das das tägliche Gewicht in Pfund auflöst. const weightInPounds = await GCClient . getDailyWeightInPounds (
new Date ( '2020-03-24' )
) ;
getDailyHydration(date?: Date): Promise<number>
Ruft die täglichen Flüssigkeitszufuhrdaten ab und rechnet sie von Millilitern in Unzen um.
date
(Datum, optional): Datum der angeforderten Informationen. Standardmäßig wird das aktuelle Datum verwendet.Promise<number>
: Ein Promise, das sich in die täglichen Flüssigkeitszufuhrdaten umwandelt, die von Millilitern in Unzen umgewandelt werden.Error
: Wenn für das angegebene Datum keine gültigen täglichen Flüssigkeitszufuhrdaten gefunden werden können oder die Antwort ungültig ist. const hydrationInOunces = await GCClient . getDailyHydration (
new Date ( '2023-12-25' )
) ;
getGolfSummary(): Promise<GolfSummary>
Ruft eine Zusammenfassung der Golf-Scorecard-Daten ab.
Promise<GolfSummary>
: Ein Promise, das in die Golf-Scorecard-Zusammenfassung aufgelöst wird. const golfSummary = await GCClient . getGolfSummary ( ) ;
getGolfScorecard(scorecardId: number): Promise<GolfScorecard>
Ruft Golf-Scorecard-Daten für eine bestimmte Scorecard ab.
scorecardId
(Nummer): Kennung für die gewünschte Golf-Scorecard. Promise<GolfScorecard>
: Ein Promise, das in die Golf-Scorecard-Daten aufgelöst wird. const scorecardId = 123 ; // Replace with the desired scorecard ID
const golfScorecard = await GCClient . getGolfScorecard ( scorecardId ) ;
getHeartRate(date?: Date): Promise<HeartRate>
Ruft tägliche Herzfrequenzdaten für ein bestimmtes Datum ab.
date
(Datum, optional): Datum der angeforderten Herzfrequenzdaten; Wenn kein Datum angegeben wird, wird standardmäßig der heutige Tag verwendet. Promise<HeartRate>
: Ein Promise, das die täglichen Herzfrequenzdaten auflöst. 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 ) ;
Löscht eine Aktivität.
const activities = await GCClient . getActivities ( 0 , 1 ) ;
const activity = activities [ 0 ] ;
await GCClient . deleteActivity ( activity ) ;
updateHydrationLogOunces(date?: Date, valueInOz: number): Promise<WaterIntake>
Fügt einen Hydratationsprotokolleintrag in Unzen für ein bestimmtes Datum hinzu.
date
(Datum, optional): Datum des Protokolleintrags; Wenn kein Datum angegeben wird, wird standardmäßig der heutige Tag verwendet.valueInOz
(Zahl): Menge der Wasseraufnahme in Unzen. Akzeptiert negative Zahlen. Promise<WaterIntake>
: Ein Promise, das zum Hydratationsprotokolleintrag aufgelöst wird. const hydrationLogEntry = await GCClient . addHydrationLogOunces (
new Date ( '2020-03-24' ) ,
16
) ;
updateWeight(date = new Date(), lbs: number, timezone: string): Promise<UpdateWeight>
Aktualisiert Gewichtsinformationen
date
(optional): Datumsobjekt, das das Datum der Gewichtseingabe darstellt. Wenn nicht angegeben, wird standardmäßig das aktuelle Datum verwendet.lbs
(Zahl): Gewichtswert in Pfund.timezone
(Zeichenfolge): Zeichenfolge, die die Zeitzone für den Gewichtseintrag darstellt. Promise<UpdateWeight>
: Ein Promise, das zum Ergebnis der Gewichtsaktualisierung aufgelöst wird. await GCClient . updateWeight ( undefined , 202.9 , 'America/Los_Angeles' ) ;
Um ein benutzerdefiniertes Training hinzuzufügen, verwenden Sie addWorkout
oder genauer gesagt addRunningWorkout
.
GCClient . addRunningWorkout ( 'My 5k run' , 5000 , 'Some description' ) ;
Fügt ein Lauftraining über 5 km mit dem Namen „Mein 5-km-Lauf“ hinzu und gibt ein JSON-Objekt zurück, das das gespeicherte Training darstellt.
Um ein Training zu Ihrem Kalender hinzuzufügen, suchen Sie zunächst Ihr Training und fügen Sie es dann einem bestimmten Datum hinzu.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . scheduleWorkout ( { workoutId : id } , new Date ( '2020-03-24' ) ) ;
Dadurch wird das Training einem bestimmten Datum in Ihrem Kalender hinzugefügt und automatisch angezeigt, wenn Sie eine der Garmin-Uhren verwenden.
Das Löschen eines Trainings ist dem Planen eines Trainings sehr ähnlich.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . deleteWorkout ( { workoutId : id } ) ;
Diese Bibliothek verarbeitet benutzerdefinierte Anfragen an Ihre aktive Garmin Connect-Sitzung. Es werden viele verschiedene URLs verwendet, was bedeutet, dass diese Bibliothek wahrscheinlich nicht alle abdeckt. Mithilfe des Netzwerkanalysetools können Sie URLs finden, die von Garmin Connect zum Abrufen von Daten verwendet werden.
Nehmen wir an, ich habe eine GET
Anfrage an die folgende URL gefunden:
https://connect.garmin.com/modern/proxy/wellness-service/wellness/dailyHeartRate/22f5f84c-de9d-4ad6-97f2-201097b3b983?date=2020-03-24
Die Anfrage kann mit GCClient
durch Ausführen gesendet werden
// 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 } ) ;
und Sie erhalten das gleiche Ergebnis wie bei Verwendung der bereitgestellten Methode
GCClient . getHeartRate ( ) ;
Beachten Sie, wie der Client die URLs und Ihre Benutzerinformationen im Auge behält und die Sitzung am Leben hält.
In vielen Antworten von Garmin Connect fehlen Typdefinitionen und die Standardeinstellung ist unknown
. Fühlen Sie sich frei, Typen hinzuzufügen, indem Sie eine Pull-Anfrage öffnen.
Derzeit unterstützt diese Bibliothek nur Folgendes: