佳明运动数据同步与采集工具 关注作者Strava
自动 安全 省心
如果看不到此文档的图片,请移步 知乎链接
此工具实现了佳明运动活动数据(生理数据如睡眠,身体电量,步数 等除外)的一次性迁移与日常运动数据同步,实现同步运动数据到到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
(二维码扫码) 我拉你进群。
支持作者
如果帮助到了你,可以 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
版本为准,其他地方可能不是最新的。
教程开始
迁移已有运动数据,并开启自动同步功能
前置条件:
注册好佳明国际区的帐号及Strava账号,并已经将Strava与佳明国际区账号关联,并开启Strava数据权限(下图)
知乎链接
如果看不到此文档的图片,请移步佳明账号隐私设置
如果是新注册的账号,包括**区与国际区,请确保账号隐私设置中的存储和处理
是 同意
状态,设备上传
是已启用
状态(下图)
,否则上传数据会报412
错误码:User explicity revoked consent for uploading files.
关闭佳明账号两步验证
如果的佳明账号在登录网页版Connect时,需要填入验证码,说明您开启了两步验证,需要关闭此选项才能使用本工具,如果不需要验证码就能登录,可跳过此步骤。
点击下方链接,请按照图中设置关闭
https://www.garmin.cn/zh-CN/account/security/mfa
Step1: fork 此工程
点击【Fork】,也请顺手点一下【Fork】旁边的【Star】,支持一下作者 ,fork到自己账号下。
Step2: 配置填入自己的佳明国内区、国际区账号及密码
如下图打开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个
填完后确保如下图红框内的都填上了, 红框外的不用管
Step3: 手动迁移已有数据
对应的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条左右
Step4: 自动同步新的运动数据
对应的Actions,按需选择运行
Sync Garmin CN to Garmin Global (**区到国际区)
Sync Garmin Global to Garmin CN(国际区到**区)
下面以**区到国际区为例
开启后无需额外配置,除早上外,其他时候大约每30分钟左右自动同步一次数据,一段时间后可以查看同步记录.
至此,所有工作完毕,强烈建议阅读完下方的FAQ
部分,您后期可能遇到的大部分问题都会有解答。
如果我的工作帮到了您,可以考虑在最下方扫码赞助我一杯咖啡哦~
FAQ:
数据没有同步成功?
可能的原因:
- 请先检查手机
connect
,确保运动在connect
看到才能进行后续的同步工作。 - 定时执行没有执行,可以像执行
MIGRATE
那样手动执行Sync Garmin CN to Garmin Global (**区到国际区)
或者Sync Garmin Global to Garmin CN(国际区到**区)
来手动触发同步。可以将Github的地址在手机上存个书签,运动完手动运行一下Sync
就能立刻同步了。 - 检查佳明服务器状态 https://connect.garmin.com/status
数据同步为什么没有按计划执行,有的时候一小时才执行了2次?
参考: 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
同步最新的代码库(更新代码)
代码可能有优化更新,如看到下图的情况,请点击下图红框更新到最新的代码
Github
执行失败的邮件
收到
收到来自佳明登录提醒的邮件
本工具原理为模拟用户登录进行下载、上传操作,正常,无需理会。
关闭自动同步
数据同步到佳明国际区后,其他的一些可关联的运动分析平台
https://intervals.icu/ (强烈推荐!!)
https://app.trainingpeaks.com/#home
https://runalyze.com/dashboard
同步到佳明国际区,同步Strava
采集RQ数据教程:
TODO
- 采集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:
Star History
填写您的链接)
在用这个工具的大佬们(除了作者)欢迎点进链接加加好友~ (Buy Me a Coffee
如果你觉得我的工作帮到了你,可赠予我一杯咖啡,感谢~
支持者记录
姓名 | 金额(¥) |
---|---|
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 |