待办事项:
garmin.cn
和garmin.com
配合使用如果出现问题,请先检查 https://connect.garmin.com/status/。
目前,之前的大部分功能都可以使用,但部分 Rest API 尚未添加,例如Gear
、 Workout
、 Badge
等。因此,如果您需要这些功能,请添加 PR。
以上所有工作均受到 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
文件。如果该活动已存在,则结果的状态代码将为 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
(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
。请随意通过打开拉取请求来添加类型。
目前,该库仅支持以下内容: