首先确保运行此脚本的机器能够访问国际互联网, 如国外VPS、家庭全局科学的环境等, 否则无法正常登录佳明国际区
ping google.com
执行后确保能像如下显示再进行下面步骤,否则请检查网络环境(命令行也需要能访问国际互联网, 如果google在浏览器能正常访问,但是命令行无法ping通,google搜索关键词命令行翻墙,参考配置一下重试)
root@home:~# ping google.com
正在 Ping google.com [198.18.1.9] 具有 32 字节的数据:
来自 198.18.1.9 的回复: 字节=32 时间<1ms TTL=64
来自 198.18.1.9 的回复: 字节=32 时间<1ms TTL=64
来自 198.18.1.9 的回复: 字节=32 时间<1ms TTL=64
来自 198.18.1.9 的回复: 字节=32 时间<1ms TTL=64
198.18.1.9 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
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
安装完毕后,新打开一个管理员命令行窗口, 输入命令执行
corepack enable
在README.md
同级目录打开命令行,执行
Windows在文件管理器中打开脚本所在的目录,在地址栏输入 cmd
然后回车,即可打开命令行,这个步骤不需要管理员权限
yarn
打开 src/constant.ts
,
填入您的佳明账号及密码
注意: 如果执行不能成功,请尝试将梯子更换为美国IP,多更换几个ip试试
同步中国区到国际区
yarn sync_cn
同步国际区到中国区
yarn sync_global
如果上面ping都正常,却仍然不能正常运行,请尝试将梯子更换为美国IP
上面手动执行名称成功迁移后,可以添加定时任务来自动执行
crontab -e
打开定时任务编辑,按需添加:
PATH=$PATH:/usr/local/bin:/usr/bin
SHELL=/bin/bash
* */3 * * * cd /root/code/dailysync/ && yarn --cwd /root/code/dailysync/ sync_global >> /var/log/dailysync.log 2>&1
PATH=$PATH:/usr/local/bin:/usr/bin
SHELL=/bin/bash
* */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
当前为 */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
: 暂无可行方法。
- 微信步数同步:
- 如无特殊需求,强烈建议不要将两个同步脚本同时打开,按需开启一个即可!
- 采集RQ统计数据到GoogleSheets,记录跑力的长期趋势。参见: RQ数据采集到GoogleSheets教程
- RQ自动签到。参见:RQ自动签到
本工具仅限用于学习和研究使用,不得用于商业或者非法用途。如有任何问题可联系本人删除。
账号及密码保存在自己的 github secrets
中,不会泄露,运行代码均 开放源码,欢迎提交PR
。
为方便讨论,请加我绿色软件:nononopass (下面扫码)我拉你进群。nononopass
我拉你进群。
如果帮助到了你,可以 Buy Me a Coffee,赞助者会在文章下方留下ID表示感谢🙏。
- 2022-10-11:佳明服务器抽风,需要重置密码才能继续使用账号
解决方法如下,另外对代码也进行了优化,将登录信息加密存储复用,不必每次执行同步任务都登录一次,所以需要新增一条secrets,见下面解决方法。
最近如果收到来自佳明重置密码的邮件(国际区)/短信(中国区),请按照如下方式操作一下(没收到可以先不管,也有可能仅收到国际区的邮件,如果收到就重置对应区的密码):
1、登录ConnectWeb页面:国际区:https://connect.garmin.com/modern/ 中国区:https://connect.garmin.cn/modern
2、然后用邮箱收到的临时密码登录,重置密码,重置密码可以和原来密码相同,但是为了安全还是建议您更换一个新密码
3、如果您在第2步更换了新密码,在Github的secrets中更新 GARMIN_GLOBAL_PASSWORD 的值为国际区新密码,GARMIN_PASSWORD 的值为中国区新密码
4、更新代码,方法见文档FAQ
5、在Github的secrets中新增一条记录,名称 AESKEY ,内容为任意小于32位长度的字符串,用于加密账号登录信息,举例(不要复制使用):KAD1JLA12SKDJLASDJ
- 2022-09-01: 新增支持国际区同步新数据到中国区
- 新增一个
action
:Sync Garmin Global to Garmin CN
,开启后自动执行。与同步中国区到国际区操作一致。
- 新增一个
- 2022-08-07: 支持国际区迁移数据到中国区
- 新增一个
action
:Migrate Garmin Global to Garmin CN
,手动执行。与迁移中国区到国际区操作一致。
- 新增一个
- 2022-06-15: 增加佳明中国区迁移及同步国际区数据功能,同步
strava
- 2022-06-06: 采集
RQ
统计数据到Google Sheets
在用这个工具的大佬们(除了作者)欢迎点进链接加加好友~(点击展开) (填写您的链接)
在用这个工具的大佬们(除了作者)欢迎点进链接加加好友~(点击展开) (填写您的链接)
视频教程参考: 中国区佳明运动数据同步Strava视频教程
如果按照视频还是无法达到预期的效果(包括佳明国际区点不进去,跳转到com.cn、github 添加 secrets 没有反应等),请自行解决不可描述的网络问题。 如果github
上的图片看不到,那大概率是被墙了,看图请移步 知乎链接, 文档内容以github
版本为准,其他地方可能不是最新的。
如果看不到此文档的图片,请移步 知乎链接
如果是新注册的账号,包括中国区与国际区,请确保账号隐私设置中的存储和处理
是 同意
状态,设备上传
是已启用
状态(下图)
,否则上传数据会报412
错误码:User explicity revoked consent for uploading files.
如果的佳明账号在登录网页版Connect时,需要填入验证码,说明您开启了两步验证,需要关闭此选项才能使用本工具,如果不需要验证码就能登录,可跳过此步骤。
点击下方链接,请按照图中设置关闭
https://www.garmin.cn/zh-CN/account/security/mfa
点击【Fork】,也请顺手点一下【Fork】旁边的【Star】,支持一下作者 ,fork到自己账号下。
如下图打开Secrets配置,点击 【New repository secret】
准备自己的帐号密码及要迁移的数据量
佳明国内账号邮箱地址:
GARMIN_USERNAME
佳明国内账号密码:
GARMIN_PASSWORD
佳明国际账号邮箱地址:
GARMIN_GLOBAL_USERNAME
佳明国际账号密码:
GARMIN_GLOBAL_PASSWORD
要迁移的活动数量,先填1:
GARMIN_MIGRATE_NUM
从第几个活动开始迁移,先填 0:
GARMIN_MIGRATE_START
2022-10-11新增必填项::
AESKEY
信息加密存储KEY,可以随意输入任意小于32位长度的字符串,举例(不要复制使用):KAD1JLA12SKDJLASDJ
)
共计7个
填完后确保如下图红框内的都填上了, 红框外的不用管
对应的Actions,按需选择运行
Migrate Garmin CN to Garmin Global(中国区到国际区)
Migrate Garmin Global to Garmin CN(国际区到中国区)
这里以中国区到国际区为例,如下图,点击Actions
--> Migrate Garmin CN to Garmin Global(中国区到国际区)
--> Run workflow
执行迁移数据
点进去后可以查看日志,如果 Run yarn migrate_garmin_cn_to_global
那一栏看到 Garmin userInfo CN
和 Garmin userInfo global
, 并且数据持续在滚动刷新,就说明正常运行
如果上面一切正常,运行结束后,前面会是一个绿色,代表运行完成。
这个时候,去佳明国际区和strava
看看,是否有1条数据迁移过来,如果没有,代表有问题,请联系我咨询,如果有,代表正常运行。
(这一块如果看文字不是很清楚到话去看看文章开始部分的视频教程,参照看看)
上面正常的话开始迁移剩余数据
回到 Step2 的地方,分别修改
GARMIN_MIGRATE_NUM
为 500
GARMIN_MIGRATE_START
为 1
然后按照上面执行过的步骤,参照Step3再执行一次,执行成功后检查佳明国际区及Strava上是否迁移过来。
您可以在Strava页面核对总的运动记录数。 https://www.strava.com/athlete/training
如果您数据较多,如几千条的情况,需要多运行几次。
- 修改
GARMIN_MIGRATE_START
的值为之前累计的值501
- 按照
Step2
运行 - 将
GARMIN_MIGRATE_START
的值增加500
- 按照
Step2
运行 ,直至所有数据迁移完成
执行迁移的时候,请不要在web端再登录connect账号,同时请打开日志观察执行情况,中间极有可能佳明的接口出异常导致任务失败,如果遇到失败的情况,检查日志,看失败的时候相对总数
是多少条
本次开始向国际区上传第 一 条数据,【相对总数】上传到 七零一 条, 【 xx市 公路自行车 】,开始于 【 20xx-x-x 19:11:10 】,活动ID: 【 0000000 】
upload to garmin activity {
detailedImportResult: {
uploadId: 155871498739,
uploadUuid: { uuid: '0a80bfce-f94c-4ced-8fdd-8c3075032018' },
owner: 107917164,
fileSize: 29087,
processingTime: 49,
creationDate: '2022-10-01 12:51:18.931 GMT',
ipAddress: null,
fileName: '44055967_ACTIVITY.fit',
report: null,
successes: [],
failures: []
}
}
然后将 GARMIN_MIGRATE_START
修改为失败时的相对总数
,是数字,如701
,不是上边日志里的文字数字。然后重新执行,直到所有数据迁移完成。
迁移数据比较慢,请耐心等待,实测15分钟迁移100条左右
对应的Actions,按需选择运行
Sync Garmin CN to Garmin Global (中国区到国际区)
Sync Garmin Global to Garmin CN(国际区到中国区)
下面以中国区到国际区为例
开启后无需额外配置,除早上外,其他时候大约每30分钟左右自动同步一次数据,一段时间后可以查看同步记录.
至此,所有工作完毕,强烈建议阅读完下方的FAQ
部分,您后期可能遇到的大部分问题都会有解答。
如果我的工作帮到了您,可以考虑在最下方扫码赞助我一杯咖啡哦~
可能的原因:
- 请先检查手机
connect
,确保运动在connect
看到才能进行后续的同步工作。 - 定时执行没有执行,可以像执行
MIGRATE
那样手动执行Sync Garmin CN to Garmin Global (中国区到国际区)
或者Sync Garmin Global to Garmin CN(国际区到中国区)
来手动触发同步。可以将Github的地址在手机上存个书签,运动完手动运行一下Sync
就能立刻同步了。 - 检查佳明服务器状态 https://connect.garmin.com/status
参考: Schedule every 5 mins but runs a bit randomly
原因: github的定时计划任务以尽力而为的策略运行。
我代码中写的是每10分钟执行一次,实际情况是大约每20分钟执行一次。
尤其是早上8点左右,几乎都会延迟很久执行,原因是大概我们8点对应美国0点,其他很多程序的定时任务在0点执行,导致我们的任务抢不到计算资源,导致延迟执行。 着急的话上来手动执行一下就好。
文中建议改为每5分钟一次,但是如果这样的话会超出每月的免费可用额度。如果您急切的想同步数据,建议上来手动操作一下。
翻译:
欢迎来到 GitHub 支持社区!计划的操作工作流以尽力而为的策略运行。当您的计划到期时,您的工作流将添加到池中并在资源可用时运行。这意味着您可能会看到与您的计划时间和工作流运行的实际时间相比有所延迟,尽管这可能会导致更长的延迟,具体取决于当时可用的资源。 您可以安排工作流运行的最短时间为每 5 分钟一次。由于这种池化,如果在您的下一个计划设置为运行时,池中已经有运行等待,您可能会看到运行被“跳过”。 工程团队正在研究提高调度的可用性、扩展性和响应时间,但如果您需要精确的调度操作,那么您可能会更好地寻找替代解决方案,例如在您自己的 VPS 上运行 cron。
不用。上面的步骤执行过后,MIGRATE手动迁移已有数据,再有新跑的数据会在SYNC中大约每20分钟左右自动同步一次数据
当前为 */10 * * * *
每 10 分钟执行一次
您可以按需修改, 参考网址 https://crontab.guru/examples.html
列举几个常用的:
每小时执行一次: 0 * * * *
每6小时执行一次: 0 */6 * * *
每12小时执行一次: 0 */12 * * *
按您需要修改的文件:
- 中国区同步国际区:
sync_garmin_cn_to_garmin_global.yml
- 国际区同步中国区:
sync_garmin_global_to_garmin_cn.yml
代码可能有优化更新,如看到下图的情况,请点击下图红框更新到最新的代码
本工具原理为模拟用户登录进行下载、上传操作,正常,无需理会。
https://intervals.icu/ (强烈推荐!!)
https://app.trainingpeaks.com/#home
https://runalyze.com/dashboard
- 采集RQ统计数据到Google表格
- 一次性批量迁移已有活动数据到国际区
- 自动同步新的活动数据到数据到国际区
- 从国际区反向迁移同步到中国区功能
- Strava数据导出上传Garmin
- Connect API 异常出错时抛出
github actions
错误,避免内部运行失败但是外部显示成功的问题。 - Docker本地部署运行版本,不依赖GitHub Action,避免自动运行间隔不固定的问题。
- WebUI 管理同步及迁移任务
- 乳酸阈值长期趋势读取与分析页面
- 国际区与中国区路线、训练课程同步
- api:
- 获取所有路线: https://connect.garmin.com/web-gateway/course/owner
{ "coursesForUser" : [] }
- 路线详情 https://connect.garmin.com/course-service/course/{id}
- 下载GPX https://connect.garmin.com/course-service/course/gpx/{id}
- 导入GPX https://connect.garmin.com/modern/proxy/course-service/course/import
- 上传课程,可以直接用 路线详情的响应数据,优先测试此方法。 POST https://connect.garmin.com/course-service/course/
- 获取所有路线: https://connect.garmin.com/web-gateway/course/owner
- api:
姓名 | 金额(¥) |
---|---|
Monk****IN | 50 |
Cl**N | 50 |
無敵**十 | 50 |
*弟 | 50 |
S**en | 66 |
C**2 | 8.88 |
星**烂 | 30 |
李*牛 | 15 |
狼* | 16.18 |
刘 | 50 |
A*w | 50 |
*昱 | 20 |
*仔 | 8.88 |
*飞 | 50 |
ZKY | 50 |
L**n | 40 |
微**移 | 25 |
*宫 | 100 |
无**空 | 50 |
解*n | 30 |
*亮 | 15 |
lr*s | 50 |
S*e | 8.8 |
` |