Skip to content

多平台运动数据同步工具-A multi-platform fitness data synchronization tool supporting Strava, Garmin Connect, OneDrive, IGPSport and Intervals.icu.

License

Notifications You must be signed in to change notification settings

Dunky-Z/FitSync

Repository files navigation

FitSync - 多平台运动数据同步工具

一个功能强大的运动数据同步工具,支持在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数据库系统

  • 高性能存储:使用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 中,不会提交到版本库。

初始化配置

  1. 复制示例配置文件:

    cp .app_config.json.example .app_config.json
  2. 根据你使用的平台,编辑 .app_config.json 文件,填入相应的配置信息。

配置文件结构说明

配置文件采用 JSON 格式,包含以下主要部分:

1. Strava 配置 (strava)

Strava API 配置,用于与 Strava 平台进行数据同步。

配置项说明:

  • client_id (必需): Strava 应用的客户端ID
  • client_secret (必需): Strava 应用的客户端密钥
  • refresh_token (必需): OAuth 刷新令牌,用于自动刷新访问令牌
  • access_token (可选): OAuth 访问令牌,程序会自动刷新

详细的 API 申请和配置步骤请参考:Strava API 配置文档

2. Garmin Connect 配置

支持两个版本的 Garmin Connect:国际版和中国版。

Garmin 国际版 (garmin)

  • username (必需): Garmin Connect 国际版登录邮箱
  • password (必需): Garmin Connect 国际版登录密码

Garmin 中国版 (garmin_cn)

  • username (必需): Garmin Connect 中国版登录邮箱
  • password (必需): Garmin Connect 中国版登录密码
3. OneDrive 配置 (onedrive)

用于将活动文件备份到 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 配置文档

4. IGPSport 配置 (igpsport)

IGPSport 平台配置,用于同步活动数据。

  • username (必需): IGPSport 登录用户名(通常是手机号)
  • password (必需): IGPSport 登录密码
5. Intervals.icu 配置 (intervals_icu)

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中。

数据库架构

SQLite表结构

-- 活动记录表
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.py

命令行参数

main_sync.py 参数

python 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到Strava

file_converter.py 参数

python 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 文件了解详情。

相关链接

About

多平台运动数据同步工具-A multi-platform fitness data synchronization tool supporting Strava, Garmin Connect, OneDrive, IGPSport and Intervals.icu.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •