Executando verificação de segurança...
7

Minha MiBand não sincroniza com o Strava. Automatizei com Python!

Fala, pessoal!

Hoje eu quero compartilhar um projeto pessoal que nasceu de uma pequena frustração: a falta de integração da minha Mi Band 7 (versão não-global) com o Strava.

Se você tem um dispositivo parecido, talvez conheça o sofrimento. Para registrar meus treinos da academia no Strava, o processo era totalmente manual e doloroso:

  1. Acessar o site de contas da Xiaomi.
  2. Navegar por várias telas até a opção de exportar dados.
  3. Solicitar um código de verificação por e-mail.
  4. Digitar o código para finalmente conseguir baixar um arquivo .zip.
  5. Descompactar o .zip, pegar o .csv correto e, só então, pensar em como enviar para o Strava.

Mas a parte de enviar para o Strava, ainda era chato.
Tratar o csv, decidir o que enviar, pois o csv é o histórico inteiro e não posso repetir entradas no Strava.

Tenho preguiça de fazer isso toda semana, esse ano não tinha feito nenhuma vez ainda.

A Solução: Um Script Python para automatizar tudo que acontece após baixar o arquivo

O objetivo era simples: rodar um único comando e ver a mágica acontecer.

Depois de algumas horas de estudo e código, o script ficou pronto e faz exatamente o seguinte:

  1. Lê o arquivo CSV exportado do Mi Fitness usando a biblioteca pandas.
  2. Salva os treinos em um banco de dados SQL Server, usando pyodbc. Isso é crucial para ter um controle do que já foi enviado e não duplicar atividades no Strava.
  3. Gerencia a autenticação com o Strava via OAuth2. O script lida com todo o fluxo: obtém o token de acesso na primeira vez e usa o refresh token para se autenticar automaticamente nas próximas execuções. Chega de copiar e colar tokens!
  4. Envia as novas atividades para a API do Strava, mapeando os tipos de exercício.

Como Funciona na Prática?

O Mi Fitness tem seus próprios códigos (indoor_fitness, volleyball, etc.), e eu precisava "traduzir" isso para os tipos que o Strava entende.

Criei um dicionário simples em Python para resolver isso. Até para atividades que o Strava não tem um tipo específico, como Vôlei, eu usei o tipo genérico Workout e ajustei o nome:

# Mapeamento de atividades Mi Fitness para Strava
activity_map = {
    "indoor_running": ("VirtualRun", "Esteira"),
    "indoor_fitness": ("WeightTraining", "Musculação"),
    "climbing_machine": ("StairStepper", "Escada"),
    "volleyball": ("Workout", "Vôlei") # Mapeando vôlei para um treino genérico
}

Depois, para cada atividade que ainda não foi enviada, o script monta um payload e faz um POST para a API do Strava usando a biblioteca requests:

# ... dentro de um loop para cada atividade ...

payload = {
    "name": nome_da_atividade,         # Ex: "Musculação"
    "type": tipo_de_esporte,           # Ex: "WeightTraining"
    "sport_type": tipo_de_esporte,
    "start_date_local": data_de_inicio, # Formato ISO 8601
    "elapsed_time": duracao_em_segundos
}

headers = {'Authorization': f'Bearer {meu_access_token}'}

response = requests.post(
    "https://www.strava.com/api/v3/activities", 
    headers=headers, 
    data=payload
)

# ... Lógica para verificar a resposta e atualizar o banco de dados ...

Conclusão

O resultado é que um processo manual agora é resolvido com um único comando no terminal: python sync_strava.py.

Resolveu um problema real do meu dia a dia. Bom, pelo menos pra mim era um problema.

Tenho vontade de automatizar a parte inicial do processo, e agendar pra rodar semanalmente, mas sinceramente, tenho preguiça também de ficar automatizando coisas que dependem de navegador e ficar mapeando coisas.

Alguém tem uma dica melhor pra automatizar a parte inicial sem ser usando Selenium ou Playwright?

O código-fonte completo, com o README.md explicando como configurar e usar, está disponível no meu GitHub. Fiquem à vontade para clonar, usar e adaptar para as suas necessidades!

➡️ Repositório no GitHub: https://github.com/dsscaze/miFitnessDataImport-Python

Carregando publicação patrocinada...
2

Já existe uma solução de código aberto que pode facilitar sua vida no que se refere a coletar os dados.
A ferramenta se chamada GadgetBridge e o código pode ser encontrado aqui.
Eles suportam uma infinidade de pulseiras, inclusive as da Xiaomi que, inclusive, são as mais chatas.

Se conseguir fazer alguma coisa legal usando essa ferramenta não se esqueça de voltar aqui e divulgar os resultados do seu projeto 😉

1

Pelo que entendi, eu uso esse app ao inves do mifitness pra sincronizar a pulseira?

Mas os dados vão pra onde? Pra nuvem da Xiaomi?

Vou dar uma olhada com calma, se resolver a parte dos dados iniciais, ai sim, ficara top demais.

1

Boa! Deve ter sido muito massa fazer essa solução. Acho que outra forma de resolver isso é usar o aplicativo Zepp. Eu ainda uso a minha miband 3 e ele faz a integração tanto com o Strava quanto com o Google Fit

1

Na minha versão de miband, o zepp life não conecta. Vacilei na hora da contra, não percebi isso. Tanto que meu mifitness só funciona em mandarim, so sei onde fica as opções porque já decorei.

0
1

Tenho um processo automatizado para correr no máximo uma vez por dia e apenas corre quando abrir o terminal. Ele grava se já correu hoje ou não. Assim, o meu terminal faz trigger desse processo automaticamente e, por outro lado, não tenho de ter nenhum mecanismo/cronjob para ativar esse processo.

Poderá ser uma boa app para desenvolver. Criar uma app que faça a integração entre as duas apps :)

1

Eu já tentei buscar algo pra isso, mas só funciona se o celular tiver root. E a API Xaomi, pelo que pesquisei (e pesquisei muito) só funciona pra versão global da miband.