할 일:
garmin.cn
및 garmin.com
에서 작동합니다. 무언가 작동하지 않는 경우 먼저 https://connect.garmin.com/status/를 확인하십시오.
현재 이전 기능은 대부분 작동하고 있으나 Gear
, Workout
, Badge
등 일부 Rest API는 추가되지 않았습니다. 따라서 이러한 기능이 필요한 경우 PR을 추가하세요.
위의 모든 작업은 https://github.com/matin/garth에서 영감을 받았습니다. 많은 감사를 드립니다.
건강 및 운동 데이터를 보내고 받기 위해 Garmin Connect에 연결하기 위한 강력한 JavaScript 라이브러리입니다. Garmin 계정에 대해 다양한 종류의 데이터를 가져오고 설정하는 몇 가지 사전 정의된 방법이 함께 제공되지만 현재 지원되는 GET
, POST
및 PUT
와 같은 사용자 정의 요청을 할 수도 있습니다. 이를 통해 귀하의 필요에 맞게 누락된 모든 것을 쉽게 구현할 수 있습니다.
이 라이브러리에서는 Garmin Connect 서비스에 대한 사용자 이름과 비밀번호가 포함된 garmin.config.json
이라는 구성 파일을 프로젝트 루트에 추가해야 합니다.
{
"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
getter 및 setter를 사용하여 세션을 내보내고 복원할 수 있습니다.
// 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
(number, optonal): 활동 가져오기를 시작하는 인덱스입니다.limit
(number, optonal): 검색할 활동 수입니다.activityType
(ActivityType, 선택 사항): 활동 유형(지정된 경우 시작은 null이어야 함)subActivityType
(ActivitySubType, 선택 사항): 활동의 하위 유형(지정된 경우 시작은 null이어야 함) Promise<IActivity[]>
: 일련의 활동으로 해결되는 Promise입니다. const activities = await GCClient . getActivities (
0 ,
10 ,
ActivityType . Running ,
ActivitySubType . Outdoor
) ;
getActivity(activity: { activityId: GCActivityId }): Promise<IActivity>
제공된 activityId
기반으로 특정 활동에 대한 세부정보를 검색합니다.
activity
(객체): activityId
속성을 포함하는 객체입니다.
activityId
(GCActivityId): 원하는 활동에 대한 식별자입니다. Promise<IActivity>
: 지정된 활동의 세부 사항을 확인하는 Promise입니다. 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
응답에는 새 ActivityId가 포함되지 않습니다.
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>
: 지정된 날짜의 전체 단계를 해결하는 Promise입니다. const totalSteps = await GCClient . getSteps ( new Date ( '2020-03-24' ) ) ;
getSleepData(date: string): Promise<SleepData>
특정 날짜의 모든 수면 데이터를 검색합니다.
date
(날짜, 선택 사항): 정보가 요청된 날짜, 날짜가 제공되지 않으면 기본값은 오늘입니다. Promise<SleepData>
: 자세한 수면 정보를 포함하는 객체로 해석되는 Promise입니다.
dailySleepDTO
(객체): 사용자의 일일 수면에 대한 정보입니다.id
(번호): 수면 기록의 고유 식별자입니다.userProfilePK
(번호): 사용자의 프로필 식별자입니다.calendarDate
(string): 수면 기록 날짜입니다.sleepMovement
(array): 수면 움직임 데이터의 배열입니다.remSleepData
(부울): REM 수면 데이터를 사용할 수 있는지 여부를 나타냅니다.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 }>
: 수면 시간에 대한 정보가 포함된 객체로 해석되는 Promise
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>
: 일일 체중을 파운드 단위로 결정하는 Promise입니다. 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>
: 골프 스코어카드 요약으로 해결되는 Promise입니다. const golfSummary = await GCClient . getGolfSummary ( ) ;
getGolfScorecard(scorecardId: number): Promise<GolfScorecard>
특정 스코어카드에 대한 골프 스코어카드 데이터를 검색합니다.
scorecardId
(숫자): 원하는 골프 스코어카드의 식별자입니다. Promise<GolfScorecard>
: 골프 스코어카드 데이터로 해석되는 Promise입니다. const scorecardId = 123 ; // Replace with the desired scorecard ID
const golfScorecard = await GCClient . getGolfScorecard ( scorecardId ) ;
getHeartRate(date?: Date): Promise<HeartRate>
특정 날짜의 일일 심박수 데이터를 검색합니다.
date
(날짜, 선택사항): 심박수 데이터를 요청한 날짜. 날짜가 제공되지 않으면 기본값은 오늘입니다. Promise<HeartRate>
: 일일 심박수 데이터를 결정하는 Promise입니다. 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>
: 수화 로그 항목을 확인하는 Promise입니다. const hydrationLogEntry = await GCClient . addHydrationLogOunces (
new Date ( '2020-03-24' ) ,
16
) ;
updateWeight(date = new Date(), lbs: number, timezone: string): Promise<UpdateWeight>
체중 정보 업데이트
date
(선택): 가중치 입력 날짜를 나타내는 날짜 객체입니다. 제공되지 않은 경우 기본값은 현재 날짜입니다.lbs
(숫자): 파운드 단위의 무게 값입니다.timezone
(string): 가중치 항목의 시간대를 나타내는 문자열입니다. Promise<UpdateWeight>
: 가중치 업데이트 결과를 해결하는 Promise입니다. await GCClient . updateWeight ( undefined , 202.9 , 'America/Los_Angeles' ) ;
맞춤 운동을 추가하려면 addWorkout
또는 더 구체적으로 addRunningWorkout
사용하세요.
GCClient . addRunningWorkout ( 'My 5k run' , 5000 , 'Some description' ) ;
'My 5k run'이라는 5km 달리기 운동을 추가하고 저장된 운동을 나타내는 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에서 데이터를 가져오는 데 사용하는 URL을 찾을 수 있습니다.
다음 URL에 대한 GET
요청을 찾았다고 가정해 보겠습니다.
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
. 끌어오기 요청을 열어 자유롭게 유형을 추가하세요.
현재 이 라이브러리는 다음만 지원합니다.