待辦事項:
garmin.cn
和garmin.com
搭配使用如果出現問題,請先檢查 https://connect.garmin.com/status/。
目前,之前的大部分功能都可以使用,但部分 Rest API 尚未添加,例如Gear
、 Workout
、 Badge
等。
以上所有作品均受到 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
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
(數字,可選):開始取得活動的索引。limit
(數量,可選):要檢索的活動數量。activityType
(ActivityType,可選):活動類型(如果指定,則 start 必須為 null)。subActivityType
(ActivitySubType,可選):活動的子類型(如果指定,則 start 必須為 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
檔案。如果活動已detailedImportResult
,則結果的狀態碼將為 409。
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
(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
(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
(字串):表示權重條目時區的字串。 Promise<UpdateWeight>
:解析為權重更新結果的 Promise。 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,這意味著這個庫可能不會涵蓋所有這些。透過使用網頁分析工具,您可以找到 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
。請隨意透過開啟拉取請求來新增類型。
目前,該庫僅支援以下內容: