สิ่งที่ต้องทำ:
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
ปัจจุบัน หากต้องการแนบ Listener เข้ากับเหตุการณ์ ให้ใช้เมธอด .on()
GCClient . on ( 'sessionChange' , ( session ) => console . log ( session ) ) ;
ขณะนี้ยังไม่มีวิธีลบ Listener
รับข้อมูลผู้ใช้เบื้องต้น
GCClient . getUserInfo ( ) ;
รับข้อมูลผู้ใช้โซเชียล
GCClient . getSocialProfile ( ) ;
รับรายชื่อการเชื่อมต่อทางสังคมทั้งหมด
GCClient . getSocialConnections ( ) ;
รับรายชื่ออุปกรณ์ที่ลงทะเบียนทั้งหมด รวมถึงหมายเลขรุ่นและเวอร์ชันเฟิร์มแวร์
GCClient . getDeviceInfo ( ) ;
getActivities(start: number, limit: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>
ดึงรายการกิจกรรมตามพารามิเตอร์ที่ระบุ
start
(หมายเลข ตัวเลือก): ดัชนีเพื่อเริ่มดึงกิจกรรมlimit
(หมายเลข ตัวเลือก): จำนวนกิจกรรมที่จะดึงข้อมูลactivityType
(ActivityType, ตัวเลือก): ประเภทของกิจกรรม (หากระบุ เริ่มต้นจะต้องเป็นค่าว่าง)subActivityType
(ActivitySubType เป็นทางเลือก): ประเภทย่อยของกิจกรรม (หากระบุ การเริ่มต้นต้องเป็นค่าว่าง) Promise<IActivity[]>
: คำสัญญาที่แก้ไขอาร์เรย์ของกิจกรรม const activities = await GCClient . getActivities (
0 ,
10 ,
ActivityType . Running ,
ActivitySubType . Outdoor
) ;
getActivity(activity: { activityId: GCActivityId }): Promise<IActivity>
ดึงรายละเอียดสำหรับกิจกรรมเฉพาะตาม activityId
ที่ให้ไว้
activity
(วัตถุ): วัตถุที่มีคุณสมบัติ activityId
activityId
(GCActivityId): ตัวระบุสำหรับกิจกรรมที่ต้องการ Promise<IActivity>
: คำสัญญาที่แก้ไขรายละเอียดของกิจกรรมที่ระบุ 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
ไม่มีรหัสกิจกรรมใหม่
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>
: คำสัญญาที่แก้ไขเป็นขั้นตอนทั้งหมดสำหรับวันที่ที่ระบุ const totalSteps = await GCClient . getSteps ( new Date ( '2020-03-24' ) ) ;
getSleepData(date: string): Promise<SleepData>
ดึงข้อมูลการนอนหลับทั้งหมดสำหรับวันที่ที่กำหนด
date
(วันที่ ไม่บังคับ): วันที่ของข้อมูลที่ร้องขอ ซึ่งจะเป็นค่าเริ่มต้นเป็นวันนี้หากไม่มีการระบุวันที่ Promise<SleepData>
: คำสัญญาที่แก้ไขออบเจ็กต์ที่มีข้อมูลการนอนหลับโดยละเอียด
dailySleepDTO
(อ็อบเจ็กต์): ข้อมูลเกี่ยวกับการนอนหลับรายวันของผู้ใช้id
(ตัวเลข): ตัวระบุเฉพาะของบันทึกการนอนหลับuserProfilePK
(หมายเลข): ตัวระบุโปรไฟล์ของผู้ใช้calendarDate
(สตริง): วันที่ของบันทึกการนอนหลับsleepMovement
(อาร์เรย์): อาร์เรย์ของข้อมูลการเคลื่อนไหวของการนอนหลับ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 }>
: สัญญาที่แก้ไขเป็นวัตถุที่มีข้อมูลเกี่ยวกับระยะเวลาการนอนหลับ
hours
(สตริง): จำนวนชั่วโมงminutes
(สตริง): จำนวนนาที const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getDailyWeightData(date?: Date): Promise<number>
รับน้ำหนักรายวันและแปลงจากกรัมเป็นปอนด์
date
(วันที่ ไม่บังคับ): วันที่ขอข้อมูลที่ร้องขอ ค่าเริ่มต้นเป็นวันที่ปัจจุบัน Promise<number>
: สัญญาที่แก้ไขน้ำหนักรายวันที่แปลงจากกรัมเป็นปอนด์ Error
: หากไม่พบข้อมูลน้ำหนักรายวันที่ถูกต้องสำหรับวันที่ที่ระบุ const weightData = await GCClient . getDailyWeightData ( new Date ( '2023-12-25' ) ) ;
getDailyWeightInPounds(date?: Date): Promise<number>
รับน้ำหนักรายวันเป็นปอนด์สำหรับวันที่ที่กำหนด
date
(วันที่ ไม่บังคับ): วันที่ขอข้อมูลที่ร้องขอ; ค่าเริ่มต้นเป็นวันนี้หากไม่มีการระบุวันที่ Promise<number>
: คำสัญญาที่แก้ไขน้ำหนักรายวันเป็นปอนด์ const weightInPounds = await GCClient . getDailyWeightInPounds (
new Date ( '2020-03-24' )
) ;
getDailyHydration(date?: Date): Promise<number>
ดึงข้อมูลความชุ่มชื้นรายวันและแปลงจากมิลลิลิตรเป็นออนซ์
date
(วันที่ ไม่บังคับ): วันที่ของข้อมูลที่ร้องขอ ค่าเริ่มต้นเป็นวันที่ปัจจุบันPromise<number>
: คำสัญญาที่จะแก้ไขข้อมูลความชุ่มชื้นในแต่ละวันที่แปลงจากมิลลิลิตรเป็นออนซ์Error
: หากไม่พบข้อมูลการให้น้ำรายวันที่ถูกต้องสำหรับวันที่ที่ระบุ หรือหากการตอบสนองไม่ถูกต้อง const hydrationInOunces = await GCClient . getDailyHydration (
new Date ( '2023-12-25' )
) ;
getGolfSummary(): Promise<GolfSummary>
ดึงข้อมูลสรุปของข้อมูลดัชนีชี้วัดกอล์ฟ
Promise<GolfSummary>
: คำสัญญาที่แก้ไขเป็นสรุปบัตรคะแนนกอล์ฟ const golfSummary = await GCClient . getGolfSummary ( ) ;
getGolfScorecard(scorecardId: number): Promise<GolfScorecard>
ดึงข้อมูลดัชนีชี้วัดกอล์ฟสำหรับดัชนีชี้วัดเฉพาะ
scorecardId
(หมายเลข): ตัวระบุสำหรับดัชนีชี้วัดกอล์ฟที่ต้องการ Promise<GolfScorecard>
: คำสัญญาที่แก้ไขข้อมูลบัตรคะแนนกอล์ฟ const scorecardId = 123 ; // Replace with the desired scorecard ID
const golfScorecard = await GCClient . getGolfScorecard ( scorecardId ) ;
getHeartRate(date?: Date): Promise<HeartRate>
ดึงข้อมูลอัตราการเต้นของหัวใจรายวันสำหรับวันที่ที่กำหนด
date
(วันที่ ไม่บังคับ): วันที่ของข้อมูลอัตราการเต้นของหัวใจที่ร้องขอ ค่าเริ่มต้นเป็นวันนี้หากไม่มีการระบุวันที่ Promise<HeartRate>
: คำสัญญาที่แก้ไขข้อมูลอัตราการเต้นของหัวใจรายวัน 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>
: คำสัญญาที่จะแก้ไขรายการบันทึกการให้น้ำ 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>
: คำสัญญาที่แก้ไขผลลัพธ์ของการอัปเดตน้ำหนัก 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 ที่แตกต่างกันมากมายที่ใช้ ซึ่งหมายความว่าไลบรารีนี้อาจจะไม่ครอบคลุมทั้งหมด ด้วยการใช้เครื่องมือวิเคราะห์เครือข่าย คุณสามารถค้นหา URL ที่ Garmin Connect ใช้เพื่อดึงข้อมูลได้
สมมติว่าฉันพบคำขอ GET
ไปยัง URL ต่อไปนี้:
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
คุณสามารถเพิ่มประเภทได้โดยการเปิดคำขอดึง
ในตอนนี้ ไลบรารีนี้รองรับเฉพาะรายการต่อไปนี้: