YANG HARUS DILAKUKAN:
garmin.cn
dan garmin.com
Jika ada yang tidak berfungsi, silakan periksa https://connect.garmin.com/status/ terlebih dahulu.
Saat ini, sebagian besar fitur sebelumnya berfungsi, tetapi beberapa Rest API tidak ditambahkan, seperti Gear
, Workout
, Badge
, dll. Jadi jika Anda memerlukan fitur ini, silakan tambahkan PR.
Semua karya di atas terinspirasi oleh https://github.com/matin/garth. Terima kasih banyak.
Pustaka JavaScript yang kuat untuk terhubung ke Garmin Connect untuk mengirim dan menerima data kesehatan dan olahraga. Muncul dengan beberapa metode yang telah ditentukan sebelumnya untuk mendapatkan dan mengatur berbagai jenis data untuk akun Garmin Anda, tetapi juga memiliki kemungkinan untuk membuat permintaan khusus GET
, POST
dan PUT
yang saat ini didukung. Hal ini memudahkan penerapan apa pun yang mungkin kurang sesuai kebutuhan Anda.
Pustaka ini mengharuskan Anda menambahkan file konfigurasi ke root proyek Anda yang disebut garmin.config.json
yang berisi nama pengguna dan kata sandi Anda untuk layanan 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 ( ) ;
Sekarang Anda dapat memeriksa userProfile.userName
untuk memverifikasi bahwa login Anda berhasil.
GCClient . saveTokenToFile ( '/path/to/save/tokens' ) ;
Hasil:
$ ls /path/to/save/tokens
oauth1_token.json oauth2_token.json
Gunakan kembali token:
GCClient . loadTokenByFile ( '/path/to/save/tokens' ) ;
const oauth1 = GCClient . client . oauth1Token ;
const oauth2 = GCClient . client . oauth2Token ;
// save to db or other storage
...
Gunakan kembali token:
GCClient . loadToken ( oauth1 , oauth2 ) ;
Ini adalah fitur eksperimental dan mungkin belum memberikan stabilitas penuh.
Setelah login berhasil, pengambil dan penyetel sessionJson
dapat digunakan untuk mengekspor dan memulihkan sesi Anda.
// 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 ) ;
Sesi yang diekspor harus dapat diserialkan dan dapat disimpan sebagai string JSON.
Sesi yang disimpan hanya dapat digunakan kembali satu kali dan perlu disimpan setelah setiap permintaan. Hal ini dapat dilakukan dengan melampirkan beberapa penyimpanan ke acara sessionChange
.
GCClient . onSessionChange ( ( session ) => {
/*
Your choice of storage here
node-persist will probably work in most cases
*/
} ) ;
Untuk memastikan untuk menggunakan sesi tersimpan jika memungkinkan, tetapi kembali ke login biasa, seseorang dapat menggunakan metode restoreOrLogin
. Argumen username
dan password
bersifat opsional dan .login()
reguler akan dipanggil jika pemulihan sesi gagal.
await GCClient . restoreOrLogin ( session , username , password ) ;
sessionChange
akan memicu perubahan pada sessionJson
saat ini Untuk melampirkan pendengar ke suatu acara, gunakan metode .on()
.
GCClient . on ( 'sessionChange' , ( session ) => console . log ( session ) ) ;
Saat ini tidak ada cara untuk menghapus pendengar.
Menerima informasi dasar pengguna
GCClient . getUserInfo ( ) ;
Menerima informasi pengguna sosial
GCClient . getSocialProfile ( ) ;
Dapatkan daftar semua hubungan sosial
GCClient . getSocialConnections ( ) ;
Dapatkan daftar semua perangkat terdaftar termasuk nomor model dan versi firmware.
GCClient . getDeviceInfo ( ) ;
getActivities(start: number, limit: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>
Mengambil daftar aktivitas berdasarkan parameter yang ditentukan.
start
(angka, opsional): Indeks untuk mulai mengambil aktivitas.limit
(angka, optonal): Jumlah aktivitas yang akan diambil.activityType
(ActivityType, opsional): Jenis aktivitas (jika ditentukan, awal harus nol).subActivityType
(ActivitySubType, opsional): Subtipe aktivitas (jika ditentukan, permulaan harus nol). Promise<IActivity[]>
: Janji yang menentukan serangkaian aktivitas. const activities = await GCClient . getActivities (
0 ,
10 ,
ActivityType . Running ,
ActivitySubType . Outdoor
) ;
getActivity(activity: { activityId: GCActivityId }): Promise<IActivity>
Mengambil detail untuk aktivitas tertentu berdasarkan activityId
yang disediakan.
activity
(objek): Objek yang berisi properti activityId
.
activityId
(GCActivityId): Pengidentifikasi untuk aktivitas yang diinginkan. Promise<IActivity>
: Janji yang menentukan detail aktivitas yang ditentukan. const activityDetails = await GCClient . getActivity ( {
activityId : 'exampleActivityId'
} ) ;
Untuk mendapatkan daftar aktivitas di umpan berita Anda, gunakan metode getNewsFeed
. Fungsi ini membutuhkan dua argumen, start dan limit , yang digunakan untuk penomoran halaman. Keduanya bersifat opsional dan akan digunakan secara default pada Garmin Connect apa pun yang digunakan. Untuk memastikan mendapatkan semua aktivitas, gunakan ini dengan benar.
// 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 ) ;
Gunakan ActivityId untuk mengunduh data aktivitas asli. Biasanya ini disediakan sebagai file .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' ) ;
Mengunggah file aktivitas sebagai Aktivitas baru. Filenya bisa berupa file gpx
, tcx
, atau fit
. Jika aktivitas sudah ada, hasilnya akan memiliki kode status 409. Unggahan diperbaiki di 1.4.4, Garmin mengubah api unggahan, respons detailedImportResult
tidak berisi ID aktivitas baru.
const upload = await GCClient . uploadActivity ( './some/path/to/file.fit' ) ;
// not working
const activityId = upload . detailedImportResult . successes [ 0 ] . internalId ;
const uploadId = upload . detailedImportResult . uploadId ;
Mengunggah gambar ke aktivitas
const [ latestActivty ] = await GCClient . getActivities ( 0 , 1 ) ;
const upload = await GCClient . uploadImage (
latestActivty ,
'./some/path/to/file.jpg'
) ;
Hapus gambar dari aktivitas
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>
Mengambil langkah total untuk tanggal tertentu.
date
(Tanggal, opsional): Tanggal informasi langkah yang diminta; defaultnya adalah hari ini jika tidak ada tanggal yang diberikan. Promise<number>
: Janji yang menyelesaikan total langkah untuk tanggal yang ditentukan. const totalSteps = await GCClient . getSteps ( new Date ( '2020-03-24' ) ) ;
getSleepData(date: string): Promise<SleepData>
Mengambil semua data tidur untuk tanggal tertentu
date
(Tanggal, opsional): Tanggal informasi yang diminta, ini akan default ke hari ini jika tidak ada tanggal yang diberikan Promise<SleepData>
: Janji yang menentukan objek yang berisi informasi tidur mendetail.
dailySleepDTO
(objek): Informasi tentang tidur harian pengguna.id
(angka): Pengidentifikasi unik dari catatan tidur.userProfilePK
(nomor): Pengidentifikasi profil pengguna.calendarDate
(string): Tanggal catatan tidur.sleepMovement
(array): Serangkaian data pergerakan tidur.remSleepData
(boolean): Menunjukkan apakah data tidur REM tersedia.sleepLevels
(array): Serangkaian data tingkat tidur.restlessMomentsCount
(angka): Hitungan momen gelisah saat tidur. const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getSleepDuration(date: string): Promise<{hours: number, minutes: number}
Mengambil jam dan menit tidur untuk tanggal tertentu
date
(Tanggal, opsional): Tanggal informasi yang diminta, ini akan default ke hari ini jika tidak ada tanggal yang diberikan Promise<{hours: string, minutes: string }>
: Janji yang menentukan objek yang berisi informasi tentang durasi tidur
hours
(string): Jumlah jamminutes
(string): Jumlah menit const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getDailyWeightData(date?: Date): Promise<number>
Mengambil berat harian dan mengubahnya dari gram menjadi pon.
date
(Tanggal, opsional): Tanggal informasi yang diminta. Defaultnya adalah tanggal saat ini. Promise<number>
: Janji yang mengubah berat harian dari gram menjadi pon. Error
: Jika data berat harian yang valid tidak dapat ditemukan untuk tanggal yang ditentukan. const weightData = await GCClient . getDailyWeightData ( new Date ( '2023-12-25' ) ) ;
getDailyWeightInPounds(date?: Date): Promise<number>
Mengambil berat harian dalam pound untuk tanggal tertentu.
date
(Tanggal, opsional): Tanggal informasi yang diminta; defaultnya adalah hari ini jika tidak ada tanggal yang diberikan. Promise<number>
: Janji yang menentukan berat harian dalam pon. const weightInPounds = await GCClient . getDailyWeightInPounds (
new Date ( '2020-03-24' )
) ;
getDailyHydration(date?: Date): Promise<number>
Mengambil data hidrasi harian dan mengubahnya dari mililiter menjadi ons.
date
(Tanggal, opsional): Tanggal informasi yang diminta. Defaultnya adalah tanggal saat ini.Promise<number>
: Promise yang menghasilkan data hidrasi harian yang dikonversi dari mililiter ke ons.Error
: Jika data hidrasi harian yang valid tidak dapat ditemukan pada tanggal yang ditentukan atau jika respon tidak valid. const hydrationInOunces = await GCClient . getDailyHydration (
new Date ( '2023-12-25' )
) ;
getGolfSummary(): Promise<GolfSummary>
Mengambil ringkasan data kartu skor golf.
Promise<GolfSummary>
: Janji yang menentukan ringkasan kartu skor golf. const golfSummary = await GCClient . getGolfSummary ( ) ;
getGolfScorecard(scorecardId: number): Promise<GolfScorecard>
Mengambil data kartu skor golf untuk kartu skor tertentu.
scorecardId
(angka): Pengidentifikasi untuk kartu skor golf yang diinginkan. Promise<GolfScorecard>
: Janji yang menentukan data kartu skor golf. const scorecardId = 123 ; // Replace with the desired scorecard ID
const golfScorecard = await GCClient . getGolfScorecard ( scorecardId ) ;
getHeartRate(date?: Date): Promise<HeartRate>
Mengambil data detak jantung harian untuk tanggal tertentu.
date
(Tanggal, opsional): Tanggal data detak jantung yang diminta; defaultnya adalah hari ini jika tidak ada tanggal yang diberikan. Promise<HeartRate>
: Janji yang menentukan data detak jantung harian. 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 ) ;
Menghapus suatu aktivitas.
const activities = await GCClient . getActivities ( 0 , 1 ) ;
const activity = activities [ 0 ] ;
await GCClient . deleteActivity ( activity ) ;
updateHydrationLogOunces(date?: Date, valueInOz: number): Promise<WaterIntake>
Menambahkan entri log hidrasi dalam ons untuk tanggal tertentu.
date
(Tanggal, opsional): Tanggal entri log; defaultnya adalah hari ini jika tidak ada tanggal yang diberikan.valueInOz
(angka): Jumlah asupan air dalam ons. Menerima angka negatif. Promise<WaterIntake>
: Janji yang menyelesaikan entri log hidrasi. const hydrationLogEntry = await GCClient . addHydrationLogOunces (
new Date ( '2020-03-24' ) ,
16
) ;
updateWeight(date = new Date(), lbs: number, timezone: string): Promise<UpdateWeight>
Memperbarui informasi berat
date
(opsional): Objek tanggal yang mewakili tanggal masuknya bobot. Defaultnya adalah tanggal sekarang jika tidak disediakan.lbs
(angka): Nilai berat dalam pound.timezone
(string): String yang mewakili zona waktu untuk entri bobot. Promise<UpdateWeight>
: Janji yang menentukan hasil pembaruan bobot. await GCClient . updateWeight ( undefined , 202.9 , 'America/Los_Angeles' ) ;
Untuk menambahkan latihan khusus, gunakan addWorkout
atau lebih khusus lagi addRunningWorkout
.
GCClient . addRunningWorkout ( 'My 5k run' , 5000 , 'Some description' ) ;
Akan menambahkan latihan lari sejauh 5 km yang disebut 'Lari 5 km saya' dan mengembalikan objek JSON yang mewakili latihan yang disimpan.
Untuk menambahkan olahraga ke kalender Anda, temukan olahraga Anda terlebih dahulu, lalu tambahkan ke tanggal tertentu.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . scheduleWorkout ( { workoutId : id } , new Date ( '2020-03-24' ) ) ;
Ini akan menambahkan latihan ke tanggal tertentu di kalender Anda dan membuatnya muncul secara otomatis jika Anda menggunakan salah satu jam tangan Garmin.
Menghapus latihan sangat mirip dengan menjadwalkannya.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . deleteWorkout ( { workoutId : id } ) ;
Pustaka ini akan menangani permintaan khusus untuk sesi Garmin Connect aktif Anda. Ada banyak url berbeda yang digunakan, yang berarti perpustakaan ini mungkin tidak mencakup semuanya. Dengan menggunakan alat analisis jaringan Anda dapat menemukan url yang digunakan oleh Garmin Connect untuk mengambil data.
Anggaplah saya menemukan permintaan GET
ke url berikut:
https://connect.garmin.com/modern/proxy/wellness-service/wellness/dailyHeartRate/22f5f84c-de9d-4ad6-97f2-201097b3b983?date=2020-03-24
Permintaan dapat dikirim menggunakan GCClient
dengan menjalankan
// 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 } ) ;
dan akan memberi Anda hasil yang sama seperti menggunakan cara yang disediakan
GCClient . getHeartRate ( ) ;
Perhatikan bagaimana klien akan melacak url, informasi pengguna Anda, serta menjaga sesi tetap hidup.
Banyak respons dari Garmin Connect yang tidak memiliki definisi tipe dan default unknown
. Jangan ragu untuk menambahkan tipe dengan membuka permintaan tarik.
Untuk saat ini, perpustakaan ini hanya mendukung hal berikut: