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:
- Acessar o site de contas da Xiaomi.
- Navegar por várias telas até a opção de exportar dados.
- Solicitar um código de verificação por e-mail.
- Digitar o código para finalmente conseguir baixar um arquivo
.zip. - Descompactar o
.zip, pegar o.csvcorreto 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:
- Lê o arquivo CSV exportado do Mi Fitness usando a biblioteca
pandas. - 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. - 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!
- 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