@gooin/garmin-connect 1.8.4 → 1.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -0
- package/dist/common/FileMFASessionStorage.js +1 -1
- package/dist/common/HttpClient copy.js +1 -1
- package/dist/common/HttpClient.js +1 -1
- package/dist/common/HttpClientOLD.js +1 -1
- package/dist/common/HttpClientOLDV1.js +1 -1
- package/dist/common/HttpClientV1.js +1 -1
- package/dist/common/MFAManager.js +1 -1
- package/dist/common/MFASessionStorage.js +1 -1
- package/dist/common/RedisMFASessionStorage.js +1 -1
- package/dist/garmin/GarminConnect.d.ts +18 -4
- package/dist/garmin/GarminConnect.js +1 -1
- package/dist/garmin/UrlClass.d.ts +6 -0
- package/dist/garmin/UrlClass.js +1 -1
- package/dist/garmin/UrlClass.js.map +1 -1
- package/dist/garmin/common/DateUtils.js +1 -1
- package/dist/garmin/common/HydrationUtils.js +1 -1
- package/dist/garmin/common/WeightUtils.js +1 -1
- package/dist/garmin/modules/activity/base.d.ts +5 -2
- package/dist/garmin/modules/activity/base.js +1 -1
- package/dist/garmin/modules/activity/base.js.map +1 -1
- package/dist/garmin/modules/activity/cycling.js +1 -1
- package/dist/garmin/modules/activity/running.d.ts +3 -0
- package/dist/garmin/modules/activity/running.js +1 -1
- package/dist/garmin/modules/activity/running.js.map +1 -1
- package/dist/garmin/modules/activity/training-status.d.ts +3 -0
- package/dist/garmin/modules/activity/training-status.js +1 -1
- package/dist/garmin/modules/activity/training-status.js.map +1 -1
- package/dist/garmin/modules/coach/activity-summary.d.ts +1 -0
- package/dist/garmin/modules/coach/activity-summary.js +1 -1
- package/dist/garmin/modules/coach/activity-summary.js.map +1 -1
- package/dist/garmin/modules/coach/helpers.d.ts +12 -2
- package/dist/garmin/modules/coach/helpers.js +1 -1
- package/dist/garmin/modules/coach/helpers.js.map +1 -1
- package/dist/garmin/modules/coach/sleep-analysis.d.ts +8 -0
- package/dist/garmin/modules/coach/sleep-analysis.js +1 -0
- package/dist/garmin/modules/coach/sleep-analysis.js.map +1 -0
- package/dist/garmin/modules/coach/training-overview.js +1 -1
- package/dist/garmin/modules/coach/training-overview.js.map +1 -1
- package/dist/garmin/modules/coach/wellness-overview.js +1 -1
- package/dist/garmin/modules/coach/wellness-overview.js.map +1 -1
- package/dist/garmin/modules/coach/wellness-summary.js +1 -1
- package/dist/garmin/modules/coach.d.ts +2 -1
- package/dist/garmin/modules/coach.js +1 -1
- package/dist/garmin/modules/coach.js.map +1 -1
- package/dist/garmin/modules/course.js +1 -1
- package/dist/garmin/modules/device.js +1 -1
- package/dist/garmin/modules/misc.js +1 -1
- package/dist/garmin/modules/types.js +1 -1
- package/dist/garmin/modules/user.js +1 -1
- package/dist/garmin/modules/wellness/body-battery.js +1 -1
- package/dist/garmin/modules/wellness/heart-rate.js +1 -1
- package/dist/garmin/modules/wellness/hrv.js +1 -1
- package/dist/garmin/modules/wellness/hydration.js +1 -1
- package/dist/garmin/modules/wellness/sleep.js +1 -1
- package/dist/garmin/modules/wellness/sleep.js.map +1 -1
- package/dist/garmin/modules/wellness/weight.js +1 -1
- package/dist/garmin/modules/workout.d.ts +9 -3
- package/dist/garmin/modules/workout.js +1 -1
- package/dist/garmin/modules/workout.js.map +1 -1
- package/dist/garmin/types/activity-stats.js +1 -1
- package/dist/garmin/types/activity.d.ts +30 -0
- package/dist/garmin/types/activity.js +1 -1
- package/dist/garmin/types/body-battery.js +1 -1
- package/dist/garmin/types/coach.d.ts +21 -0
- package/dist/garmin/types/coach.js +1 -1
- package/dist/garmin/types/course.js +1 -1
- package/dist/garmin/types/cycling.js +1 -1
- package/dist/garmin/types/device.js +1 -1
- package/dist/garmin/types/golf.js +1 -1
- package/dist/garmin/types/heartrate.js +1 -1
- package/dist/garmin/types/hrv.js +1 -1
- package/dist/garmin/types/hydration.js +1 -1
- package/dist/garmin/types/index.d.ts +1 -0
- package/dist/garmin/types/index.js +1 -1
- package/dist/garmin/types/index.js.map +1 -1
- package/dist/garmin/types/personal-info.js +1 -1
- package/dist/garmin/types/race-prediction.js +1 -1
- package/dist/garmin/types/sleep.d.ts +31 -0
- package/dist/garmin/types/sleep.js +1 -1
- package/dist/garmin/types/training-status.js +1 -1
- package/dist/garmin/types/weight.js +1 -1
- package/dist/garmin/types/workout.d.ts +167 -0
- package/dist/garmin/types/workout.js +1 -0
- package/dist/garmin/types/workout.js.map +1 -0
- package/dist/garmin/workouts/Running.js +1 -1
- package/dist/garmin/workouts/templates/RunningTemplate.js +1 -1
- package/dist/garmin/workouts/workout-draft.d.ts +3 -0
- package/dist/garmin/workouts/workout-draft.js +1 -0
- package/dist/garmin/workouts/workout-draft.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils.js +1 -1
- package/package.json +8 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';function a2_0x8e43(){const _0x20641b=['consumer_key','登录失败(账户已锁定),请打开Connect网页解锁您的账户','oauth1Token','step1Params','Request\x20Timeout','response','handleMFAWithCode','lodash','Token\x20expired!','MFAManager','use','isAxiosError','登录失败(未找到页面标题)','extractCsrfToken','GET','application/x-www-form-urlencoded','handleError','consumer_secret','true','响应跟踪\x20-\x20Location头:','handlePageTitle','exec','__importDefault','login','176523kQPVUh','performLoginStep1','1267184aqQCbs','var\x20statuss*=s*\x22([^\x22]*)\x22','status','username','No\x20OAuth2\x20token\x20available\x20(登录失败,密码错误)','url','Authorization','headers','submitMFACode','domain','🚀\x20-\x20handleMFA\x20-\x20mfaCode:','/verifyMFA/loginEnterMfaCode','oauth2Token','getOauth1Token','toSeconds','GARMIN_SSO','Login\x20failed:','isMFARequired','onTokenChange','Update\x20Phone\x20Number','./MFAManager','响应跟踪\x20-\x20最终URL:','fetchOauthConsumer','setOauth2TokenExpiresAt','luxon','each','request','append','响应跟踪\x20-\x20重定向次数:','CookieJar','oauth_token_secret','sha1','parse','/signin','/preauthorized?','validateMFAResult','tough-cookie','__esModule','expires_at','axios-cookiejar-support','OAUTH_URL','无法从MFA页面提取CSRF令牌','Bearer\x20','expires_in','HMAC-SHA1','embed','OAUTH_CONSUMER','>\x20响应跟踪\x20-\x20URL:','name=\x22_csrf\x22\x5cs+value=\x22(.+?)\x22','Token\x20refresh\x20failed:','prepareLoginParams','waitForMFACode','performLoginStep3','5374854RQQEDB','刷新OAuth2令牌失败:','GC_MODERN','defaults','file','):\x20','响应跟踪\x20-\x20检测到重定向状态码:','data','_retry','1289310FzqyUF','22cZOMot','create','access_token','1701120iOiVwM','mfaStorageDir','config','缺少刷新令牌所需的必要令牌','performLoginStep2','setupInterceptors','检测到重定向到包含logintoken的URL:','handleAccountLocked','defineProperty','登录页面标题:','update','wrapper','put','getInstance','includes','responseURL','refreshOauth2Token','exchange','toLocal','error','MFA验证失败:','_csrf','oauth','getOauthClient','com.garmin.android.apps.connectmobile','handleResponseError','sign','common','GARMIN_SSO_EMBED','interceptors','toString','timeout','」的OAuth2令牌刷新成功','authorize','setCommonHeader','🚀\x20-\x20getLoginTicket\x20-\x20等待验证码\x20sessionId:','client','mfa','Network\x20error\x20or\x20unknown\x20error\x20occurred','mfa-code','verifyMFA','SIGNIN_URL','password','base64','default','post','Mozilla/5.0\x20(Macintosh;\x20Intel\x20Mac\x20OS\x20X\x2010_15_7)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/131.0.0.0\x20Safari/537.36','GarminConnect','location','🚀\x20-\x20getLoginTicket\x20-\x20收到验证码\x20mfaCode:','HttpClient','delete','stringify','mfaManager','GARMIN_SSO_ORIGIN','MFA验证失败:\x20','log','gauth-widget','UNAUTHORIZED','MFA验证后的页面标题:','DELETE','extractTicket','handleHttpError','logResponseTracking','get','Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/117.0.0.0\x20Safari/537.36','\x20ms','Request\x20Timeout:\x20>\x20','code','step3Params','handleMFA','toHeader','登录失败(需要更新电话号码),请更新您的电话号码,参考:\x20https://github.com/matin/garth/issues/19','415774AnFsqB','HTTP\x20Error\x20(','6985447URokJB','https://thegarth.s3.amazonaws.com/oauth_consumer.json'];a2_0x8e43=function(){return _0x20641b;};return a2_0x8e43();}const a2_0x539e2b=a2_0x8c4b;(function(_0x15ae0e,_0x2a0313){const _0x2ebdb0=a2_0x8c4b,_0x4baae7=_0x15ae0e();while(!![]){try{const _0x49170d=parseInt(_0x2ebdb0(0x247))/0x1+-parseInt(_0x2ebdb0(0x1fb))/0x2*(-parseInt(_0x2ebdb0(0x263))/0x3)+-parseInt(_0x2ebdb0(0x265))/0x4+parseInt(_0x2ebdb0(0x1fa))/0x5+parseInt(_0x2ebdb0(0x1f1))/0x6+-parseInt(_0x2ebdb0(0x249))/0x7+-parseInt(_0x2ebdb0(0x1fe))/0x8;if(_0x49170d===_0x2a0313)break;else _0x4baae7['push'](_0x4baae7['shift']());}catch(_0x292a48){_0x4baae7['push'](_0x4baae7['shift']());}}}(a2_0x8e43,0xa84bb));var __importDefault=this&&this[a2_0x539e2b(0x261)]||function(_0x1b5365){return _0x1b5365&&_0x1b5365['__esModule']?_0x1b5365:{'default':_0x1b5365};};Object[a2_0x539e2b(0x206)](exports,a2_0x539e2b(0x1e1),{'value':!![]}),exports[a2_0x539e2b(0x230)]=void 0x0;const axios_1=__importDefault(require('axios')),lodash_1=__importDefault(require(a2_0x539e2b(0x252))),luxon_1=require(a2_0x539e2b(0x1d4)),oauth_1_0a_1=__importDefault(require('oauth-1.0a')),qs_1=__importDefault(require('qs')),MFAManager_1=require(a2_0x539e2b(0x279)),node_crypto_1=__importDefault(require('node:crypto')),tough_cookie_1=require(a2_0x539e2b(0x1e0)),axios_cookiejar_support_1=require(a2_0x539e2b(0x1e3)),CSRF_RE=new RegExp(a2_0x539e2b(0x1ec)),TICKET_RE=new RegExp('ticket=([^\x22]+)\x22'),ACCOUNT_LOCKED_RE=new RegExp(a2_0x539e2b(0x266)),PAGE_TITLE_RE=new RegExp('<title>([^<]*)</title>'),USER_AGENT_CONNECTMOBILE=a2_0x539e2b(0x216),USER_AGENT_BROWSER=a2_0x539e2b(0x23f),USER_AGENT_BROWSER_MAC=a2_0x539e2b(0x22c),OAUTH_CONSUMER_URL=a2_0x539e2b(0x24a),HTTP_STATUS={'UNAUTHORIZED':0x191};let tokenRefreshPromise=null,refreshSubscribers=[];class HttpClient{constructor(_0x1b77d1,_0x18abfb){const _0x470bb3=a2_0x539e2b;var _0x16c330,_0x2f48ab;const _0x22a760=new tough_cookie_1[(_0x470bb3(0x1d9))]();this[_0x470bb3(0x26a)]=_0x1b77d1,this['client']=(0x0,axios_cookiejar_support_1[_0x470bb3(0x209)])(axios_1[_0x470bb3(0x22a)][_0x470bb3(0x1fc)]({'timeout':(_0x16c330=_0x18abfb===null||_0x18abfb===void 0x0?void 0x0:_0x18abfb[_0x470bb3(0x21d)])!==null&&_0x16c330!==void 0x0?_0x16c330:0x1388,'timeoutErrorMessage':_0x470bb3(0x241)+((_0x2f48ab=_0x18abfb===null||_0x18abfb===void 0x0?void 0x0:_0x18abfb[_0x470bb3(0x21d)])!==null&&_0x2f48ab!==void 0x0?_0x2f48ab:0x1388)+_0x470bb3(0x240),'maxRedirects':0xa,'validateStatus':function(_0x5aa234){return _0x5aa234>=0xc8&&_0x5aa234<0x190;},'withCredentials':!![],'jar':_0x22a760})),this['config']=_0x18abfb;const _0x13a318=_0x18abfb[_0x470bb3(0x223)]||{'type':_0x470bb3(0x1f5),'dir':_0x18abfb[_0x470bb3(0x1ff)]||'/tmp'};this[_0x470bb3(0x233)]=MFAManager_1[_0x470bb3(0x254)][_0x470bb3(0x20b)](_0x13a318),this[_0x470bb3(0x203)]();}[a2_0x539e2b(0x203)](){const _0x32f3ee=a2_0x539e2b;this[_0x32f3ee(0x222)][_0x32f3ee(0x21b)]['response']['use'](_0x43f146=>{return _0x43f146;},async _0x1de86c=>{const _0x43c466=_0x32f3ee;return this[_0x43c466(0x217)](_0x1de86c);}),this[_0x32f3ee(0x222)]['interceptors'][_0x32f3ee(0x1d6)][_0x32f3ee(0x255)](async _0x7785a=>{const _0x2d769a=_0x32f3ee;return this[_0x2d769a(0x271)]&&(_0x7785a[_0x2d769a(0x26c)][_0x2d769a(0x26b)]=_0x2d769a(0x1e6)+this[_0x2d769a(0x271)][_0x2d769a(0x1fd)]),_0x7785a;});}[a2_0x539e2b(0x23d)](_0x488086){const _0x991866=a2_0x539e2b;var _0x287f50,_0x3b86a4,_0x550acf,_0x53b579;(((_0x287f50=_0x488086[_0x991866(0x200)][_0x991866(0x26a)])===null||_0x287f50===void 0x0?void 0x0:_0x287f50[_0x991866(0x20c)]('signin'))||((_0x3b86a4=_0x488086['config']['url'])===null||_0x3b86a4===void 0x0?void 0x0:_0x3b86a4[_0x991866(0x20c)](_0x991866(0x226))))&&(console[_0x991866(0x236)](_0x991866(0x1eb),_0x488086['config'][_0x991866(0x26a)]),console[_0x991866(0x236)]('响应跟踪\x20-\x20状态码:',_0x488086['status']),console[_0x991866(0x236)](_0x991866(0x27a),((_0x550acf=_0x488086[_0x991866(0x1d6)])===null||_0x550acf===void 0x0?void 0x0:_0x550acf[_0x991866(0x20d)])||_0x488086[_0x991866(0x200)]['url']),console[_0x991866(0x236)](_0x991866(0x1d8),((_0x53b579=_0x488086['request'])===null||_0x53b579===void 0x0?void 0x0:_0x53b579['redirectCount'])||0x0),_0x488086['headers'][_0x991866(0x22e)]&&console[_0x991866(0x236)](_0x991866(0x25e),_0x488086[_0x991866(0x26c)][_0x991866(0x22e)]),_0x488086[_0x991866(0x267)]>=0x12c&&_0x488086['status']<0x190&&console['log'](_0x991866(0x1f7),_0x488086[_0x991866(0x267)]));}async[a2_0x539e2b(0x217)](_0x243251){const _0x1f50bd=a2_0x539e2b;var _0x3e5f81,_0x4acf88,_0x5c5df2;if(axios_1['default']['isAxiosError'](_0x243251)&&_0x243251[_0x1f50bd(0x242)]==='ECONNABORTED')throw new Error(_0x243251['message']||_0x1f50bd(0x24f));const _0x1faded=_0x243251[_0x1f50bd(0x200)];if(((_0x3e5f81=_0x243251===null||_0x243251===void 0x0?void 0x0:_0x243251[_0x1f50bd(0x250)])===null||_0x3e5f81===void 0x0?void 0x0:_0x3e5f81['status'])===HTTP_STATUS[_0x1f50bd(0x238)]&&!(_0x1faded===null||_0x1faded===void 0x0?void 0x0:_0x1faded[_0x1f50bd(0x1f9)])){if(!this[_0x1f50bd(0x271)]){if(((_0x4acf88=_0x1faded===null||_0x1faded===void 0x0?void 0x0:_0x1faded['url'])===null||_0x4acf88===void 0x0?void 0x0:_0x4acf88[_0x1f50bd(0x20c)]('signin'))||((_0x5c5df2=_0x1faded===null||_0x1faded===void 0x0?void 0x0:_0x1faded[_0x1f50bd(0x26a)])===null||_0x5c5df2===void 0x0?void 0x0:_0x5c5df2[_0x1f50bd(0x20c)](_0x1f50bd(0x262))))throw new Error(_0x1f50bd(0x269));throw new Error('No\x20OAuth2\x20token\x20available');}_0x1faded[_0x1f50bd(0x1f9)]=!![];try{return!tokenRefreshPromise&&(tokenRefreshPromise=this[_0x1f50bd(0x20e)]()['finally'](()=>{tokenRefreshPromise=null;})),await tokenRefreshPromise,_0x1faded['headers'][_0x1f50bd(0x26b)]=_0x1f50bd(0x1e6)+this[_0x1f50bd(0x271)]['access_token'],this[_0x1f50bd(0x222)](_0x1faded);}catch(_0x1f42f9){console[_0x1f50bd(0x211)](_0x1f50bd(0x1ed),_0x1f42f9);throw _0x1f42f9;}}if(axios_1[_0x1f50bd(0x22a)][_0x1f50bd(0x256)](_0x243251)&&_0x243251['response'])this[_0x1f50bd(0x25b)](_0x243251[_0x1f50bd(0x250)]);else throw new Error(_0x1f50bd(0x224));throw _0x243251;}async[a2_0x539e2b(0x27b)](){const _0x298e50=a2_0x539e2b,_0x4da485=await axios_1[_0x298e50(0x22a)][_0x298e50(0x23e)](OAUTH_CONSUMER_URL);this[_0x298e50(0x1ea)]={'key':_0x4da485['data'][_0x298e50(0x24b)],'secret':_0x4da485['data'][_0x298e50(0x25c)]};}async['checkTokenVaild'](){const _0x3c26be=a2_0x539e2b;this[_0x3c26be(0x271)]&&(this['oauth2Token'][_0x3c26be(0x1e2)]<luxon_1['DateTime']['now']()[_0x3c26be(0x273)]()&&(console[_0x3c26be(0x211)](_0x3c26be(0x253)),await this[_0x3c26be(0x20e)]()));}async['get'](_0x356346,_0xdc4c89){const _0x51579c=a2_0x539e2b,_0x44da27=await this[_0x51579c(0x222)][_0x51579c(0x23e)](_0x356346,_0xdc4c89);return _0x44da27===null||_0x44da27===void 0x0?void 0x0:_0x44da27[_0x51579c(0x1f8)];}async[a2_0x539e2b(0x22b)](_0x1efd19,_0x10902c,_0x48b5b2){const _0x2ef48d=a2_0x539e2b,_0x1bb457=await this[_0x2ef48d(0x222)][_0x2ef48d(0x22b)](_0x1efd19,_0x10902c,_0x48b5b2);return _0x1bb457===null||_0x1bb457===void 0x0?void 0x0:_0x1bb457['data'];}async['put'](_0x23ed3f,_0x2deb72,_0x19ccfe){const _0x218000=a2_0x539e2b,_0x3eb3c7=await this[_0x218000(0x222)][_0x218000(0x20a)](_0x23ed3f,_0x2deb72,_0x19ccfe);return _0x3eb3c7===null||_0x3eb3c7===void 0x0?void 0x0:_0x3eb3c7[_0x218000(0x1f8)];}async[a2_0x539e2b(0x231)](_0x6495dc,_0x1b22f2){const _0x59727c=a2_0x539e2b,_0xdbc29b=await this[_0x59727c(0x222)][_0x59727c(0x22b)](_0x6495dc,null,{..._0x1b22f2,'headers':{..._0x1b22f2===null||_0x1b22f2===void 0x0?void 0x0:_0x1b22f2['headers'],'X-Http-Method-Override':_0x59727c(0x23a)}});return _0xdbc29b===null||_0xdbc29b===void 0x0?void 0x0:_0xdbc29b[_0x59727c(0x1f8)];}[a2_0x539e2b(0x220)](_0xee3327){const _0xde0907=a2_0x539e2b;lodash_1[_0xde0907(0x22a)][_0xde0907(0x1d5)](_0xee3327,(_0x450643,_0x2923ad)=>{const _0x493db2=_0xde0907;this[_0x493db2(0x222)][_0x493db2(0x1f4)][_0x493db2(0x26c)][_0x493db2(0x219)][_0x2923ad]=_0x450643;});}['handleError'](_0x4f59b1){const _0x4e89ac=a2_0x539e2b;this[_0x4e89ac(0x23c)](_0x4f59b1);}['handleHttpError'](_0x16f07f){const _0xe441a0=a2_0x539e2b,{status:_0x457519,statusText:_0x354bfc,data:_0x1c7ef8}=_0x16f07f,_0x3a89dc={'status':_0x457519,'statusText':_0x354bfc,'data':typeof _0x1c7ef8==='object'?JSON['stringify'](_0x1c7ef8):_0x1c7ef8};console['error']('HTTP\x20Error:',_0x3a89dc);throw new Error(_0xe441a0(0x248)+_0x457519+_0xe441a0(0x1f6)+_0x354bfc);}async[a2_0x539e2b(0x262)](_0x314923,_0x3856d4,_0x1d48d0){const _0xb82ecb=a2_0x539e2b;try{await this[_0xb82ecb(0x27b)]();const _0xf5ab39=await this['getLoginTicket'](_0x314923,_0x3856d4,_0x1d48d0),_0x35aa5e=await this[_0xb82ecb(0x272)](_0xf5ab39);return await this[_0xb82ecb(0x20f)](_0x35aa5e),this;}catch(_0x32d939){console['error'](_0xb82ecb(0x275),_0x32d939);throw _0x32d939;}}async['getLoginTicket'](_0x5ab636,_0x1db664,_0x14e921){const _0xb1f01e=a2_0x539e2b,_0x16ac40=this['prepareLoginParams']();await this['performLoginStep1'](_0x16ac40[_0xb1f01e(0x24e)]);const _0x4ce44e=await this['performLoginStep2'](_0x16ac40['step2Params']);let _0x357e4f=await this[_0xb1f01e(0x1f0)](_0x5ab636,_0x1db664,_0x4ce44e,_0x16ac40['step3Params']);this['handleAccountLocked'](_0x357e4f);const _0x466025=this[_0xb1f01e(0x25f)](_0x357e4f);if(this['isMFARequired'](_0x466025)){if(_0x14e921){console[_0xb1f01e(0x236)](_0xb1f01e(0x221),_0x14e921);const _0x554883=await this[_0xb1f01e(0x233)][_0xb1f01e(0x1ef)](_0x14e921);console[_0xb1f01e(0x236)](_0xb1f01e(0x22f),_0x554883),_0x357e4f=await this[_0xb1f01e(0x251)](_0x357e4f,_0x16ac40[_0xb1f01e(0x243)],_0x554883);}else throw new Error('需要MFA验证,但未提供验证码获取方式');}const _0x26fa63=this[_0xb1f01e(0x23b)](_0x357e4f);if(!_0x26fa63)throw new Error('登录失败(未找到票据或MFA验证失败),请检查用户名和密码');return _0x26fa63;}[a2_0x539e2b(0x1ee)](){const _0x373a8c=a2_0x539e2b;return{'step1Params':{'clientId':_0x373a8c(0x22d),'locale':'en','service':this[_0x373a8c(0x26a)][_0x373a8c(0x1f3)]},'step2Params':{'id':_0x373a8c(0x237),'embedWidget':!![],'locale':'en','gauthHost':this[_0x373a8c(0x26a)][_0x373a8c(0x21a)]},'step3Params':{'id':_0x373a8c(0x237),'embedWidget':!![],'clientId':_0x373a8c(0x22d),'locale':'en','gauthHost':this[_0x373a8c(0x26a)]['GARMIN_SSO_EMBED'],'service':this[_0x373a8c(0x26a)][_0x373a8c(0x21a)],'source':this[_0x373a8c(0x26a)]['GARMIN_SSO_EMBED'],'redirectAfterAccountLoginUrl':this[_0x373a8c(0x26a)]['GARMIN_SSO_EMBED'],'redirectAfterAccountCreationUrl':this[_0x373a8c(0x26a)]['GARMIN_SSO_EMBED']}};}async[a2_0x539e2b(0x264)](_0x400b08){const _0x1d7020=a2_0x539e2b,_0x4987ad=this['url']['GARMIN_SSO_EMBED']+'?'+qs_1['default'][_0x1d7020(0x232)](_0x400b08);await this[_0x1d7020(0x222)][_0x1d7020(0x23e)](_0x4987ad);}async[a2_0x539e2b(0x202)](_0x3394e6){const _0x24852a=a2_0x539e2b,_0x36526f=this[_0x24852a(0x26a)][_0x24852a(0x227)]+'?'+qs_1[_0x24852a(0x22a)][_0x24852a(0x232)](_0x3394e6),_0x96a0f4=await this['get'](_0x36526f),_0x3a9c27=this[_0x24852a(0x258)](_0x96a0f4);if(!_0x3a9c27)throw new Error('登录\x20-\x20未找到CSRF令牌');return _0x3a9c27;}async['performLoginStep3'](_0x448fdf,_0xca9d2f,_0xba2a06,_0x596977){const _0x2456c9=a2_0x539e2b,_0x27c44e=this[_0x2456c9(0x26a)][_0x2456c9(0x227)]+'?'+qs_1[_0x2456c9(0x22a)][_0x2456c9(0x232)](_0x596977),_0x30613=new URLSearchParams();return _0x30613[_0x2456c9(0x1d7)](_0x2456c9(0x268),_0x448fdf),_0x30613[_0x2456c9(0x1d7)](_0x2456c9(0x228),_0xca9d2f),_0x30613['append'](_0x2456c9(0x1e9),_0x2456c9(0x25d)),_0x30613['append'](_0x2456c9(0x213),_0xba2a06),this[_0x2456c9(0x22b)](_0x27c44e,_0x30613,{'headers':{'Content-Type':_0x2456c9(0x25a),'Dnt':0x1,'Origin':this[_0x2456c9(0x26a)][_0x2456c9(0x234)],'Referer':this['url']['SIGNIN_URL'],'User-Agent':USER_AGENT_CONNECTMOBILE}});}[a2_0x539e2b(0x276)](_0x4e29a9){const _0x15106a=a2_0x539e2b,_0x1a2ff4=_0x4e29a9['toLowerCase']();return _0x1a2ff4[_0x15106a(0x20c)](_0x15106a(0x223))||_0x1a2ff4['includes']('authentication')&&!_0x1a2ff4[_0x15106a(0x20c)](_0x15106a(0x218));}['extractTicket'](_0x321976){const _0x4627fb=a2_0x539e2b,_0x58b0b4=TICKET_RE[_0x4627fb(0x260)](_0x321976);return _0x58b0b4?_0x58b0b4[0x1]:null;}async[a2_0x539e2b(0x251)](_0x5b301e,_0x517d44,_0x238e3f){const _0xd01eca=a2_0x539e2b;try{const _0x4a413a=this['extractCsrfToken'](_0x5b301e);if(!_0x4a413a)throw new Error('MFA验证\x20-\x20未找到CSRF令牌');const _0x598891=await this['submitMFACode'](_0x4a413a,_0x238e3f,_0x517d44);return this[_0xd01eca(0x1df)](_0x598891);}catch(_0x21e1f8){console[_0xd01eca(0x211)](_0xd01eca(0x212),_0x21e1f8);throw new Error(_0xd01eca(0x235)+_0x21e1f8);}}async[a2_0x539e2b(0x244)](_0xc64596,_0x2e12c3,_0x45c653){const _0x8d69b6=a2_0x539e2b;if(!_0x45c653)throw new Error('登录失败(需要MFA验证),请提供MFA回调函数');const _0x37120e=this['extractCsrfToken'](_0xc64596);if(!_0x37120e)throw new Error(_0x8d69b6(0x1e5));const _0x536d82=await _0x45c653();console['log'](_0x8d69b6(0x26f),_0x536d82);const _0x134932=await this[_0x8d69b6(0x26d)](_0x37120e,_0x536d82,_0x2e12c3);return this[_0x8d69b6(0x1df)](_0x134932);}async[a2_0x539e2b(0x26d)](_0x1831de,_0x45a0a4,_0x268588){const _0x43a4d4=a2_0x539e2b,_0x2b8a7d=this[_0x43a4d4(0x26a)][_0x43a4d4(0x274)],_0x1c0440=new URLSearchParams();return _0x1c0440['append'](_0x43a4d4(0x225),_0x45a0a4),_0x1c0440[_0x43a4d4(0x1d7)](_0x43a4d4(0x1e9),_0x43a4d4(0x25d)),_0x1c0440[_0x43a4d4(0x1d7)](_0x43a4d4(0x213),_0x1831de),this['post'](_0x2b8a7d+_0x43a4d4(0x270),_0x1c0440,{'params':_0x268588,'headers':{'Content-Type':_0x43a4d4(0x25a),'Dnt':0x1,'Origin':this['url'][_0x43a4d4(0x234)],'Referer':_0x2b8a7d+_0x43a4d4(0x1dd),'User-Agent':USER_AGENT_BROWSER},'maxRedirects':0xa,'transformResponse':[function(_0xd7dab3,_0x33e46f){const _0x18686f=_0x43a4d4;return _0x33e46f[_0x18686f(0x22e)]&&_0x33e46f['location']['includes']('logintoken')&&console[_0x18686f(0x236)](_0x18686f(0x204),_0x33e46f[_0x18686f(0x22e)]),_0xd7dab3;}]});}[a2_0x539e2b(0x1df)](_0x364bb4){const _0x35c118=a2_0x539e2b,_0x19321a=this[_0x35c118(0x25f)](_0x364bb4);return console['log'](_0x35c118(0x239),_0x19321a),_0x364bb4;}[a2_0x539e2b(0x258)](_0x542785){const _0xe07e6c=a2_0x539e2b,_0xe26bbf=CSRF_RE[_0xe07e6c(0x260)](_0x542785);return _0xe26bbf?_0xe26bbf[0x1]:null;}[a2_0x539e2b(0x25f)](_0x5d0b7b){const _0x28995c=a2_0x539e2b,_0x32fc1b=PAGE_TITLE_RE['exec'](_0x5d0b7b);if(_0x32fc1b){const _0x2a152b=_0x32fc1b[0x1];console[_0x28995c(0x236)](_0x28995c(0x207),_0x2a152b);if(lodash_1[_0x28995c(0x22a)][_0x28995c(0x20c)](_0x2a152b,_0x28995c(0x278)))throw new Error(_0x28995c(0x246));return _0x2a152b;}else throw new Error(_0x28995c(0x257));}[a2_0x539e2b(0x205)](_0x3cc0a2){const _0x4f807a=a2_0x539e2b,_0x40a066=ACCOUNT_LOCKED_RE[_0x4f807a(0x260)](_0x3cc0a2);if(_0x40a066){const _0x32c66d=_0x40a066[0x1];console[_0x4f807a(0x211)](_0x32c66d);throw new Error(_0x4f807a(0x24c));}}async[a2_0x539e2b(0x20e)](){const _0x271ef4=a2_0x539e2b;try{!this[_0x271ef4(0x1ea)]&&await this[_0x271ef4(0x27b)]();if(!this[_0x271ef4(0x271)]||!this[_0x271ef4(0x24d)])throw new Error(_0x271ef4(0x201));const _0x45db5b={'oauth':this[_0x271ef4(0x215)](this[_0x271ef4(0x1ea)]),'token':this[_0x271ef4(0x24d)]};await this[_0x271ef4(0x20f)](_0x45db5b),console[_0x271ef4(0x236)]('「'+this['config'][_0x271ef4(0x268)]+'」在「'+this[_0x271ef4(0x26a)][_0x271ef4(0x26e)]+_0x271ef4(0x21e));}catch(_0x293873){console[_0x271ef4(0x211)](_0x271ef4(0x1f2),_0x293873);throw _0x293873;}}async[a2_0x539e2b(0x272)](_0x2ae045){const _0x4aae69=a2_0x539e2b;if(!this['OAUTH_CONSUMER'])throw new Error('未找到OAuth消费者信息');const _0xcb8fb2={'ticket':_0x2ae045,'login-url':this[_0x4aae69(0x26a)][_0x4aae69(0x21a)],'accepts-mfa-tokens':!![]},_0x1ca938=this[_0x4aae69(0x26a)][_0x4aae69(0x1e4)]+_0x4aae69(0x1de)+qs_1[_0x4aae69(0x22a)][_0x4aae69(0x232)](_0xcb8fb2),_0x365825=this[_0x4aae69(0x215)](this[_0x4aae69(0x1ea)]),_0x5045c1={'url':_0x1ca938,'method':_0x4aae69(0x259)},_0x3d4dbb=_0x365825[_0x4aae69(0x245)](_0x365825[_0x4aae69(0x21f)](_0x5045c1)),_0x7a6be4=await this[_0x4aae69(0x23e)](_0x1ca938,{'headers':{..._0x3d4dbb,'User-Agent':USER_AGENT_CONNECTMOBILE}}),_0x4c3a36=qs_1[_0x4aae69(0x22a)][_0x4aae69(0x1dc)](_0x7a6be4);return this[_0x4aae69(0x24d)]=_0x4c3a36,{'token':_0x4c3a36,'oauth':_0x365825};}['getOauthClient'](_0x10aee2){const _0x29bc61=a2_0x539e2b;return new oauth_1_0a_1[(_0x29bc61(0x22a))]({'consumer':_0x10aee2,'signature_method':_0x29bc61(0x1e8),'hash_function'(_0x45050c,_0x3950c9){const _0x4ea462=_0x29bc61;return node_crypto_1[_0x4ea462(0x22a)]['createHmac'](_0x4ea462(0x1db),_0x3950c9)[_0x4ea462(0x208)](_0x45050c)['digest'](_0x4ea462(0x229));}});}async['exchange'](_0x5c7687){const _0x3e327f=a2_0x539e2b,_0x5ad49a={'key':_0x5c7687['token']['oauth_token'],'secret':_0x5c7687['token'][_0x3e327f(0x1da)]},_0x78aa2e=this[_0x3e327f(0x26a)][_0x3e327f(0x1e4)]+'/exchange/user/2.0',_0x5c80cf={'url':_0x78aa2e,'method':'POST','data':null},_0x3530d8=_0x5c7687[_0x3e327f(0x214)][_0x3e327f(0x21f)](_0x5c80cf,_0x5ad49a),_0x52a2eb=_0x78aa2e+'?'+qs_1['default'][_0x3e327f(0x232)](_0x3530d8);this[_0x3e327f(0x271)]=undefined;const _0xcc2591=await this[_0x3e327f(0x22b)](_0x52a2eb,null,{'headers':{'User-Agent':USER_AGENT_CONNECTMOBILE,'Content-Type':'application/x-www-form-urlencoded'}});this[_0x3e327f(0x271)]=this[_0x3e327f(0x1d3)](_0xcc2591),this[_0x3e327f(0x277)]&&this[_0x3e327f(0x24d)]&&this[_0x3e327f(0x271)]&&this[_0x3e327f(0x277)]({'oauth1':this[_0x3e327f(0x24d)],'oauth2':this[_0x3e327f(0x271)]});}[a2_0x539e2b(0x1d3)](_0x2e0f99){const _0x575cb3=a2_0x539e2b,_0x4fc89b=luxon_1['DateTime']['now'](),_0x593216=_0x4fc89b['plus']({'seconds':_0x2e0f99[_0x575cb3(0x1e7)]}),_0x45850b=_0x4fc89b['plus']({'seconds':_0x2e0f99['refresh_token_expires_in']});return{..._0x2e0f99,'last_update_date':_0x4fc89b[_0x575cb3(0x210)]()[_0x575cb3(0x21c)](),'expires_date':_0x593216[_0x575cb3(0x210)]()[_0x575cb3(0x21c)](),'expires_at':_0x593216[_0x575cb3(0x273)](),'refresh_token_expires_at':_0x45850b[_0x575cb3(0x273)]()};}}function a2_0x8c4b(_0x495512,_0x4c0ad2){_0x495512=_0x495512-0x1d3;const _0x8e4312=a2_0x8e43();let _0x8c4b55=_0x8e4312[_0x495512];return _0x8c4b55;}exports[a2_0x539e2b(0x230)]=HttpClient;
|
|
1
|
+
'use strict';const a2_0x52e9fc=a2_0x5385;(function(_0xc67b72,_0x36f073){const _0x221a42=a2_0x5385,_0x3479cb=_0xc67b72();while(!![]){try{const _0x24c45d=-parseInt(_0x221a42(0x1cd))/0x1*(-parseInt(_0x221a42(0x14c))/0x2)+parseInt(_0x221a42(0x1e7))/0x3+-parseInt(_0x221a42(0x199))/0x4+parseInt(_0x221a42(0x166))/0x5*(-parseInt(_0x221a42(0x15f))/0x6)+-parseInt(_0x221a42(0x181))/0x7*(-parseInt(_0x221a42(0x177))/0x8)+parseInt(_0x221a42(0x1df))/0x9+parseInt(_0x221a42(0x141))/0xa;if(_0x24c45d===_0x36f073)break;else _0x3479cb['push'](_0x3479cb['shift']());}catch(_0x8a57e6){_0x3479cb['push'](_0x3479cb['shift']());}}}(a2_0x4e4d,0x73bf9));var __importDefault=this&&this['__importDefault']||function(_0x3166d9){const _0x4e5ab1=a2_0x5385;return _0x3166d9&&_0x3166d9[_0x4e5ab1(0x14d)]?_0x3166d9:{'default':_0x3166d9};};Object['defineProperty'](exports,a2_0x52e9fc(0x14d),{'value':!![]}),exports['HttpClient']=void 0x0;const axios_1=__importDefault(require(a2_0x52e9fc(0x160))),lodash_1=__importDefault(require(a2_0x52e9fc(0x1bd))),luxon_1=require(a2_0x52e9fc(0x1bb)),oauth_1_0a_1=__importDefault(require(a2_0x52e9fc(0x1ed))),qs_1=__importDefault(require('qs')),MFAManager_1=require('./MFAManager'),node_crypto_1=__importDefault(require('node:crypto')),tough_cookie_1=require(a2_0x52e9fc(0x15e)),axios_cookiejar_support_1=require(a2_0x52e9fc(0x1d0)),CSRF_RE=new RegExp('name=\x22_csrf\x22\x5cs+value=\x22(.+?)\x22'),TICKET_RE=new RegExp(a2_0x52e9fc(0x1ba)),ACCOUNT_LOCKED_RE=new RegExp(a2_0x52e9fc(0x192)),PAGE_TITLE_RE=new RegExp(a2_0x52e9fc(0x14f)),USER_AGENT_CONNECTMOBILE='com.garmin.android.apps.connectmobile',USER_AGENT_BROWSER=a2_0x52e9fc(0x157),USER_AGENT_BROWSER_MAC='Mozilla/5.0\x20(Macintosh;\x20Intel\x20Mac\x20OS\x20X\x2010_15_7)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/131.0.0.0\x20Safari/537.36',OAUTH_CONSUMER_URL=a2_0x52e9fc(0x16c),HTTP_STATUS={'UNAUTHORIZED':0x191};let tokenRefreshPromise=null,refreshSubscribers=[];class HttpClient{constructor(_0x242acf,_0x5a8106){const _0x26047c=a2_0x52e9fc;var _0x1e2859,_0x1b904a;const _0x5b1aaf=new tough_cookie_1['CookieJar']();this[_0x26047c(0x1d7)]=_0x242acf,this[_0x26047c(0x1bc)]=(0x0,axios_cookiejar_support_1[_0x26047c(0x1c1)])(axios_1[_0x26047c(0x14b)][_0x26047c(0x18c)]({'timeout':(_0x1e2859=_0x5a8106===null||_0x5a8106===void 0x0?void 0x0:_0x5a8106[_0x26047c(0x16b)])!==null&&_0x1e2859!==void 0x0?_0x1e2859:0x1388,'timeoutErrorMessage':'Request\x20Timeout:\x20>\x20'+((_0x1b904a=_0x5a8106===null||_0x5a8106===void 0x0?void 0x0:_0x5a8106[_0x26047c(0x16b)])!==null&&_0x1b904a!==void 0x0?_0x1b904a:0x1388)+_0x26047c(0x1c5),'maxRedirects':0xa,'validateStatus':function(_0x34e864){return _0x34e864>=0xc8&&_0x34e864<0x190;},'withCredentials':!![],'jar':_0x5b1aaf})),this['config']=_0x5a8106;const _0x25a8b1=_0x5a8106[_0x26047c(0x1b3)]||{'type':_0x26047c(0x1c9),'dir':_0x5a8106[_0x26047c(0x147)]||_0x26047c(0x17c)};this['mfaManager']=MFAManager_1[_0x26047c(0x1e1)][_0x26047c(0x1a1)](_0x25a8b1),this[_0x26047c(0x156)]();}[a2_0x52e9fc(0x156)](){const _0x4c2681=a2_0x52e9fc;this[_0x4c2681(0x1bc)][_0x4c2681(0x1b1)][_0x4c2681(0x1a6)]['use'](_0x3d4adb=>{return _0x3d4adb;},async _0xb71feb=>{return this['handleResponseError'](_0xb71feb);}),this[_0x4c2681(0x1bc)][_0x4c2681(0x1b1)]['request'][_0x4c2681(0x175)](async _0x5d3483=>{const _0xc7590d=_0x4c2681;return this[_0xc7590d(0x15b)]&&(_0x5d3483[_0xc7590d(0x1c4)]['Authorization']='Bearer\x20'+this[_0xc7590d(0x15b)][_0xc7590d(0x1c7)]),_0x5d3483;});}[a2_0x52e9fc(0x186)](_0x1efde6){const _0x30b6c9=a2_0x52e9fc;var _0x587102,_0x540e64,_0x4c6a03,_0x2f771e;(((_0x587102=_0x1efde6[_0x30b6c9(0x16a)][_0x30b6c9(0x1d7)])===null||_0x587102===void 0x0?void 0x0:_0x587102[_0x30b6c9(0x162)](_0x30b6c9(0x1e9)))||((_0x540e64=_0x1efde6[_0x30b6c9(0x16a)]['url'])===null||_0x540e64===void 0x0?void 0x0:_0x540e64[_0x30b6c9(0x162)](_0x30b6c9(0x1a9))))&&(console[_0x30b6c9(0x195)](_0x30b6c9(0x1d1),_0x1efde6[_0x30b6c9(0x16a)][_0x30b6c9(0x1d7)]),console['log'](_0x30b6c9(0x143),_0x1efde6[_0x30b6c9(0x189)]),console[_0x30b6c9(0x195)](_0x30b6c9(0x168),((_0x4c6a03=_0x1efde6[_0x30b6c9(0x17d)])===null||_0x4c6a03===void 0x0?void 0x0:_0x4c6a03[_0x30b6c9(0x1ca)])||_0x1efde6['config'][_0x30b6c9(0x1d7)]),console[_0x30b6c9(0x195)](_0x30b6c9(0x19f),((_0x2f771e=_0x1efde6[_0x30b6c9(0x17d)])===null||_0x2f771e===void 0x0?void 0x0:_0x2f771e[_0x30b6c9(0x169)])||0x0),_0x1efde6['headers'][_0x30b6c9(0x17f)]&&console[_0x30b6c9(0x195)]('响应跟踪\x20-\x20Location头:',_0x1efde6[_0x30b6c9(0x1c4)][_0x30b6c9(0x17f)]),_0x1efde6[_0x30b6c9(0x189)]>=0x12c&&_0x1efde6['status']<0x190&&console['log']('响应跟踪\x20-\x20检测到重定向状态码:',_0x1efde6[_0x30b6c9(0x189)]));}async['handleResponseError'](_0x25de91){const _0x484e0e=a2_0x52e9fc;var _0x151777,_0x4deb51,_0x204823;if(axios_1[_0x484e0e(0x14b)]['isAxiosError'](_0x25de91)&&_0x25de91[_0x484e0e(0x1af)]==='ECONNABORTED')throw new Error(_0x25de91[_0x484e0e(0x1ae)]||'Request\x20Timeout');const _0x133088=_0x25de91['config'];if(((_0x151777=_0x25de91===null||_0x25de91===void 0x0?void 0x0:_0x25de91[_0x484e0e(0x1a6)])===null||_0x151777===void 0x0?void 0x0:_0x151777[_0x484e0e(0x189)])===HTTP_STATUS[_0x484e0e(0x1ab)]&&!(_0x133088===null||_0x133088===void 0x0?void 0x0:_0x133088['_retry'])){if(!this['oauth2Token']){if(((_0x4deb51=_0x133088===null||_0x133088===void 0x0?void 0x0:_0x133088[_0x484e0e(0x1d7)])===null||_0x4deb51===void 0x0?void 0x0:_0x4deb51[_0x484e0e(0x162)](_0x484e0e(0x1e9)))||((_0x204823=_0x133088===null||_0x133088===void 0x0?void 0x0:_0x133088[_0x484e0e(0x1d7)])===null||_0x204823===void 0x0?void 0x0:_0x204823[_0x484e0e(0x162)](_0x484e0e(0x158))))throw new Error('No\x20OAuth2\x20token\x20available\x20(登录失败,密码错误)');throw new Error(_0x484e0e(0x1e4));}_0x133088[_0x484e0e(0x185)]=!![];try{return!tokenRefreshPromise&&(tokenRefreshPromise=this['refreshOauth2Token']()[_0x484e0e(0x148)](()=>{tokenRefreshPromise=null;})),await tokenRefreshPromise,_0x133088[_0x484e0e(0x1c4)][_0x484e0e(0x17e)]=_0x484e0e(0x1ea)+this[_0x484e0e(0x15b)][_0x484e0e(0x1c7)],this[_0x484e0e(0x1bc)](_0x133088);}catch(_0x7ec409){console[_0x484e0e(0x1db)](_0x484e0e(0x1b0),_0x7ec409);throw _0x7ec409;}}if(axios_1[_0x484e0e(0x14b)][_0x484e0e(0x173)](_0x25de91)&&_0x25de91[_0x484e0e(0x1a6)])this[_0x484e0e(0x1c3)](_0x25de91[_0x484e0e(0x1a6)]);else throw new Error(_0x484e0e(0x150));throw _0x25de91;}async[a2_0x52e9fc(0x183)](){const _0x524b0b=a2_0x52e9fc,_0x49e39d=await axios_1[_0x524b0b(0x14b)][_0x524b0b(0x16f)](OAUTH_CONSUMER_URL);this[_0x524b0b(0x1ec)]={'key':_0x49e39d[_0x524b0b(0x1b4)][_0x524b0b(0x1a3)],'secret':_0x49e39d[_0x524b0b(0x1b4)][_0x524b0b(0x191)]};}async[a2_0x52e9fc(0x1ce)](){const _0x2ef818=a2_0x52e9fc;this[_0x2ef818(0x15b)]&&(this['oauth2Token'][_0x2ef818(0x1e2)]<luxon_1['DateTime'][_0x2ef818(0x171)]()['toSeconds']()&&(console['error'](_0x2ef818(0x1cc)),await this[_0x2ef818(0x140)]()));}async[a2_0x52e9fc(0x16f)](_0x3fb933,_0x515dbc){const _0x5f267d=a2_0x52e9fc,_0x475960=await this['client']['get'](_0x3fb933,_0x515dbc);return _0x475960===null||_0x475960===void 0x0?void 0x0:_0x475960[_0x5f267d(0x1b4)];}async[a2_0x52e9fc(0x1eb)](_0x2d70d8,_0x266d7b,_0xcbeb63){const _0x13832d=a2_0x52e9fc,_0x1ef1b1=await this[_0x13832d(0x1bc)][_0x13832d(0x1eb)](_0x2d70d8,_0x266d7b,_0xcbeb63);return _0x1ef1b1===null||_0x1ef1b1===void 0x0?void 0x0:_0x1ef1b1['data'];}async['put'](_0x3aa25e,_0x366a5e,_0x5da4fb){const _0x51582c=a2_0x52e9fc,_0x371afc=await this[_0x51582c(0x1bc)][_0x51582c(0x1a0)](_0x3aa25e,_0x366a5e,_0x5da4fb);return _0x371afc===null||_0x371afc===void 0x0?void 0x0:_0x371afc[_0x51582c(0x1b4)];}async[a2_0x52e9fc(0x145)](_0xcfaf54,_0x1c832f){const _0x266bac=a2_0x52e9fc,_0xc36ef=await this['client'][_0x266bac(0x1eb)](_0xcfaf54,null,{..._0x1c832f,'headers':{..._0x1c832f===null||_0x1c832f===void 0x0?void 0x0:_0x1c832f[_0x266bac(0x1c4)],'X-Http-Method-Override':_0x266bac(0x198)}});return _0xc36ef===null||_0xc36ef===void 0x0?void 0x0:_0xc36ef['data'];}[a2_0x52e9fc(0x180)](_0xa8fcd4){const _0x1dd599=a2_0x52e9fc;lodash_1['default'][_0x1dd599(0x1a7)](_0xa8fcd4,(_0x1f71fa,_0x4874c4)=>{const _0x3a7134=_0x1dd599;this[_0x3a7134(0x1bc)][_0x3a7134(0x194)][_0x3a7134(0x1c4)][_0x3a7134(0x1d9)][_0x4874c4]=_0x1f71fa;});}['handleError'](_0x2e39a9){const _0x160686=a2_0x52e9fc;this[_0x160686(0x1b2)](_0x2e39a9);}[a2_0x52e9fc(0x1b2)](_0x4fb5e5){const _0x3c9a36=a2_0x52e9fc,{status:_0x1ce377,statusText:_0x4a19d3,data:_0x5e1e34}=_0x4fb5e5,_0x1d2520={'status':_0x1ce377,'statusText':_0x4a19d3,'data':typeof _0x5e1e34===_0x3c9a36(0x174)?JSON[_0x3c9a36(0x1de)](_0x5e1e34):_0x5e1e34};console[_0x3c9a36(0x1db)](_0x3c9a36(0x16d),_0x1d2520);throw new Error(_0x3c9a36(0x159)+_0x1ce377+_0x3c9a36(0x165)+_0x4a19d3);}async[a2_0x52e9fc(0x158)](_0x126617,_0x3d35fb,_0x566752){const _0x297e59=a2_0x52e9fc;try{await this[_0x297e59(0x183)]();const _0x19565d=await this[_0x297e59(0x19e)](_0x126617,_0x3d35fb,_0x566752),_0x5e4547=await this[_0x297e59(0x13d)](_0x19565d);return await this['exchange'](_0x5e4547),this;}catch(_0x5d52f6){console['error'](_0x297e59(0x1bf),_0x5d52f6);throw _0x5d52f6;}}async['getLoginTicket'](_0x41bc39,_0x2ed2f3,_0x2d09b4){const _0x49eb0a=a2_0x52e9fc,_0x291dc9=this['prepareLoginParams']();await this[_0x49eb0a(0x1c2)](_0x291dc9[_0x49eb0a(0x1ee)]);const _0x25d37d=await this[_0x49eb0a(0x167)](_0x291dc9[_0x49eb0a(0x1d8)]);let _0xd8cbfa=await this[_0x49eb0a(0x196)](_0x41bc39,_0x2ed2f3,_0x25d37d,_0x291dc9['step3Params']);this[_0x49eb0a(0x154)](_0xd8cbfa);const _0x466d4d=this[_0x49eb0a(0x1e5)](_0xd8cbfa);if(this[_0x49eb0a(0x1dc)](_0x466d4d)){if(_0x2d09b4){console['log']('🚀\x20-\x20getLoginTicket\x20-\x20等待验证码\x20sessionId:',_0x2d09b4);const _0x68c3cd=await this[_0x49eb0a(0x197)][_0x49eb0a(0x182)](_0x2d09b4);console[_0x49eb0a(0x195)](_0x49eb0a(0x1a8),_0x68c3cd),_0xd8cbfa=await this[_0x49eb0a(0x1cb)](_0xd8cbfa,_0x291dc9[_0x49eb0a(0x161)],_0x68c3cd);}else throw new Error('需要MFA验证,但未提供验证码获取方式');}const _0x274d0e=this[_0x49eb0a(0x1b9)](_0xd8cbfa);if(!_0x274d0e)throw new Error(_0x49eb0a(0x155));return _0x274d0e;}[a2_0x52e9fc(0x1e8)](){const _0x11b5b0=a2_0x52e9fc;return{'step1Params':{'clientId':'GarminConnect','locale':'en','service':this[_0x11b5b0(0x1d7)]['GC_MODERN']},'step2Params':{'id':'gauth-widget','embedWidget':!![],'locale':'en','gauthHost':this['url'][_0x11b5b0(0x190)]},'step3Params':{'id':'gauth-widget','embedWidget':!![],'clientId':'GarminConnect','locale':'en','gauthHost':this['url'][_0x11b5b0(0x190)],'service':this[_0x11b5b0(0x1d7)][_0x11b5b0(0x190)],'source':this[_0x11b5b0(0x1d7)][_0x11b5b0(0x190)],'redirectAfterAccountLoginUrl':this[_0x11b5b0(0x1d7)][_0x11b5b0(0x190)],'redirectAfterAccountCreationUrl':this[_0x11b5b0(0x1d7)][_0x11b5b0(0x190)]}};}async['performLoginStep1'](_0x425bb3){const _0x516a85=a2_0x52e9fc,_0x2b0fe5=this[_0x516a85(0x1d7)][_0x516a85(0x190)]+'?'+qs_1[_0x516a85(0x14b)]['stringify'](_0x425bb3);await this[_0x516a85(0x1bc)]['get'](_0x2b0fe5);}async['performLoginStep2'](_0x9a8021){const _0x2d002d=a2_0x52e9fc,_0x25c573=this[_0x2d002d(0x1d7)][_0x2d002d(0x18e)]+'?'+qs_1[_0x2d002d(0x14b)][_0x2d002d(0x1de)](_0x9a8021),_0x209322=await this['get'](_0x25c573),_0x1eb3b6=this[_0x2d002d(0x187)](_0x209322);if(!_0x1eb3b6)throw new Error('登录\x20-\x20未找到CSRF令牌');return _0x1eb3b6;}async[a2_0x52e9fc(0x196)](_0x39d668,_0x15b745,_0x30f3d4,_0x26681d){const _0x3c59ab=a2_0x52e9fc,_0x273ec5=this[_0x3c59ab(0x1d7)][_0x3c59ab(0x18e)]+'?'+qs_1[_0x3c59ab(0x14b)][_0x3c59ab(0x1de)](_0x26681d),_0xe89823=new URLSearchParams();return _0xe89823['append']('username',_0x39d668),_0xe89823['append'](_0x3c59ab(0x179),_0x15b745),_0xe89823['append']('embed',_0x3c59ab(0x188)),_0xe89823[_0x3c59ab(0x1a5)]('_csrf',_0x30f3d4),this[_0x3c59ab(0x1eb)](_0x273ec5,_0xe89823,{'headers':{'Content-Type':'application/x-www-form-urlencoded','Dnt':0x1,'Origin':this[_0x3c59ab(0x1d7)][_0x3c59ab(0x1be)],'Referer':this[_0x3c59ab(0x1d7)][_0x3c59ab(0x18e)],'User-Agent':USER_AGENT_CONNECTMOBILE}});}[a2_0x52e9fc(0x1dc)](_0x1a3fb2){const _0x581b6e=a2_0x52e9fc,_0x13d935=_0x1a3fb2[_0x581b6e(0x149)]();return _0x13d935['includes'](_0x581b6e(0x1b3))||_0x13d935[_0x581b6e(0x162)](_0x581b6e(0x14e))&&!_0x13d935['includes']('sign');}[a2_0x52e9fc(0x1b9)](_0x23299c){const _0x1e6fc7=a2_0x52e9fc,_0x19caca=TICKET_RE[_0x1e6fc7(0x1a2)](_0x23299c);return _0x19caca?_0x19caca[0x1]:null;}async[a2_0x52e9fc(0x1cb)](_0x43be40,_0x4dda4c,_0x1f0f11){const _0x5aff5d=a2_0x52e9fc;try{const _0x2d0444=this['extractCsrfToken'](_0x43be40);if(!_0x2d0444)throw new Error('MFA验证\x20-\x20未找到CSRF令牌');const _0x23f79e=await this[_0x5aff5d(0x1cf)](_0x2d0444,_0x1f0f11,_0x4dda4c);return this[_0x5aff5d(0x1c8)](_0x23f79e);}catch(_0x3b11f9){console['error'](_0x5aff5d(0x176),_0x3b11f9);throw new Error(_0x5aff5d(0x1e0)+_0x3b11f9);}}async[a2_0x52e9fc(0x152)](_0x3d1194,_0x2c7eb2,_0x3fd766){const _0x2bbc6b=a2_0x52e9fc;if(!_0x3fd766)throw new Error(_0x2bbc6b(0x15c));const _0x3bbfe7=this[_0x2bbc6b(0x187)](_0x3d1194);if(!_0x3bbfe7)throw new Error(_0x2bbc6b(0x17a));const _0x443222=await _0x3fd766();console['log'](_0x2bbc6b(0x153),_0x443222);const _0x3a75fc=await this['submitMFACode'](_0x3bbfe7,_0x443222,_0x2c7eb2);return this[_0x2bbc6b(0x1c8)](_0x3a75fc);}async[a2_0x52e9fc(0x1cf)](_0x262398,_0x361de3,_0x19cca0){const _0x35ffdd=a2_0x52e9fc,_0x307cdd=this[_0x35ffdd(0x1d7)][_0x35ffdd(0x18b)],_0x422481=new URLSearchParams();return _0x422481['append']('mfa-code',_0x361de3),_0x422481['append'](_0x35ffdd(0x1ac),_0x35ffdd(0x188)),_0x422481[_0x35ffdd(0x1a5)](_0x35ffdd(0x164),_0x262398),this[_0x35ffdd(0x1eb)](_0x307cdd+_0x35ffdd(0x18f),_0x422481,{'params':_0x19cca0,'headers':{'Content-Type':_0x35ffdd(0x18a),'Dnt':0x1,'Origin':this[_0x35ffdd(0x1d7)][_0x35ffdd(0x1be)],'Referer':_0x307cdd+_0x35ffdd(0x184),'User-Agent':USER_AGENT_BROWSER},'maxRedirects':0xa,'transformResponse':[function(_0x1f9a3f,_0x58be8f){const _0x283f0=_0x35ffdd;return _0x58be8f['location']&&_0x58be8f['location'][_0x283f0(0x162)](_0x283f0(0x19d))&&console[_0x283f0(0x195)]('检测到重定向到包含logintoken的URL:',_0x58be8f['location']),_0x1f9a3f;}]});}[a2_0x52e9fc(0x1c8)](_0x2d8326){const _0x1c6935=a2_0x52e9fc,_0x746417=this[_0x1c6935(0x1e5)](_0x2d8326);return console[_0x1c6935(0x195)]('MFA验证后的页面标题:',_0x746417),_0x2d8326;}['extractCsrfToken'](_0x566c62){const _0x5381cf=CSRF_RE['exec'](_0x566c62);return _0x5381cf?_0x5381cf[0x1]:null;}['handlePageTitle'](_0x468ddb){const _0x39ac76=a2_0x52e9fc,_0x2f15ff=PAGE_TITLE_RE[_0x39ac76(0x1a2)](_0x468ddb);if(_0x2f15ff){const _0x3d6b8c=_0x2f15ff[0x1];console[_0x39ac76(0x195)](_0x39ac76(0x15a),_0x3d6b8c);if(lodash_1['default']['includes'](_0x3d6b8c,_0x39ac76(0x193)))throw new Error('登录失败(需要更新电话号码),请更新您的电话号码,参考:\x20https://github.com/matin/garth/issues/19');return _0x3d6b8c;}else throw new Error('登录失败(未找到页面标题)');}[a2_0x52e9fc(0x154)](_0x5d9e7a){const _0x2726ed=a2_0x52e9fc,_0x4f3907=ACCOUNT_LOCKED_RE[_0x2726ed(0x1a2)](_0x5d9e7a);if(_0x4f3907){const _0x1430ec=_0x4f3907[0x1];console[_0x2726ed(0x1db)](_0x1430ec);throw new Error('登录失败(账户已锁定),请打开Connect网页解锁您的账户');}}async['refreshOauth2Token'](){const _0x3c41f2=a2_0x52e9fc;try{!this[_0x3c41f2(0x1ec)]&&await this[_0x3c41f2(0x183)]();if(!this['oauth2Token']||!this[_0x3c41f2(0x13e)])throw new Error(_0x3c41f2(0x18d));const _0x44739b={'oauth':this[_0x3c41f2(0x1b5)](this['OAUTH_CONSUMER']),'token':this[_0x3c41f2(0x13e)]};await this['exchange'](_0x44739b),console[_0x3c41f2(0x195)]('「'+this['config']['username']+_0x3c41f2(0x142)+this[_0x3c41f2(0x1d7)][_0x3c41f2(0x1d3)]+_0x3c41f2(0x163));}catch(_0x6be089){console[_0x3c41f2(0x1db)](_0x3c41f2(0x13f),_0x6be089);throw _0x6be089;}}async[a2_0x52e9fc(0x13d)](_0x30c3dc){const _0x5a6c15=a2_0x52e9fc;if(!this[_0x5a6c15(0x1ec)])throw new Error(_0x5a6c15(0x146));const _0x1af62e={'ticket':_0x30c3dc,'login-url':this[_0x5a6c15(0x1d7)][_0x5a6c15(0x190)],'accepts-mfa-tokens':!![]},_0x5ce460=this[_0x5a6c15(0x1d7)][_0x5a6c15(0x1d6)]+_0x5a6c15(0x178)+qs_1[_0x5a6c15(0x14b)][_0x5a6c15(0x1de)](_0x1af62e),_0x562059=this[_0x5a6c15(0x1b5)](this[_0x5a6c15(0x1ec)]),_0x325bff={'url':_0x5ce460,'method':_0x5a6c15(0x1e6)},_0x25d04a=_0x562059[_0x5a6c15(0x1d4)](_0x562059['authorize'](_0x325bff)),_0x215db7=await this[_0x5a6c15(0x16f)](_0x5ce460,{'headers':{..._0x25d04a,'User-Agent':USER_AGENT_CONNECTMOBILE}}),_0x24f0c4=qs_1[_0x5a6c15(0x14b)][_0x5a6c15(0x14a)](_0x215db7);return this[_0x5a6c15(0x13e)]=_0x24f0c4,{'token':_0x24f0c4,'oauth':_0x562059};}[a2_0x52e9fc(0x1b5)](_0x212456){const _0x511c07=a2_0x52e9fc;return new oauth_1_0a_1[(_0x511c07(0x14b))]({'consumer':_0x212456,'signature_method':_0x511c07(0x1a4),'hash_function'(_0x5e2d6a,_0x104416){const _0x55bafd=_0x511c07;return node_crypto_1[_0x55bafd(0x14b)]['createHmac'](_0x55bafd(0x1aa),_0x104416)[_0x55bafd(0x1c0)](_0x5e2d6a)[_0x55bafd(0x15d)](_0x55bafd(0x1b6));}});}async[a2_0x52e9fc(0x1e3)](_0x20f070){const _0x21d3aa=a2_0x52e9fc,_0x461c0f={'key':_0x20f070[_0x21d3aa(0x1b8)][_0x21d3aa(0x16e)],'secret':_0x20f070[_0x21d3aa(0x1b8)][_0x21d3aa(0x1d2)]},_0x321446=this['url'][_0x21d3aa(0x1d6)]+_0x21d3aa(0x1c6),_0x28c261={'url':_0x321446,'method':_0x21d3aa(0x1dd),'data':null},_0x1e1403=_0x20f070[_0x21d3aa(0x19a)][_0x21d3aa(0x1b7)](_0x28c261,_0x461c0f),_0x3c9539=_0x321446+'?'+qs_1[_0x21d3aa(0x14b)][_0x21d3aa(0x1de)](_0x1e1403);this[_0x21d3aa(0x15b)]=undefined;const _0xb29074=await this[_0x21d3aa(0x1eb)](_0x3c9539,null,{'headers':{'User-Agent':USER_AGENT_CONNECTMOBILE,'Content-Type':_0x21d3aa(0x18a)}});this[_0x21d3aa(0x15b)]=this[_0x21d3aa(0x172)](_0xb29074),this[_0x21d3aa(0x19b)]&&this[_0x21d3aa(0x13e)]&&this[_0x21d3aa(0x15b)]&&this[_0x21d3aa(0x19b)]({'oauth1':this[_0x21d3aa(0x13e)],'oauth2':this[_0x21d3aa(0x15b)]});}[a2_0x52e9fc(0x172)](_0x3223b5){const _0x3f2c61=a2_0x52e9fc,_0x3e2acb=luxon_1[_0x3f2c61(0x151)][_0x3f2c61(0x171)](),_0x131a45=_0x3e2acb[_0x3f2c61(0x17b)]({'seconds':_0x3223b5[_0x3f2c61(0x19c)]}),_0x2168d5=_0x3e2acb[_0x3f2c61(0x17b)]({'seconds':_0x3223b5[_0x3f2c61(0x170)]});return{..._0x3223b5,'last_update_date':_0x3e2acb[_0x3f2c61(0x144)]()[_0x3f2c61(0x1ad)](),'expires_date':_0x131a45['toLocal']()[_0x3f2c61(0x1ad)](),'expires_at':_0x131a45['toSeconds'](),'refresh_token_expires_at':_0x2168d5[_0x3f2c61(0x1d5)]()};}}exports[a2_0x52e9fc(0x1da)]=HttpClient;function a2_0x5385(_0x7963b4,_0x5b4158){_0x7963b4=_0x7963b4-0x13d;const _0x4e4d7f=a2_0x4e4d();let _0x5385c5=_0x4e4d7f[_0x7963b4];return _0x5385c5;}function a2_0x4e4d(){const _0x3d90bc=['step2Params','common','HttpClient','error','isMFARequired','POST','stringify','1496016zxCkAu','MFA验证失败:\x20','MFAManager','expires_at','exchange','No\x20OAuth2\x20token\x20available','handlePageTitle','GET','202581ettjfV','prepareLoginParams','signin','Bearer\x20','post','OAUTH_CONSUMER','oauth-1.0a','step1Params','getOauth1Token','oauth1Token','刷新OAuth2令牌失败:','refreshOauth2Token','1425630FTHETG','」在「','响应跟踪\x20-\x20状态码:','toLocal','delete','未找到OAuth消费者信息','mfaStorageDir','finally','toLowerCase','parse','default','6OIWRnb','__esModule','authentication','<title>([^<]*)</title>','Network\x20error\x20or\x20unknown\x20error\x20occurred','DateTime','handleMFA','🚀\x20-\x20handleMFA\x20-\x20mfaCode:','handleAccountLocked','登录失败(未找到票据或MFA验证失败),请检查用户名和密码','setupInterceptors','Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/117.0.0.0\x20Safari/537.36','login','HTTP\x20Error\x20(','登录页面标题:','oauth2Token','登录失败(需要MFA验证),请提供MFA回调函数','digest','tough-cookie','1468380qaACui','axios','step3Params','includes','」的OAuth2令牌刷新成功','_csrf','):\x20','15WqXRdw','performLoginStep2','响应跟踪\x20-\x20最终URL:','redirectCount','config','timeout','https://thegarth.s3.amazonaws.com/oauth_consumer.json','HTTP\x20Error:','oauth_token','get','refresh_token_expires_in','now','setOauth2TokenExpiresAt','isAxiosError','object','use','MFA验证失败:','32ghhooJ','/preauthorized?','password','无法从MFA页面提取CSRF令牌','plus','/tmp','request','Authorization','location','setCommonHeader','1245818eKzkfq','waitForMFACode','fetchOauthConsumer','/signin','_retry','logResponseTracking','extractCsrfToken','true','status','application/x-www-form-urlencoded','GARMIN_SSO','create','缺少刷新令牌所需的必要令牌','SIGNIN_URL','/verifyMFA/loginEnterMfaCode','GARMIN_SSO_EMBED','consumer_secret','var\x20statuss*=s*\x22([^\x22]*)\x22','Update\x20Phone\x20Number','defaults','log','performLoginStep3','mfaManager','DELETE','36236mlcqBd','oauth','onTokenChange','expires_in','logintoken','getLoginTicket','响应跟踪\x20-\x20重定向次数:','put','getInstance','exec','consumer_key','HMAC-SHA1','append','response','each','🚀\x20-\x20getLoginTicket\x20-\x20收到验证码\x20mfaCode:','verifyMFA','sha1','UNAUTHORIZED','embed','toString','message','code','Token\x20refresh\x20failed:','interceptors','handleHttpError','mfa','data','getOauthClient','base64','authorize','token','extractTicket','ticket=([^\x22]+)\x22','luxon','client','lodash','GARMIN_SSO_ORIGIN','Login\x20failed:','update','wrapper','performLoginStep1','handleError','headers','\x20ms','/exchange/user/2.0','access_token','validateMFAResult','file','responseURL','handleMFAWithCode','Token\x20expired!','43048DqEjqy','checkTokenVaild','submitMFACode','axios-cookiejar-support','>\x20响应跟踪\x20-\x20URL:','oauth_token_secret','domain','toHeader','toSeconds','OAUTH_URL','url'];a2_0x4e4d=function(){return _0x3d90bc;};return a2_0x4e4d();}
|