佳明做了限制,对github actions方式运行会出现429限制登录的情况,目前无法解决,推荐让claude或者其他agent将本项目拉到本地去运行。
开通了ECG功能的佳明账号,因为登录佳明时需要提供验证码,开通ECG后,这个验证码无法关闭,github上要中途要输入一次验证码,本同步脚本无法支持,下方的Web版本做了兼容,可以使用。
如果你不熟悉代码,强烈推荐使用这个版本,在网页上填入账号点击就能同步数据,简洁好用。 https://dailysync.cn/
gitlab: https://gitlab.com/gooin/dailysync
github: https://github.com/gooin/dailysync-rev
如果你懂一点代码,会使用 docker 可以使用此方案。
目前没有提供打包好的镜像,需要拉取下来自行打包使用
git clone https://github.com/gooin/dailysync-rev.git复制模板文件为 .env(cp .env.example .env),按注释填入信息。Docker 运行会通过 docker-compose.yml 的 env_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 中 services.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_DAYS 和 GARMIN_WELLNESS_MIGRATE_START_DAYS)
yarn migrate_wellness_cn_to_global迁移历史 Wellness 健康数据:国际区到中国区(按 GARMIN_WELLNESS_MIGRATE_DAYS 和 GARMIN_WELLNESS_MIGRATE_START_DAYS)
yarn migrate_wellness_global_to_cndocker-compose up参照下文中的 定时任务(Linux Only),把命令替换成使用
docker start daily-sync因为项目之前在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&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.comroot@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.cnroot@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 ---
环境需求Node版本18及以上,推荐最新的LTS版本。
下载地址 https://nodejs.org/en/
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
上面手动执行名称成功迁移后,可以添加定时任务来自动执行
crontab -e 打开定时任务编辑,按需添加:
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>&1PATH=$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。


