Skip to content

Repository files navigation

佳明运动数据同步与采集工具

workflow

关注作者Strava Strava

【2026-6说明】github actions 新fork的无法使用了。

佳明做了限制,对github actions方式运行会出现429限制登录的情况,目前无法解决,推荐让claude或者其他agent将本项目拉到本地去运行。

【2025-12说明】开启了ECG功能的说明

开通了ECG功能的佳明账号,因为登录佳明时需要提供验证码,开通ECG后,这个验证码无法关闭,github上要中途要输入一次验证码,本同步脚本无法支持,下方的Web版本做了兼容,可以使用。

Web版本

如果你不熟悉代码,强烈推荐使用这个版本,在网页上填入账号点击就能同步数据,简洁好用。 https://dailysync.cn/

其他仓库备份

gitlab: https://gitlab.com/gooin/dailysync

github: https://github.com/gooin/dailysync-rev

Docker版本

如果你懂一点代码,会使用 docker 可以使用此方案。

拉取代码

目前没有提供打包好的镜像,需要拉取下来自行打包使用

git clone https://github.com/gooin/dailysync-rev.git

修改配置文件

复制模板文件为 .envcp .env.example .env),按注释填入信息。Docker 运行会通过 docker-compose.ymlenv_file 读取 .env;本地 yarn 运行也会自动读取项目根目录的 .env

# 佳明中国区账号密码,对应 https://connect.garmin.cn/
GARMIN_USERNAME=example@example.com
GARMIN_PASSWORD=password

# 佳明国际区账号密码,对应 https://connect.garmin.com/
GARMIN_GLOBAL_USERNAME=example@example.com
GARMIN_GLOBAL_PASSWORD=password

# 活动历史迁移配置:每次迁移多少条活动,以及从第几条活动开始
GARMIN_MIGRATE_NUM=100
GARMIN_MIGRATE_START=0

# Wellness 健康数据同步配置,默认关闭;需要同步步数、睡眠、HRV、压力等健康数据时改为 true
# 注意:目标账号需要先人工绑定/连接一台支持健康数据的 Garmin 设备,否则上传会报 419
GARMIN_SYNC_WELLNESS=false

# 日常同步时检查最近几天的健康数据
GARMIN_WELLNESS_SYNC_DAYS=1

# 历史迁移健康数据天数;0 表示不迁移历史健康数据
GARMIN_WELLNESS_MIGRATE_DAYS=0

# 历史迁移从今天往前跳过多少天开始;0 表示从今天开始
GARMIN_WELLNESS_MIGRATE_START_DAYS=0
参数 说明 默认
GARMIN_USERNAME / GARMIN_USERNAME_DEFAULT 国区账号
GARMIN_PASSWORD / GARMIN_PASSWORD_DEFAULT 国区密码
GARMIN_GLOBAL_USERNAME / GARMIN_GLOBAL_USERNAME_DEFAULT 国际区账号
GARMIN_GLOBAL_PASSWORD / GARMIN_GLOBAL_PASSWORD_DEFAULT 国际区密码
GARMIN_MIGRATE_NUM / GARMIN_MIGRATE_NUM_DEFAULT 迁移每页条数(自动翻页直到迁完) 100
GARMIN_MIGRATE_START / GARMIN_MIGRATE_START_DEFAULT 从第几条活动开始迁移(1=最新一条,0 或不填=全部;断点续传时填上次迁到的序号) 0
GARMIN_MIGRATE_AUTO_PAGE 自动翻页开关:true/不填=自动翻页直到迁完;false=只跑一批(从 START 起 NUM 条,调试用) true
GARMIN_SYNC_NUM / GARMIN_SYNC_NUM_DEFAULT 增量同步每页拉取的条数。同步是增量的:每次同步完成后把最后同步到的活动时间记录在 db/garmin.db,下次从该游标位置翻页取新增活动,一次新增任意多条都不会漏;只影响单次拉取条数,不再有"只检查最近 10 条"的限制 10
GARMIN_SYNC_WELLNESS / GARMIN_SYNC_WELLNESS_DEFAULT Wellness 健康数据同步开关(true/false,默认关闭) false
GARMIN_WELLNESS_SYNC_DAYS / GARMIN_WELLNESS_SYNC_DAYS_DEFAULT 日常同步时检查最近几天的健康数据 1
GARMIN_WELLNESS_MIGRATE_DAYS / GARMIN_WELLNESS_MIGRATE_DAYS_DEFAULT 历史迁移健康数据天数(0 表示不迁移) 0
GARMIN_WELLNESS_MIGRATE_START_DAYS / GARMIN_WELLNESS_MIGRATE_START_DAYS_DEFAULT 历史健康数据迁移跳过的起始天数(0 表示从今天开始) 0

注意:.env 的值不要带引号或分号——docker run --env-file 不会剥引号、分号会被当成值的一部分(会变成错误密码或 NaN 参数)。

修改docker-compose.yml 文件

修改 docker-compose.ymlservices.daily-sync.command 的值即可决定每次启动执行的功能,默认是国区同步到国际区(yarn sync_cn)。普通 sync_* 只同步活动数据;sync_all_* 是复合同步入口,会先同步活动数据,再在 GARMIN_SYNC_WELLNESS=true 时同步 Wellness 健康数据。

历史迁移同理:migrate_garmin_* 只迁移活动数据;migrate_wellness_* 只迁移 Wellness 健康数据;migrate_all_* 会迁移活动数据和 Wellness 健康数据。

同步中国区到国际区(仅活动数据)

yarn sync_cn

同步国际区到中国区(仅活动数据)

yarn sync_global

同步中国区到国际区(活动数据 + Wellness 健康数据)

yarn sync_all_cn_to_global

同步国际区到中国区(活动数据 + Wellness 健康数据)

yarn sync_all_global_to_cn

同步中国区到国际区(仅 Wellness 健康数据,按 GARMIN_WELLNESS_SYNC_DAYS 检查最近几天)

yarn sync_wellness_cn_to_global

同步国际区到中国区(仅 Wellness 健康数据,按 GARMIN_WELLNESS_SYNC_DAYS 检查最近几天)

yarn sync_wellness_global_to_cn

迁移历史数据:中国区到国际区

yarn migrate_garmin_cn_to_global

迁移历史数据:国际区到中国区

yarn migrate_garmin_global_to_cn

迁移命令默认自动翻页直到迁完所有历史数据(重复的活动自动跳过),GARMIN_MIGRATE_NUM_DEFAULT 为每页条数,一般无需修改;断点续传时才需要改 GARMIN_MIGRATE_START_DEFAULT 起始偏移。调试时可设置 GARMIN_MIGRATE_AUTO_PAGE=false 只跑一批(从 START 起 NUM 条),避免每次跑全量。

迁移日志

迁移运行时的完整日志会同时写入 log/ 目录(容器内为 /app/log,compose 已自动挂载到宿主机 ./log):

文件 内容
log/migrate_cn_to_global_<时间戳>.log 国区→国际区 完整日志(登录、进度、汇总)
log/migrate_cn_to_global_<时间戳>_failed.log 仅失败的条目明细
log/migrate_global_to_cn_<时间戳>.log / _failed.log 反方向同上

格式:每行一条,前缀为 ISO 时间,如 [2026-08-25T09:36:31.502Z] 上传失败: 【西安市 跑步】 ...。使用 docker run 时需手动挂载 -v "$PWD/log:/app/log"

迁移进度每页打一行(页面耗时较长时每 60 秒心跳一行),另输出失败条目与结束汇总——终端、docker logs、CI、日志文件的输出行为完全一致。

迁移历史全量数据:中国区到国际区(活动数据 + Wellness 健康数据)

yarn migrate_all_cn_to_global

迁移历史全量数据:国际区到中国区(活动数据 + Wellness 健康数据)

yarn migrate_all_global_to_cn

迁移历史 Wellness 健康数据:中国区到国际区(按 GARMIN_WELLNESS_MIGRATE_DAYSGARMIN_WELLNESS_MIGRATE_START_DAYS

yarn migrate_wellness_cn_to_global

迁移历史 Wellness 健康数据:国际区到中国区(按 GARMIN_WELLNESS_MIGRATE_DAYSGARMIN_WELLNESS_MIGRATE_START_DAYS

yarn migrate_wellness_global_to_cn

打包运行一次项目

docker-compose up

配置系统定时任务

参照下文中的 定时任务(Linux Only),把命令替换成使用

docker start daily-sync

Github运行方案

因为项目之前在Github上占用过多资源被封禁,现在已经调整了执行的频率,熟悉代码的话,将代码下载下来,上传到github,通过 github Actions执行 具体参考下方文档或参考视频教程: https://www.bilibili.com/video/BV1v94y1Q7oR/?spm_id_from=333.999.0.0

Github Actions 需要在仓库 Settings -> Secrets and variables -> Actions 中配置同名 Secrets。手动运行 Sync workflow 时,可以选择 sync_*sync_all_*sync_wellness_*;定时运行默认仍执行普通 sync_*,只同步活动数据。

GARMIN_USERNAME              # 佳明中国区账号
GARMIN_PASSWORD              # 佳明中国区密码
GARMIN_GLOBAL_USERNAME       # 佳明国际区账号
GARMIN_GLOBAL_PASSWORD       # 佳明国际区密码
GARMIN_MIGRATE_NUM           # 历史活动迁移数量,迁移 workflow 使用
GARMIN_MIGRATE_START         # 历史活动迁移起始位置,迁移 workflow 使用
BARK_KEY                     # 可选,Bark 失败通知

Wellness 健康数据默认关闭。需要同步步数、睡眠、HRV、压力等健康数据时,再额外配置,并运行 sync_all_*sync_wellness_* 命令:

GARMIN_SYNC_WELLNESS=true                       # 开启健康数据同步
GARMIN_WELLNESS_SYNC_DAYS=1                     # 日常同步最近几天
GARMIN_WELLNESS_MIGRATE_DAYS=30                 # 历史迁移健康数据天数;0 表示不迁移
GARMIN_WELLNESS_MIGRATE_START_DAYS=0            # 从今天往前跳过多少天开始

注意:目标账号需要先人工绑定或连接一台支持健康数据的 Garmin 设备。若日志出现 419 Wellness device is not active for this user,请先在目标账号中连接设备并打开 Garmin Connect,让健康数据功能完成初始化。

使用前账号准备与配置

【重要重要重要!!!】请先参照 账号准备 进行账号配置,再来使用此工具

本地运行方案

首先确保运行此脚本的机器能够访问国际互联网, 如国外VPS、家庭全局科学的环境等, 否则无法正常登录佳明国际区

检查网络情况确保正常访问佳明服务

测试国际互联网网络连通性

wget google.com

执行后确保相应的数据类似如下再进行下面步骤,否则请检查网络环境(命令行也需要能访问国际互联网, 如果google在浏览器能正常访问,但是命令行无法ping通,google搜索关键词命令行翻墙,参考配置一下重试。) 如果用的时Clash,在左侧 General 下,将 TUN Mode 模式开启也可。

root@home:~# wget google.com

StatusCode        : 200
StatusDescription : OK
Content           : <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="zh-HK"><head><meta con
                    tent="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1
                    x/...
RawContent        : HTTP/1.1 200 OK
                    Connection: close
                    Conts...
Forms             : {f}
Headers           : {[ https://csp.withgoogle.com/csp/gws/other-hp], [Cache-Control, private, max
                    -age=0], [Content-Type, text/html; charset=UTF-8]...}
Images            : {@{innerHTML=; n value=zh-HK name=hl>; outerText=; tagName=I
                    NPUT; th}...}
Links             : {@{i id=gb_78; class=gbzt;
                     href=https://play.google.com/?hl=zh-TW&amp;tab=w8}...}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 52716

如果是如下显示则代表网络没有配置好,请先按上面说的方法解决再试。

root@home:~# wget google.com

--2023-07-06 20:26:18--  http://google.com/
Resolving google.com (google.com)... 142.251.42.238
Connecting to google.com (google.com)|142.251.42.238|:80... failed: Connection timed out.
Retrying.

测试佳明国际区网络连通性

ping sso.garmin.com
root@home:~# ping sso.garmin.com
PING sso.garmin.com.cdn.cloudflare.net (104.17.113.66) 56(84) bytes of data.
64 bytes from 104.17.113.66 (104.17.113.66): icmp_seq=1 ttl=63 time=1.92 ms
64 bytes from 104.17.113.66 (104.17.113.66): icmp_seq=2 ttl=63 time=1.27 ms
64 bytes from 104.17.113.66 (104.17.113.66): icmp_seq=3 ttl=63 time=2.43 ms

--- sso.garmin.com.cdn.cloudflare.net ping statistics ---

测试中国区网络连通性

ping sso.garmin.cn
root@home:~# ping sso.garmin.cn
PING sso.garmin.cn (61.150.74.194) 56(84) bytes of data.
64 bytes from 61.150.74.194: icmp_seq=1 ttl=63 time=1.69 ms
64 bytes from 61.150.74.194: icmp_seq=2 ttl=63 time=2.77 ms
64 bytes from 61.150.74.194: icmp_seq=3 ttl=63 time=7.12 ms

--- sso.garmin.cn ping statistics ---

安装 NodeJS

环境需求Node版本18及以上,推荐最新的LTS版本。 下载地址 https://nodejs.org/en/

开启 yarn

NodeJS 安装完毕后,新打开一个管理员命令行窗口, 输入命令执行

corepack enable

安装依赖

README.md同级目录打开命令行,执行

Windows在文件管理器中打开脚本所在的目录,在地址栏输入 cmd 然后回车,即可打开命令行,这个步骤不需要管理员权限

yarn

填入账号密码

推荐复制并打开 .env,按上方“修改配置文件”中的注释填入佳明账号、迁移配置以及可选的 Wellness 健康数据配置(或者也可以在 src/constant.ts 中配置默认值):

# 佳明国区账号密码
GARMIN_USERNAME=example@example.com
GARMIN_PASSWORD=password
# 佳明国际区账号密码
GARMIN_GLOBAL_USERNAME=example@example.com
GARMIN_GLOBAL_PASSWORD=password

# 佳明迁移配置
GARMIN_MIGRATE_NUM=100
GARMIN_MIGRATE_START=0
GARMIN_MIGRATE_AUTO_PAGE=true

运行脚本

注意: 如果执行不能成功,请尝试将梯子更换为美国IP,多更换几个ip试试

同步中国区到国际区

yarn sync_cn

同步国际区到中国区

yarn sync_global

同步中国区到国际区(活动数据 + Wellness 健康数据)

yarn sync_all_cn_to_global

同步国际区到中国区(活动数据 + Wellness 健康数据)

yarn sync_all_global_to_cn

同步中国区到国际区(仅 Wellness 健康数据)

yarn sync_wellness_cn_to_global

同步国际区到中国区(仅 Wellness 健康数据)

yarn sync_wellness_global_to_cn

迁移历史数据:中国区到国际区

yarn migrate_garmin_cn_to_global

迁移历史数据:国际区到中国区

yarn migrate_garmin_global_to_cn

迁移历史全量数据:中国区到国际区(活动数据 + Wellness 健康数据)

yarn migrate_all_cn_to_global

迁移历史全量数据:国际区到中国区(活动数据 + Wellness 健康数据)

yarn migrate_all_global_to_cn

迁移历史 Wellness 健康数据:中国区到国际区

yarn migrate_wellness_cn_to_global

迁移历史 Wellness 健康数据:国际区到中国区

yarn migrate_wellness_global_to_cn

常见问题

如果上面ping都正常,却仍然不能正常运行,请尝试将梯子更换为美国IP

定时任务(Linux Only)

上面手动执行名称成功迁移后,可以添加定时任务来自动执行

crontab -e 打开定时任务编辑,按需添加:

每3小时检查并同步国际区到中国区【可选】,注意PATH和SHELL两行也要写上

PATH=$PATH:/usr/local/bin:/usr/bin
SHELL=/bin/bash
0 */3 * * * cd /root/code/dailysync/ && yarn --cwd /root/code/dailysync/ sync_global >> /var/log/dailysync.log 2>&1

每3小时检查并同步中国区到国际区【可选】,注意PATH和SHELL两行也要写上

PATH=$PATH:/usr/local/bin:/usr/bin
SHELL=/bin/bash
0 */3 * * * cd /root/code/dailysync/ && yarn --cwd /root/code/dailysync/ sync_cn >> /var/log/dailysync.log 2>&1

其中 /root/code/dailysync/为脚本在机器上的目录地址,更换为您机器上的目录即可

运行日志查看

tail -100f /var/log/dailysync.log

迁移命令(migrate_*)还会自动把日志写到项目目录 log/ 下:migrate_<方向>_<时间戳>.log 为完整日志,migrate_<方向>_<时间戳>_failed.log 为失败明细(每行 [ISO时间] 内容 格式),参见上文「迁移日志」小节。

修改定时任务执行频率

当前为 */10 * * * * 每 10 分钟执行一次

您可以按需修改, 参考网址 https://crontab.guru/examples.html

列举几个常用的:

每小时执行一次: 0 * * * *

每6小时执行一次: 0 */6 * * *

每12小时执行一次: 0 */12 * * *


自动 安全 省心

如果看不到此文档的图片,请移步 知乎链接

此工具实现了佳明运动活动数据(生理数据如睡眠,身体电量,步数 等除外)的一次性迁移与日常运动数据同步,实现同步运动数据到到Strava Strava全球热图 。 额外还实现了RQ数据采集记录跑力的长期趋势及自动签到。

功能

迁移数据

  • 支持佳明账号中已有的运动数据从中国区一次性迁移到国际区。对应 Action: Migrate Garmin CN to Garmin Global
  • 支持佳明账号中已有的运动数据从国际区一次性迁移到中国区。对应 Action: Migrate Garmin Global to Garmin CN

同步数据

  • 约每20分钟左右检查当前中国区账号中是否有新的运动数据,如有则自动下载上传到国际区,并同步到Strava。 对应 Action: Sync Garmin CN to Garmin Global
  • 如果您常用的是国际区,想要在国内运动软件(悦跑圈/咕咚/keep/郁金香等等)同步运动数据及微信运动中显示 【Garmin手表 骑行xx分钟】(微信运动效果) 此工具可以实现自动反向同步中国区。 对应 Action: Sync Garmin Global to Garmin CN
    • 微信步数同步:
      • iOS: 佳明爱运动小程序绑定后,国际区->中国区同步仅能同步活动数据。出去运动不带手机的话,步数会记录在手表中,活动同步后,Connect会将步数上传到健康 App 中,微信与健康应用链接,即可在微信运动中看到步数。
      • Android: 暂无可行方法。
  • 如无特殊需求,强烈建议不要将两个同步脚本同时打开,按需开启一个即可!

说明

免责声明:

本工具仅限用于学习和研究使用,不得用于商业或者非法用途。如有任何问题可联系本人删除。

账号安全:

账号及密码保存在自己的 github secrets 中,不会泄露,运行代码均 开放源码,欢迎提交PR

进群讨论

为方便讨论,请加我绿色软件:nononopass (下面扫码)我拉你进群。nononopass 我拉你进群。 二维码扫码

About

佳明运动数据同步与采集工具

Resources

Stars

423 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages