PENDÊNCIA:
garmin.cn
e garmin.com
Se algo não estiver funcionando, verifique primeiro https://connect.garmin.com/status/.
Atualmente, a maioria dos recursos anteriores estão funcionando, mas alguns da API Rest não foram adicionados, como Gear
, Workout
, Badge
etc. Portanto, se você precisar desses recursos, adicione um PR.
Todos os trabalhos acima foram inspirados em https://github.com/matin/garth. Muito obrigado.
Uma poderosa biblioteca JavaScript para conexão com o Garmin Connect para enviar e receber dados de saúde e treino. Ele vem com alguns métodos predefinidos para obter e definir diferentes tipos de dados para sua conta Garmin, mas também tem a possibilidade de fazer solicitações personalizadas. GET
, POST
e PUT
são atualmente suportados. Isso torna mais fácil implementar o que estiver faltando para atender às suas necessidades.
Esta biblioteca exigirá que você adicione um arquivo de configuração à raiz do projeto chamado garmin.config.json
contendo seu nome de usuário e senha do serviço 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 ( ) ;
Agora você pode verificar userProfile.userName
para verificar se seu login foi bem-sucedido.
GCClient . saveTokenToFile ( '/path/to/save/tokens' ) ;
Resultado:
$ ls /path/to/save/tokens
oauth1_token.json oauth2_token.json
Reutilizar token:
GCClient . loadTokenByFile ( '/path/to/save/tokens' ) ;
const oauth1 = GCClient . client . oauth1Token ;
const oauth2 = GCClient . client . oauth2Token ;
// save to db or other storage
...
Reutilizar token:
GCClient . loadToken ( oauth1 , oauth2 ) ;
Este é um recurso experimental e pode ainda não fornecer estabilidade total.
Após um login bem-sucedido, o getter e setter sessionJson
podem ser usados para exportar e restaurar sua sessão.
// 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 ) ;
A sessão exportada deve ser serializável e pode ser armazenada como uma string JSON.
Uma sessão armazenada só pode ser reutilizada uma vez e precisará ser armazenada após cada solicitação. Isso pode ser feito anexando algum armazenamento ao evento sessionChange
.
GCClient . onSessionChange ( ( session ) => {
/*
Your choice of storage here
node-persist will probably work in most cases
*/
} ) ;
Para garantir o uso de uma sessão armazenada, se possível, mas retornar ao login normal, pode-se usar o método restoreOrLogin
. Os argumentos username
e password
são opcionais e o .login()
regular será chamado se a restauração da sessão falhar.
await GCClient . restoreOrLogin ( session , username , password ) ;
sessionChange
será acionado em uma alteração no sessionJson
atual Para anexar um ouvinte a um evento, use o método .on()
.
GCClient . on ( 'sessionChange' , ( session ) => console . log ( session ) ) ;
Atualmente não há como remover ouvintes.
Receba informações básicas do usuário
GCClient . getUserInfo ( ) ;
Receba informações de usuários sociais
GCClient . getSocialProfile ( ) ;
Obtenha uma lista de todas as conexões sociais
GCClient . getSocialConnections ( ) ;
Obtenha uma lista de todos os dispositivos registrados, incluindo números de modelo e versões de firmware.
GCClient . getDeviceInfo ( ) ;
getActivities(start: number, limit: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>
Recupera uma lista de atividades com base em parâmetros especificados.
start
(número, opcional): Índice para iniciar a busca de atividades.limit
(número, opcional): Número de atividades a serem recuperadas.activityType
(ActivityType, opcional): Tipo de atividade (se especificado, start deve ser nulo).subActivityType
(ActivitySubType, opcional): Subtipo de atividade (se especificado, start deve ser nulo). Promise<IActivity[]>
: uma promessa que se resolve em uma série de atividades. const activities = await GCClient . getActivities (
0 ,
10 ,
ActivityType . Running ,
ActivitySubType . Outdoor
) ;
getActivity(activity: { activityId: GCActivityId }): Promise<IActivity>
Recupera detalhes de uma atividade específica com base no activityId
fornecido.
activity
(objeto): um objeto que contém a propriedade activityId
.
activityId
(GCActivityId): Identificador da atividade desejada. Promise<IActivity>
: uma promessa que resolve os detalhes da atividade especificada. const activityDetails = await GCClient . getActivity ( {
activityId : 'exampleActivityId'
} ) ;
Para obter uma lista de atividades em seu feed de notícias, use o método getNewsFeed
. Esta função leva dois argumentos, start e limit , que são usados para paginação. Ambos são opcionais e serão padronizados para qualquer que seja o Garmin Connect que esteja usando. Para ter certeza de obter todas as atividades, use-o corretamente.
// 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 ) ;
Use o ActivityId para baixar os dados da atividade original. Geralmente isso é fornecido como um arquivo .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' ) ;
Carrega um arquivo de atividade como uma nova atividade. O arquivo pode ser um arquivo gpx
, tcx
ou fit
. Se a atividade já existir, o resultado terá um código de status 409. Upload corrigido em 1.4.4, Garmin alterou a API de upload, a resposta detailedImportResult
não contém o novo 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 ;
Carrega uma imagem para atividade
const [ latestActivty ] = await GCClient . getActivities ( 0 , 1 ) ;
const upload = await GCClient . uploadImage (
latestActivty ,
'./some/path/to/file.jpg'
) ;
Excluir uma imagem da atividade
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>
Recupera o total de etapas para uma determinada data.
date
(Data, opcional): Data da informação das etapas solicitada; o padrão é hoje se nenhuma data for fornecida. Promise<number>
: uma promessa que resulta no total de etapas para a data especificada. const totalSteps = await GCClient . getSteps ( new Date ( '2020-03-24' ) ) ;
getSleepData(date: string): Promise<SleepData>
Recupera todos os dados de sono para uma determinada data
date
(Data, opcional): Data da informação solicitada, o padrão será hoje se nenhuma data for fornecida Promise<SleepData>
: uma promessa que resolve um objeto contendo informações detalhadas do sono.
dailySleepDTO
(objeto): Informações sobre o sono diário do usuário.id
(número): O identificador exclusivo do registro de sono.userProfilePK
(número): O identificador do perfil do usuário.calendarDate
(string): A data do registro do sono.sleepMovement
(array): uma matriz de dados de movimento do sono.remSleepData
(booleano): Indica se os dados do sono REM estão disponíveis.sleepLevels
(matriz): uma matriz de dados de níveis de sono.restlessMomentsCount
(número): Contagem de momentos de agitação durante o sono. const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getSleepDuration(date: string): Promise<{hours: number, minutes: number}
Recupera horas e minutos dormidos em uma determinada data
date
(Data, opcional): Data da informação solicitada, o padrão será hoje se nenhuma data for fornecida Promise<{hours: string, minutes: string }>
: uma promessa que resolve um objeto contendo informações sobre a duração do sono
hours
(string): Número de horasminutes
(string): Número de minutos const detailedSleep = await GCClient . getSleepDuration ( new Date ( '2020-03-24' ) ) ;
getDailyWeightData(date?: Date): Promise<number>
Recupera o peso diário e converte-o de gramas em libras.
date
(Data, opcional): Data da informação solicitada. O padrão é a data atual. Promise<number>
: uma promessa que resulta no peso diário convertido de gramas em libras. Error
: se não for possível encontrar dados válidos de peso diário para a data especificada. const weightData = await GCClient . getDailyWeightData ( new Date ( '2023-12-25' ) ) ;
getDailyWeightInPounds(date?: Date): Promise<number>
Recupera o peso diário em libras para uma determinada data.
date
(Data, opcional): Data da informação solicitada; o padrão é hoje se nenhuma data for fornecida. Promise<number>
: uma promessa que resulta no peso diário em libras. const weightInPounds = await GCClient . getDailyWeightInPounds (
new Date ( '2020-03-24' )
) ;
getDailyHydration(date?: Date): Promise<number>
Recupera os dados diários de hidratação e os converte de mililitros em onças.
date
(Data, opcional): Data da informação solicitada. O padrão é a data atual.Promise<number>
: uma promessa que resolve os dados de hidratação diária convertidos de mililitros para onças.Error
: se não for possível encontrar dados válidos de hidratação diária para a data especificada ou se a resposta for inválida. const hydrationInOunces = await GCClient . getDailyHydration (
new Date ( '2023-12-25' )
) ;
getGolfSummary(): Promise<GolfSummary>
Recupera um resumo dos dados do scorecard de golfe.
Promise<GolfSummary>
: uma promessa que resulta no resumo do scorecard de golfe. const golfSummary = await GCClient . getGolfSummary ( ) ;
getGolfScorecard(scorecardId: number): Promise<GolfScorecard>
Recupera dados do scorecard de golfe para um scorecard específico.
scorecardId
(número): Identificador do scorecard de golfe desejado. Promise<GolfScorecard>
: uma promessa que resolve os dados do scorecard de golfe. const scorecardId = 123 ; // Replace with the desired scorecard ID
const golfScorecard = await GCClient . getGolfScorecard ( scorecardId ) ;
getHeartRate(date?: Date): Promise<HeartRate>
Recupera dados diários de frequência cardíaca para uma determinada data.
date
(Date, opcional): Data dos dados de frequência cardíaca solicitados; o padrão é hoje se nenhuma data for fornecida. Promise<HeartRate>
: uma promessa que resolve os dados diários de frequência cardíaca. 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 ) ;
Exclui uma atividade.
const activities = await GCClient . getActivities ( 0 , 1 ) ;
const activity = activities [ 0 ] ;
await GCClient . deleteActivity ( activity ) ;
updateHydrationLogOunces(date?: Date, valueInOz: number): Promise<WaterIntake>
Adiciona uma entrada de registro de hidratação em onças para uma determinada data.
date
(Data, opcional): Data da entrada no log; o padrão é hoje se nenhuma data for fornecida.valueInOz
(número): Quantidade de ingestão de água em onças. Aceita número negativo. Promise<WaterIntake>
: uma promessa que resolve a entrada do log de hidratação. const hydrationLogEntry = await GCClient . addHydrationLogOunces (
new Date ( '2020-03-24' ) ,
16
) ;
updateWeight(date = new Date(), lbs: number, timezone: string): Promise<UpdateWeight>
Atualiza informações de peso
date
(opcional): objeto Date que representa a data de entrada do peso. O padrão é a data atual, se não for fornecida.lbs
(número): Valor do peso em libras.timezone
(string): String que representa o fuso horário para a entrada de peso. Promise<UpdateWeight>
: uma promessa que resulta no resultado da atualização de peso. await GCClient . updateWeight ( undefined , 202.9 , 'America/Los_Angeles' ) ;
Para adicionar um treino personalizado, use addWorkout
ou mais especificamente addRunningWorkout
.
GCClient . addRunningWorkout ( 'My 5k run' , 5000 , 'Some description' ) ;
Adicionará um treino de corrida de 5 km chamado 'Minha corrida de 5 km' e retornará um objeto JSON representando o treino salvo.
Para adicionar um treino ao seu calendário, primeiro encontre o seu treino e depois adicione-o a uma data específica.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . scheduleWorkout ( { workoutId : id } , new Date ( '2020-03-24' ) ) ;
Isso adicionará o treino a uma data específica no seu calendário e fará com que ele apareça automaticamente se você estiver usando algum dos relógios Garmin.
Excluir um treino é muito semelhante a agendar um.
const workouts = await GCClient . getWorkouts ( ) ;
const id = workouts [ 0 ] . workoutId ;
GCClient . deleteWorkout ( { workoutId : id } ) ;
Esta biblioteca lidará com solicitações personalizadas para sua sessão ativa do Garmin Connect. Existem muitos URLs diferentes usados, o que significa que esta biblioteca provavelmente não cobrirá todos eles. Ao usar a ferramenta de análise de rede, você pode encontrar URLs usados pelo Garmin Connect para buscar dados.
Vamos supor que encontrei uma solicitação GET
para o seguinte URL:
https://connect.garmin.com/modern/proxy/wellness-service/wellness/dailyHeartRate/22f5f84c-de9d-4ad6-97f2-201097b3b983?date=2020-03-24
A solicitação pode ser enviada usando GCClient
executando
// 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 } ) ;
e lhe renderá o mesmo resultado que usar o método fornecido
GCClient . getHeartRate ( ) ;
Observe como o cliente acompanhará os URLs, as informações do usuário e também manterá a sessão ativa.
Muitas respostas do Garmin Connect não têm definições de tipo e o padrão é unknown
. Sinta-se à vontade para adicionar tipos abrindo uma solicitação pull.
Por enquanto, esta biblioteca suporta apenas o seguinte: