- clone or Fork before vercel 404 need to pull the latest code
- python3(python) in README means python3 python
- use v2.0 need change vercel setting from gatsby to vite
- 2023.09.26 garmin need secret_string(and in Actions) get
python run_page/get_garmin_secret.py ${email} ${password}
# if cn
python run_page/get_garmin_secret.py ${email} ${password} --is-cn
R.I.P. 希望大家都能健康顺利的跑过终点,逝者安息。
Running page runners
- GitHub Actions 自动同步跑步数据,生成展示页面
- 支持 Vercel(推荐)和 GitHub Pages 自动部署
- React Hooks
- Mapbox 进行地图展示
- Nike、Strava、佳明(佳明中国)及 Keep 等,自动备份 GPX 数据,方便备份及上传到其它软件
因为数据存在 gpx 和 data.db 中,理论上支持几个软件一起,你可以把之前各类 App 的数据都同步到这里(建议本地同步,之后 Actions 选择正在用的 App)
如果你不想公开数据,可以选择
Strava
的模糊处理,或private
仓库。
- Strava
- Nike Run Club
- Garmin
- Garmin-cn
- Keep
- 悦跑圈 :限制单个设备,无法自动化
- 咕咚 :限制单个设备,无法自动化
- 郁金香运动
- GPX
- TCX
- FIT
- 佳明国内同步国际
- Tcx+Strava(upload all tcx data to strava)
- Gpx+Strava(upload all tcx data to strava)
- Nike+Strava(Using NRC Run, Strava backup data)
- Garmin_to_Strava(Using Garmin Run, Strava backup data)
- Strava_to_Garmin(Using Strava Run, Garmin backup data)
git clone https://github.com/yihong0618/running_page.git --depth=1
pip3 install -r requirements.txt
npm install -g corepack && corepack enable && pnpm install
pnpm develop
访问 http://localhost:5173/ 查看
# NRC
docker build -t running_page:latest . --build-arg app=NRC --build-arg nike_refresh_token=""
# Garmin
docker build -t running_page:latest . --build-arg app=Garmin --build-arg secret_string=""
# Garmin-CN
docker build -t running_page:latest . --build-arg app=Garmin-CN --build-arg secret_string=""
# Strava
docker build -t running_page:latest . --build-arg app=Strava --build-arg client_id="" --build-arg client_secret="" --build-arg refresh_token=""
#Nike_to_Strava
docker build -t running_page:latest . --build-arg app=Nike_to_Strava --build-arg nike_refresh_token="" --build-arg client_id="" --build-arg client_secret="" --build-arg refresh_token=""
#启动
docker run -itd -p 80:80 running_page:latest
#访问
访问 ip:80 查看
建议有能力的同学把
src/utils/const.ts
文件中的 Mapbox token 自己的 Mapbox token
如果你是海外用户请更改
IS_CHINESE = false
insrc/utils/const.ts
const MAPBOX_TOKEN =
'pk.eyJ1IjoieWlob25nMDYxOCIsImEiOiJja2J3M28xbG4wYzl0MzJxZm0ya2Fua2p2In0.PNKfkeQwYuyGOTT_x9BJ4Q';
在仓库目录下找到
src/static/site-metadata.ts
,找到以下内容并修改成你自己想要的。
siteMetadata: {
siteTitle: 'Running Page', #网站标题
siteUrl: 'https://yihong.run', #网站域名
logo: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQTtc69JxHNcmN1ETpMUX4dozAgAN6iPjWalQ&usqp=CAU', #左上角 LOGO
description: 'Personal site and blog',
navLinks: [
{
name: 'Blog', #右上角导航名称
url: 'https://yihong.run/running', #右上角导航链接
},
{
name: 'About',
url: 'https://github.com/yihong0618/running_page/blob/master/README-CN.md',
},
],
},
修改
src/utils/const.ts
文件中的样式:
// styling: 关闭虚线:设置为 `false`
const USE_DASH_LINE = true;
// styling: 透明度:[0, 1]
const LINE_OPACITY = 0.4;
// styling: 开启隐私模式(不显示地图仅显示轨迹): 设置为 `true`
// 注意:此配置仅影响页面显示,数据保护请参考下方的 "隐私保护"
const PRIVACY_MODE = false;
// styling: 默认关灯: 设置为 `false`, 仅在隐私模式关闭时生效(`PRIVACY_MODE` = false)
const LIGHTS_ON = true;
隐私保护:设置下面环境变量:
# 忽略每个 polyline 的起点和终点的长度(单位:米)。
IGNORE_START_END_RANGE = 200
# 忽略下面 polyline 中每个点的距离的圆圈(单位:米)。
IGNORE_RANGE = 200
# 包含要忽略的点的折线。
IGNORE_POLYLINE = ktjrFoemeU~IorGq}DeB
# 在保存到数据库之前进行过滤,你会丢失一些数据,但可以保护你的隐私,如果你使用的是公共仓库,建议设置为 1。不设置可关闭。
IGNORE_BEFORE_SAVING = 1
你可以使用
Google Maps
的 互动式多段线编码器实用程序,来制作你的IGNORE_POLYLINE
。如果你在中国,请使用卫星图制作,避免火星坐标漂移。
下载您的 Nike Run Club/Strava/Garmin/Garmin-cn/Keep 数据到本地,别忘了在 total 页面生成可视化 SVG
Make your GPX
data
把其它软件生成的 gpx files
拷贝到 GPX_OUT
之后运行
python3(python) run_page/gpx_sync.py
Make your TCX
data
把其它软件生成的 tcx files
拷贝到 TCX_OUT
之后运行
python3(python) run_page/tcx_sync.py
Make your FIT
data
把其它软件生成的 fit files 拷贝到 FIT_OUT 之后运行
python3(python) run_page/fit_sync.py
获取您的 Keep 数据
确保自己的账号能用手机号 + 密码登陆 (不要忘记添加 secret 和更改自己的账号,在 GitHub Actions 中), 注:海外手机号需要换成国内 +86 的手机号
python3(python) run_page/keep_sync.py ${your mobile} ${your password}
示例:
python3(python) run_page/keep_sync.py 13333xxxx example
我增加了 keep 可以导出 gpx 功能(因 keep 的原因,距离和速度会有一定缺失), 执行如下命令,导出的 gpx 会加入到 GPX_OUT 中,方便上传到其它软件
python3(python) run_page/keep_sync.py ${your mobile} ${your password} --with-gpx
示例:
python3(python) run_page/keep_sync.py 13333xxxx example --with-gpx
路线偏移修正
如果您得到的运动路线与实际路线对比有整体偏移,可以修改代码中的参数进行修正
Keep 目前采用的是 GCJ-02 坐标系,因此导致得到运动数据在使用 WGS-84 坐标系的平台(Mapbox、佳明等)中显示轨迹整体偏移
- 修改
run_page/keep_sync.py
文件中的参数:
# If your points need trans from gcj02 to wgs84 coordinate which use by Mappbox
TRANS_GCJ02_TO_WGS84 = True
因悦跑圈限制单个设备,无法自动化。
获取您的悦跑圈数据
- 获取登陆验证码:
- 确保自己的账号能用手机号 + 验证码登陆
- 点击获取验证码
不要在手机输入验证码,拿到验证码就好,用这个验证码放到下方命令中
python3(python) run_page/joyrun_sync.py ${your mobile} ${your 验证码}
示例:
python3(python) run_page/joyrun_sync.py 13333xxxx xxxx
joyrun 导出 gpx 文件
导出的 gpx 在 GPX_OUT 目录,方便上传到其它软件
python3(python) run_page/joyrun_sync.py ${your mobile} ${your 验证码} --with-gpx
示例:
python3(python) run_page/joyrun_sync.py 13333xxxx example --with-gpx
因为验证码有过期时间,我增加了 cookie uid sid 登陆的方式,uid 及 sid 在您登陆过程中会在控制台打印出来
示例:
python3(python) run_page/joyrun_sync.py 1393xx30xxxx 97e5fe4997d20f9b1007xxxxx --from-uid-sid --with-gpx
因悦跑圈限制单个设备,无法自动化。
获取您的咕咚数据
python3(python) run_page/codoon_sync.py ${your mobile or email} ${your password}
示例:
python3(python) run_page/codoon_sync.py 13333xxxx xxxx
Codoon 导出 gpx
导出的 gpx 在 GPX_OUT 目录,方便上传到其它软件
python3(python) run_page/codoon_sync.py ${your mobile or email} ${your password} --with-gpx
示例:
python3(python) run_page/codoon_sync.py 13333xxxx xxxx --with-gpx
因为登录 token 有过期时间限制,我增加了 refresh_token&user_id 登陆的方式,refresh_token 及 user_id 在您登陆过程中会在控制台打印出来
示例:
python3(python) run_page/codoon_sync.py 54bxxxxxxx fefxxxxx-xxxx-xxxx --from-auth-token
路线偏移修正
如果您得到的运动路线与实际路线对比有整体偏移,可以修改代码中的参数进行修正
咕咚最初采用 GCJ-02 坐标系,在 2014 年 3 月份左右升级为 WGS-84 坐标系,导致升级之前的运动数据在使用 WGS-84 坐标系的平台(Mapbox、佳明等)中显示轨迹整体偏移
- 修改
run_page/codoon_sync.py
文件中的参数:
TRANS_END_DATE 需要根据您的实际情况设定,程序会修正这一天之前的运动记录
# If your points need trans from gcj02 to wgs84 coordinate which use by Mappbox
TRANS_GCJ02_TO_WGS84 = True
# trans the coordinate data until the TRANS_END_DATE, work with TRANS_GCJ02_TO_WGS84 = True
TRANS_END_DATE = "2014-03-24"
获取您的郁金香运动数据
郁金香运动数据的获取方式采用开放平台授权模式,通过访问RunningPage 授权页面获取账号 TOKEN(不会过期,只能访问 2021 年之后的数据),并在仓库的 GitHub Actions 环境配置中添加
TULIPSPORT_TOKEN
配置。
python3(python) run_page/tulipsport_sync.py ${tulipsport_token}
示例:
python3(python) run_page/tulipsport_sync.py nLgy****RyahI
获取您的 Garmin 数据
-
如果你只想同步跑步数据增加命令 --only-run
-
如果你想同步
tcx
格式,增加命令 --tcx -
如果你想同步
fit
格式,增加命令 --fit -
如果你使用 Garmin 作为数据源建议您将代码拉取到本地获取 Garmin 国际区的密钥,注意Python 版本必须>=3.8
在终端中输入以下命令
# 获取密钥
python3(python) run_page/get_garmin_secret.py ${your email} ${your password}
复制上述终端中输出的密钥,如果您是使用 Github 请在 Github Action 中配置GARMIN_SECRET_STRING参数
示例:
python3(python) run_page/garmin_sync.py xxxxxxxxxxx
获取您的 Garmin CN 数据
- 如果你只想同步跑步数据请增加 --only-run
- 如果你想同步
tcx
格式,增加命令 --tcx - 如果你想同步
fit
格式,增加命令 --fit - 如果你使用 Garmin 作为数据源建议您将代码拉取到本地获取 Garmin 国际区的密钥,注意Python 版本必须>=3.10
在终端中输入以下命令
# to get secret_string
python3(python) run_page/get_garmin_secret.py ${your email} ${your password} --is-cn
复制上述终端中输出的密钥,如果您是使用 Github 请在 Github Action 中配置GARMIN_SECRET_STRING_CN 参数 示例:
python3(python) run_page/garmin_sync.py xxxxxxxxx --is-cn
仅同步跑步数据:
python3(python) run_page/garmin_sync.py xxxxxxxxxx --is-cn --only-run
同步佳明 CN 数据到 佳明国际区
- 如果你只想同步
type running
使用参数 --only-run The Python version must be >=3.10
在终端中输入以下命令
python3(python) run_page/get_garmin_secret.py ${your email} ${your password} --is-cn
在终端中输入以下命令
python3(python) run_page/get_garmin_secret.py ${your email} ${your password}
在终端中输入以下命令
python3(python) run_page/garmin_sync_cn_global.py ${garmin_cn_secret_string} ${garmin_secret_string}
获取 Nike Run Club 数据
请注意:当您选择将 running_page 部署在自己的服务器上时,由于 Nike 已经封禁了一部分 IDC 的服务器 IP 段,您的服务器可能不能正常同步 Nike Run Club 的数据并显示
403 error
,这时您将不得不选择其他的托管方式。
获取 Nike 的 refresh_token
全部需要在大陆以外的全局 ip 下进行
-
在这里登陆website, 打开 F12 在浏览器抓 login -> XHR -> get the
refresh_token
from login api -
复制
refresh_token
之后可以添加在GitHub Secrets 中,也可以直接在命令行中使用
Chrome 浏览器:按下 F12 打开浏览器开发者工具,点击 Application 选项卡,来到左侧的 Storage 面板,点击展开 Local storage,点击下方的 https://unite.nike.com。接着点击右侧的 com.nike.commerce.nikedotcom.web.credential Key,下方会分行显示我们选中的对象,可以看到 refresh_token ,复制 refresh_token 右侧的值。Safari 浏览器:在 Safari 打开 Nike 的网页后,右击页面,选择「检查元素」,打开浏览器开发者工具。点击「来源」选项卡,在左侧找到 XHR 文件夹,点击展开,在下方找到 login 文件并单击,在右侧同样可以看到 refresh_token ,复制 refresh_token 右侧的值。
python3(python) run_page/nike_sync.py ${nike refresh_token}
示例:
python3(python) run_page/nike_sync.py eyJhbGciThiMTItNGIw******
获取 Strava 数据
-
注册/登陆 Strava 账号
-
登陆成功后打开 Strava Developers -> Create & Manage Your App
-
使用以下链接请求所有权限 将 ${your_id} 替换为 My API Application 中的 Client ID 后访问完整链接
https://www.strava.com/oauth/authorize?client_id=${your_id}&response_type=code&redirect_uri=http://localhost/exchange_token&approval_prompt=force&scope=read_all,profile:read_all,activity:read_all,profile:write,activity:write
Example:
https://www.strava.com/oauth/authorize?client_id=115321&response_type=code&redirect_uri=http://localhost/exchange_token&approval_prompt=force&scope=read_all,profile:read_all,activity:read_all,profile:write,activity:write
- 提取授权后返回链接中的 code 值 例如:
http://localhost/exchange_token?state=&code=1dab37edd9970971fb502c9efdd087f4f3471e6e&scope=read,activity:write,activity:read_all,profile:write,profile:read_all,read_all
code
数值为:
1dab37edd9970971fb502c9efdd087f4f3471e6
6. 使用 Client_id、Client_secret、Code 请求 refresh_token
在 终端/iTerm
中执行:
curl -X POST https://www.strava.com/oauth/token \
-F client_id=${Your Client ID} \
-F client_secret=${Your Client Secret} \
-F code=${Your Code} \
-F grant_type=authorization_code
示例:
curl -X POST https://www.strava.com/oauth/token \
-F client_id=12345 \
-F client_secret=b21******d0bfb377998ed1ac3b0 \
-F code=d09******b58abface48003 \
-F grant_type=authorization_code
- 同步数据至 Strava 在项目根目录执行:
第一次同步 Strava 数据时需要更改在 strava_sync.py 中的第 12 行代码 False 改为 True,运行完成后,再改为 False。
仅同步跑步数据,添加参数 --only-run
python3(python) run_page/strava_sync.py ${client_id} ${client_secret} ${refresh_token}
其他资料参见 https://developers.strava.com/docs/getting-started https://github.com/barrald/strava-uploader https://github.com/strava/go.strava
上传所有的 tcx 格式的跑步数据到 strava
- 完成 strava 的步骤
- 把 tcx 文件全部拷贝到 TCX_OUT 中
- 在项目根目录下执行:
python3(python) run_page/tcx_to_strava_sync.py ${client_id} ${client_secret} ${strava_refresh_token}
示例:
python3(python) run_page/tcx_to_strava_sync.py xxx xxx xxx
或
python3(python) run_page/tcx_to_strava_sync.py xxx xxx xxx --all
如果你已经上传过需要跳过判断增加参数
--all
上传所有的 gpx 格式的跑步数据到 strava
- 完成 strava 的步骤
- 把 gpx 文件全部拷贝到 GPX_OUT 中
- 在项目根目录下执行:
python3(python) run_page/gpx_to_strava_sync.py ${client_id} ${client_secret} ${strava_refresh_token}
示例:
python3(python) run_page/gpx_to_strava_sync.py xxx xxx xxx
或
python3(python) run_page/gpx_to_strava_sync.py xxx xxx xxx --all
- 如果你已经上传过需要跳过判断增加参数
--all
获取 Nike Run Club
的跑步数据然后同步到 Strava
- 完成 nike 和 strava 的步骤
- 在项目根目录下执行:
python3(python) run_page/nike_to_strava_sync.py ${nike_refresh_token} ${client_id} ${client_secret} ${strava_refresh_token}
示例:
python3(python) run_page/nike_to_strava_sync.py eyJhbGciThiMTItNGIw****** xxx xxx xxx
获取你的佳明
的跑步数据,然后同步到 Strava
- 完成 garmin 和 strava 的步骤
- 在项目根目录下执行:
python3(python) run_page/garmin_to_strava_sync.py ${client_id} ${client_secret} ${strava_refresh_token} ${garmin_secret_string} --is-cn
示例:
python3(python) run_page/garmin_to_strava_sync.py xxx xxx xxx xx xxx
获取你的Strava
的跑步数据然后同步到 Garmin
- 完成 garmin 和 strava 的步骤,同时,还需要在 Github Actions secret 那新增 Strava 配置:
secrets.STRAVA_EMAIL
、secrets.STRAVA_PASSWORD
- 在项目根目录下执行:
python3(python) run_page/strava_to_garmin_sync.py ${{ secrets.STRAVA_CLIENT_ID }} ${{ secrets.STRAVA_CLIENT_SECRET }} ${{ secrets.STRAVA_CLIENT_REFRESH_TOKEN }} ${{ secrets.GARMIN_SECRET_STRING }} ${{ secrets.STRAVA_EMAIL }} ${{ secrets.STRAVA_PASSWORD }}
如果你的佳明账号是中国区,执行如下的命令:
python3(python) run_page/strava_to_garmin_sync.py ${{ secrets.STRAVA_CLIENT_ID }} ${{ secrets.STRAVA_CLIENT_SECRET }} ${{ secrets.STRAVA_CLIENT_REFRESH_TOKEN }} ${{ secrets.GARMIN_SECRET_STRING_CN }} ${{ secrets.STRAVA_EMAIL }} ${{ secrets.STRAVA_PASSWORD }} --is-cn
如果要在同步到 Garmin 的运动记录中添加 Garmin 设备信息,需要添加--use_fake_garmin_device
参数,这将在同步的 Garmin 锻炼记录中添加一个 Garmin 设备(默认情况下为 Garmin Forerunner 245
,您可以在garmin_device_adaptor.py
中更改设备信息),运动记录中有了设备信息之后就可以同步到其他 APP 中,比如数字心动(攒上马积分)这类不能通过 Apple Watch 同步的 APP,当然也可以同步到 Keep,悦跑圈,咕咚等 APP。
最终执行的命令如下:
python3(python) run_page/strava_to_garmin_sync.py ${{ secrets.STRAVA_CLIENT_ID }} ${{ secrets.STRAVA_CLIENT_SECRET }} ${{ secrets.STRAVA_CLIENT_REFRESH_TOKEN }} ${{ secrets.GARMIN_SECRET_STRING_CN }} ${{ secrets.STRAVA_EMAIL }} ${{ secrets.STRAVA_PASSWORD }} --use_fake_garmin_device
注意:首次初始化的时候,如果你有大量的 strava 跑步数据,可能有些数据会上传失败,只需要多重试几次即可。
生成数据展示
感兴趣的同学可以改下方参数 (--special-distance 10 --special-distance2 20, 10km~20km 展示为 special-color1 20km 以上展示为 special-color2, --min-distance 10.0 用来筛选 10km 以上的)
python3(python) run_page/gen_svg.py --from-db --title "${{ env.TITLE }}" --type github --athlete "${{ env.ATHLETE }}" --special-distance 10 --special-distance2 20 --special-color yellow --special-color2 red --output assets/github.svg --use-localtime --min-distance 0.5
python3(python) run_page/gen_svg.py --from-db --title "${{ env.TITLE_GRID }}" --type grid --athlete "${{ env.ATHLETE }}" --output assets/grid.svg --min-distance 10.0 --special-color yellow --special-color2 red --special-distance 20 --special-distance2 40 --use-localtime
生成年度环形数据
python3(python) run_page/gen_svg.py --from-db --type circular --use-localtime
更多展示效果参见: https://github.com/flopp/GpxTrackPoster
使用 Cloudflare 部署
-
登录到 Cloudflare 仪表板。
-
在左侧选择
Workers 和 Pages
。 -
点击
创建应用程序
后选择Pages
页面,链接您的 GitHub 账户并选择running_page
仓库,点击开始设置
。 -
下滑到
构建设置
,在框架预设
中选择Create React App
,将构建输出目录
设置为dist
。 -
下滑点击
环境变量 (高级)
,并添加一个如下的变量:变量名称 =
PYTHON_VERSION
, 值 =3.8
-
点击
保存并部署
,完成部署。
部署到 GitHub Pages
-
进入仓库的 "Settings -> GitHub Pages -> Source",选择 "GitHub Actions"
-
进入仓库的 "Actions -> Workflows -> All Workflows",选择左侧面板的 "Run Data Sync",然后点击 "Run workflow"
- "Run Data Sync" 将更新数据,然后触发 "Publish GitHub Pages" 工作流
- 确认工作流运行没有错误
- 打开网站检查结果
- 如果网站没有反映最新数据,请使用“F5”刷新页面
- 某些浏览器 (比如 Chrome) 可能缓存网页不刷新,您需要使用 Ctrl+F5 (Windows) 或 Shift+Cmd+r (Mac) 强制清除缓存并重新加载页面
-
为 GitHub Actions 添加代码提交权限,访问仓库的
Settings > Actions > General
页面,找到Workflow permissions
的设置项,将选项配置为Read and write permissions
,支持 CI 将运动数据更新后提交到仓库中。 -
如果想把你的 running_page 部署在 xxx.github.io 而不是 xxx.github.io/run_page 亦或是想要添加自定义域名于 GitHub Pages,需要做三点
- 修改你的 fork 的 running_page 仓库改名为 xxx.github.io, xxx 是你 github 的 username
- 修改 gh-pages.yml 中的 Build 模块,删除
${{ github.event.repository.name }}
改为run: PATH_PREFIX=/ pnpm build
即可 - 修改 src/static/site-metadata.ts 中
siteUrl: ''
或是添加你的自定义域名,siteUrl: '[your_own_domain]'
, 即可
Fork 的同学请一定不要忘了把 GitHub Token 改成自己的,否则会 push 到我的 repo 中,谢谢大家。
使用 iOS 的 Shortcuts 实现自动化
下面拿 keep app 举例,当结束跑步后关闭 app,然后自动触发 Actions 更新数据。
- 拿到项目的 actions id(需要自行申请 token)
curl https://api.github.com/repos/yihong0618/running_page/actions/workflows -H "Authorization: token d8xxxxxxxxxx" # change to your config
-
结合快捷指令
-
通过 iCloud 获取 running-page-shortcuts-template
-
修改下图字典参数
-
-
自动化
把数据文件放在 GitHub Cache 中
run_data_sync.yml
中的 SAVE_DATA_IN_GITHUB_CACHE
设置为 true
时,可以把脚本抓取和中间产生的数据文件放到 GitHub Actions Cache 中。这样可以让你的 GitHub commit 历史和目录保持干净。
如果你用 GitHub Pages
部署建议把这个值设置成 true
。
测试发现,不同厂商在写 fit 文件的时候有略微差异。
已调试设备:
- 佳明手表
- 迈金码表
如果发现自己的 fit 文件解析有问题。可以提 issue。
- 完善这个文档
- 支持佳明,佳明中国
- 支持 keep
- 支持苹果自带运动
- 支持 nike + strava
- 支持咕咚
- 尝试支持小米运动
- 支持英语
- 完善代码
- 清理整个项目
- 完善前端代码
- better actions
- tests
- 支持不同的运动类型
- 任何 Issues PR 均欢迎。
- 可以提交 PR share 自己的 Running page 在 README 中。
- 提交 PR 前,使用 black 对 Python 代码进行格式化。(
black .
)
- @flopp 特别棒的项目 GpxTrackPoster
- @danpalmer 原始的 UI 设计
- @shaonianche icon 设计及文档
- @geekplux 帮助及鼓励,重构了前端代码,学到了不少
- @ben-29 搞定了咕咚,和我一起搞定了悦跑圈,太厉害了
- @MFYDev Wiki
谢谢就够了
-
Strava 100 每 15 分钟的请求,1000 每日限制
https://www.strava.com/settings/api https://developers.strava.com/docs/#rate-limiting
等待时间限制(这里是 strava 接口请求限制),不要关闭终端,这里会自动执行下一组上传数据
Strava API Rate Limit Exceeded. Retry after 100 seconds Strava API Rate Limit Timeout. Retry in 799.491622 seconds
-
vercel git
如果想 ignpre gh-pages 可以在
settings
->build
->Ignored Build Step
->Custom
输入命令:if [ "$VERCEL_GIT_COMMIT_REF" != "gh-pages" ]; then exit 1; else exit 0;