المهام:
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
الحالية Json لإرفاق منصت إلى حدث ما، استخدم التابع .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
(نوع النشاط، اختياري): نوع النشاط (إذا كان محددًا، يجب أن تكون البداية فارغة).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 واجهة برمجة تطبيقات التحميل، ولا تحتوي الاستجابة 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
(منطقي): يشير إلى ما إذا كانت بيانات نوم حركة العين السريعة متاحة أم لا.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 كيلومتر يسمى "My 5k run" وإرجاع كائن 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
. لا تتردد في إضافة أنواع عن طريق فتح طلب السحب.
في الوقت الحالي، تدعم هذه المكتبة ما يلي فقط: