TODO:
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
ゲッターとセッターを使用してセッションをエクスポートおよび復元できます。
// 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 文字列として保存できます。
保存されたセッションは 1 回のみ再利用でき、リクエストのたびに保存する必要があります。これは、 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
メソッドを使用します。この関数は、ページネーションに使用される 2 つの引数、 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
(文字列): 睡眠記録の日付。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 }>
: 睡眠時間に関する情報を含むオブジェクトに解決される 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
(文字列): 体重エントリのタイムゾーンを表す文字列。 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」という名前の 5 km のランニング ワークアウトを追加し、保存されたワークアウトを表す 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
。プル リクエストを開いて自由にタイプを追加してください。
現時点では、このライブラリは次のもののみをサポートしています。