一个功能强大的运动数据同步工具,支持在Strava、Garmin Connect、OneDrive、IGPSport、Intervals.icu等平台之间进行双向数据同步。
- 多平台支持:Strava、Garmin Connect、OneDrive、IGPSport、Intervals.icu
- 智能活动匹配:基于时间、运动类型、距离、时长的多维度匹配算法
- 增量同步:只同步新增活动,避免重复处理
- API限制管理:智能管理Strava API调用限制(每日180次,每15分钟90次)
- 历史迁移模式:支持历史活动的批量迁移
| Source \ Target | Strava | Garmin Global | Garmin CN | IGPSport | Intervals.icu | OneDrive |
|---|---|---|---|---|---|---|
| Strava | x | 🔁 Bi-dir | ❌ | ➡️ Single-dir | ❌ | ➡️ Single-dir |
| Garmin Global | 🔁 Bi-dir | x | 🔁 Bi-dir | ➡️ Single-dir | ❌ | ➡️ Single-dir |
| Garmin CN | ➡️ Single-dir | 🔁 Bi-dir | x | ❌ | ❌ | ❌ |
| IGPSport | ❌ | ❌ | ❌ | x | ➡️ Single-dir | ❌ |
| Intervals.icu | ❌ | ❌ | ❌ | ❌ | x | ❌ |
| OneDrive | ❌ | ❌ | ❌ | ❌ | ❌ | x |
| Others | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
- 高性能存储:使用SQLite替代JSON文件,提供更好的查询性能
- 数据完整性:ACID事务保证数据安全
- 自动迁移:从旧的JSON格式无缝迁移到SQLite
- 智能缓存:本地文件缓存管理,避免重复下载
- 多维度匹配:时间(5分钟容差)、运动类型、距离(5%容差)、时长(10%容差)
- 置信度评分:0.0-1.0评分系统,确保匹配准确性
- 运动类型标准化:自动识别相似运动类型(如跑步、越野跑、跑步机跑步)
- 多格式支持:FIT、TCX、GPX格式之间的转换
- 自动转换:上传时自动根据目标平台需求转换格式
- 批量转换:支持批量文件格式转换
- Python 3.7+
- 操作系统:Windows、macOS、Linux
pip install -r requirements.txt项目使用统一的配置文件 .app_config.json 管理所有平台的配置信息。由于该文件包含敏感信息(如密码、API密钥等),已被添加到 .gitignore 中,不会提交到版本库。
-
复制示例配置文件:
cp .app_config.json.example .app_config.json
-
根据你使用的平台,编辑
.app_config.json文件,填入相应的配置信息。
配置文件采用 JSON 格式,包含以下主要部分:
Strava API 配置,用于与 Strava 平台进行数据同步。
配置项说明:
- client_id (必需): Strava 应用的客户端ID
- client_secret (必需): Strava 应用的客户端密钥
- refresh_token (必需): OAuth 刷新令牌,用于自动刷新访问令牌
- access_token (可选): OAuth 访问令牌,程序会自动刷新
详细的 API 申请和配置步骤请参考:Strava API 配置文档
支持两个版本的 Garmin Connect:国际版和中国版。
Garmin 国际版 (garmin)
- username (必需): Garmin Connect 国际版登录邮箱
- password (必需): Garmin Connect 国际版登录密码
Garmin 中国版 (garmin_cn)
- username (必需): Garmin Connect 中国版登录邮箱
- password (必需): Garmin Connect 中国版登录密码
用于将活动文件备份到 OneDrive(主要用于 Fog of World 同步)。
配置项说明:
- client_id (必需): Azure AD 应用的客户端ID
- client_secret (必需): Azure AD 应用的客户端密钥
- redirect_uri (必需): OAuth 重定向URI,通常为
"http://localhost" - refresh_token (必需): OAuth 刷新令牌
- access_token (可选): OAuth 访问令牌,程序会自动刷新
- tenant_id (可选): Azure 租户ID,通常为
"common" - expires_in (可选): 令牌过期时间(秒),默认 3600
详细的 API 申请和配置步骤请参考:OneDrive API 配置文档
IGPSport 平台配置,用于同步活动数据。
- username (必需): IGPSport 登录用户名(通常是手机号)
- password (必需): IGPSport 登录密码
Intervals.icu 平台配置,用于同步训练数据。
配置项说明:
- user_id (必需): Intervals.icu 用户ID
- api_key (必需): Intervals.icu API 密钥
详细的 API 申请和配置步骤请参考:Intervals.icu API 配置文档
完整的配置示例请参考 .app_config.json.example 文件。该文件包含了所有配置项的示例值,你可以复制该文件并填入实际值:
# 复制示例文件
cp .app_config.json.example .app_config.json
# 编辑配置文件
vim .app_config.json # 或使用你喜欢的编辑器- 重要:
.app_config.json文件包含敏感信息,请勿将其提交到版本控制系统 - 建议定期更换 API 密钥和密码
- 如果配置文件泄露,请立即在相应平台重新生成密钥
- 建议使用文件系统权限限制配置文件访问(如
chmod 600 .app_config.json)
python src/main_sync.py# 单向同步
python src/main_sync.py --auto --directions strava_to_garmin --batch-size 10
# 双向同步
python src/main_sync.py --auto --directions strava_to_garmin garmin_to_strava --batch-size 5
# 历史迁移模式
python src/main_sync.py --auto --directions strava_to_garmin --batch-size 20 --migration-mode# 交互式转换
python src/file_converter.py --interactive
# 单文件转换
python src/file_converter.py input.fit gpx
# 批量转换
python src/file_converter.py --batch /path/to/files gpx- Strava ↔ Garmin Global:Strava与Garmin国际版双向同步
- Garmin CN ↔ Garmin Global:佳明中国与佳明国际双向同步
- Garmin CN → Strava:佳明中国到Strava单向同步
- Strava → OneDrive:将Strava活动文件备份到OneDrive
- Garmin Global → OneDrive:将Garmin活动文件备份到OneDrive
- Strava → IGPSport:将Strava活动同步到IGPSport
- IGPSport → Intervals.icu:将IGPSport活动同步到Intervals.icu
注意,目前同步到OneDrive的目的是为了Fog of World使用,所以同步到OneDrive的文件格式为GPX,而不是FIT,并且同步到OneDrive的目录是Fog of World的目录。在Fog of World中,开启OneDrive同步后可以将OneDrive的GPX轨迹导入到Fog of World中。
-- 活动记录表
CREATE TABLE activity_records (
fingerprint TEXT PRIMARY KEY, -- 活动指纹
name TEXT NOT NULL, -- 活动名称
sport_type TEXT NOT NULL, -- 运动类型
start_time TEXT NOT NULL, -- 开始时间
distance REAL NOT NULL, -- 距离(米)
duration INTEGER NOT NULL, -- 时长(秒)
elevation_gain REAL, -- 海拔增益(米)
created_at TEXT NOT NULL, -- 创建时间
updated_at TEXT NOT NULL -- 更新时间
);
-- 平台映射表
CREATE TABLE platform_mappings (
fingerprint TEXT NOT NULL, -- 活动指纹
platform TEXT NOT NULL, -- 平台名称
activity_id TEXT NOT NULL, -- 平台活动ID
created_at TEXT NOT NULL, -- 创建时间
UNIQUE(fingerprint, platform)
);
-- 同步状态表
CREATE TABLE sync_status (
fingerprint TEXT NOT NULL, -- 活动指纹
source_platform TEXT NOT NULL, -- 源平台
target_platform TEXT NOT NULL, -- 目标平台
status TEXT NOT NULL, -- 同步状态
updated_at TEXT NOT NULL, -- 更新时间
UNIQUE(fingerprint, source_platform, target_platform)
);
-- 文件缓存表
CREATE TABLE file_cache (
fingerprint TEXT NOT NULL, -- 活动指纹
file_format TEXT NOT NULL, -- 文件格式
file_path TEXT NOT NULL, -- 文件路径
file_size INTEGER, -- 文件大小
created_at TEXT NOT NULL, -- 创建时间
UNIQUE(fingerprint, file_format)
);
-- 同步配置表
CREATE TABLE sync_config (
key TEXT PRIMARY KEY, -- 配置键
value TEXT NOT NULL, -- 配置值
updated_at TEXT NOT NULL -- 更新时间
);
-- API限制表
CREATE TABLE api_limits (
platform TEXT PRIMARY KEY, -- 平台名称
daily_calls INTEGER DEFAULT 0, -- 每日调用次数
quarter_hour_calls INTEGER DEFAULT 0, -- 15分钟调用次数
daily_limit INTEGER NOT NULL, -- 每日限制
quarter_hour_limit INTEGER NOT NULL, -- 15分钟限制
last_reset TEXT NOT NULL -- 最后重置时间
);系统会自动检测旧的JSON数据库文件并迁移到SQLite:
# 自动迁移(首次运行时)
python src/main_sync.py
# 手动测试迁移
python tests/test_database_migration.pypython src/main_sync.py [选项]
选项:
--auto 自动模式,跳过交互式选择
--directions DIR [DIR...] 同步方向列表
--batch-size N 每批处理的活动数量 (默认: 10)
--migration-mode 启用历史迁移模式
--debug 启用调试模式
--cleanup-cache 清理过期缓存文件
--status 显示同步状态
--clear-garmin-session 清除Garmin会话
同步方向:
strava_to_garmin Strava到Garmin Global
garmin_to_strava Garmin Global到Strava
strava_to_onedrive Strava到OneDrive
garmin_to_onedrive Garmin Global到OneDrive
strava_to_igpsport Strava到IGPSport
igpsport_to_intervals_icu IGPSport到Intervals.icu
garmin_cn_to_garmin Garmin CN到Garmin Global
garmin_to_garmin_cn Garmin Global到Garmin CN
garmin_cn_to_strava Garmin CN到Stravapython src/file_converter.py [选项] [输入] [格式]
选项:
-i, --interactive 交互模式
-b, --batch 批量转换模式
-o, --output OUTPUT 输出文件或目录
--info 显示文件信息
-v, --verbose 详细输出
格式:
fit, tcx, gpx 支持的文件格式# 启用调试输出
python src/main_sync.py --debug
# 查看同步状态
python src/main_sync.py --status
# 清理缓存
python src/main_sync.py --cleanup-cache本项目采用MIT许可证 - 查看 LICENSE 文件了解详情。