将 Garmin Connect 国内版(connect.garmin.cn)的运动记录自动同步到 Strava。
Garmin Connect 国内版与国际版数据不互通,且 Strava 无法直接关联国内版账号。本工具通过模拟登录 Garmin Connect CN,下载活动文件(GPX/TCX/FIT),再上传到 Strava,实现跨平台数据同步。
- ✅ 支持 Garmin Connect 国内版 SSO 登录
- ✅ 自动下载活动原始文件(GPX → TCX → FIT 自动降级)
- ✅ 智能去重:同日期 + 同类型 + 相近时长的活动不会重复上传
- ✅ 支持筛选活动类型(跑步、骑行、游泳等)
- ✅ 支持守护模式(定时自动同步)
- ✅ 丰富的活动描述模板
- ✅ 试运行模式(预览待同步活动)
pip install -r requirements.txt# 复制配置模板
copy .env.example .env # Windows
cp .env.example .env # macOS/Linux编辑 .env 文件:
# Garmin Connect CN 账号
GARMIN_CN_USERNAME=your_email@example.com
GARMIN_CN_PASSWORD=your_password
# Strava API 凭证
STRAVA_CLIENT_ID=12345
STRAVA_CLIENT_SECRET=abc123def456
STRAVA_REFRESH_TOKEN=your_refresh_token_here- 访问 https://www.strava.com/settings/api
- 填写应用信息:
- Application Name:
Garmin CN Sync(任意名称) - Website:
http://localhost - Authorization Callback Domain:
localhost
- Application Name:
- 创建后获得
Client ID和Client Secret
在浏览器中访问以下 URL(替换 YOUR_CLIENT_ID):
https://www.strava.com/oauth/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=http://localhost&approval_prompt=force&scope=activity:write,activity:read_all
授权后,浏览器会跳转到 http://localhost/?state=&code=XXXXXX&scope=...,复制 URL 中的 code 值。
然后运行以下命令换取 Refresh Token(替换对应值):
curl -X POST https://www.strava.com/oauth/token \
-d client_id=YOUR_CLIENT_ID \
-d client_secret=YOUR_CLIENT_SECRET \
-d code=AUTHORIZATION_CODE \
-d grant_type=authorization_code从返回的 JSON 中获取 refresh_token,填入 .env。
💡 Refresh Token 长期有效,只需获取一次。Access Token 由程序自动刷新。
# 单次同步(默认最近 30 天)
python main.py
# 同步最近 7 天
python main.py --days 7
# 试运行:仅查看活动列表,不实际同步
python main.py --dry-run
# 守护模式:每 2 小时自动同步
python main.py --daemon
# 详细日志
python main.py --verboseworkout-sync/
├── main.py # 主入口
├── config.yaml # 同步策略配置
├── requirements.txt # 依赖
├── .env.example # 环境变量模板
├── downloads/ # 活动文件下载目录(自动创建)
└── src/
├── __init__.py
├── models.py # 数据模型
├── garmin_cn_client.py # Garmin CN 客户端
├── strava_client.py # Strava API 客户端
└── sync_service.py # 同步核心逻辑
config.yaml 中的主要配置项:
| 配置 | 说明 | 默认值 |
|---|---|---|
sync.days_back |
同步最近多少天 | 30 |
sync.activity_types |
需要同步的活动类型 | cycling,running,swimming,hiking,walking,other |
sync.skip_duplicates |
是否跳过重复活动 | true |
strava.private |
上传活动是否设为私有 | false |
strava.description_template |
活动描述模板 | 见配置文件 |
| Garmin 类型 | Strava 类型 |
|---|---|
| running / trail_running / treadmill_running | Run |
| cycling / road_biking / mountain_biking | Ride |
| swimming / pool_swimming / open_water | Swim |
| hiking | Hike |
| walking | Walk |
| 其他 | Workout |
Q: 提示 "Garmin CN 登录失败"?
A: 检查 .env 中的账号密码是否正确。如果开启了二次验证,可能需要使用应用专用密码。
Q: 上传后 Strava 显示 "文件处理中"? A: Strava 上传是异步的,程序会自动等待处理完成(最长 120 秒)。如果持续失败,可能是文件格式问题,程序会自动尝试 GPX → TCX → FIT 降级。
Q: 能否只同步特定类型的活动?
A: 修改 config.yaml 中的 sync.activity_types,例如只同步跑步和骑行:[running, cycling]。
本工具仅供个人学习使用。使用本工具可能违反 Garmin Connect 的服务条款,请自行承担风险。