Astro-blog记录(6)-制作一个自同步运动数据页

2025-07-11

前言

本文的实现并没有包含路径展示,分年统计的功能, 如果你需要更成熟的方案, 可以使用yihong0618/running_page.

前几天购入了一块佳明, 在进行几次运动后一如既往的想要折腾一下, 就有了写一个运动数据页的想法. 我的需求很简单, 有一个总体数据展示, 并且可以兼顾隐私性(数据太多不会读)和扩展性(万一以后想加点什么). 所以初步功能就定为了:

  1. 用一列数据来展示已经运动了多少
  2. 用一个表格来汇总所有运动的细节
  3. 添加一个”更新日期”方便观察运行情况

本文基于Python模拟Garmin connect登录以获得运动数据, 并存储为csv文件, 之后使用Astro基于csv文件进行前端页面的渲染. 其中自动化运行Python是通过Github Actions完成的. 你可以访问我的库来获得详情: A5yncX/my_running

1. 运行环境

由于佳明开启心电图功能后需要二次验证(邮箱验证码/短信验证码), 并且在短时间内多次的登录会触发cloudflare的风控, 所以本文方法是基于登录生成的token登录. 你需要如下包:

pip install garminconnect httpx cloudscraper

接下来, Fork我的仓库是最快的方法, 如果你并不想fork, 也可以点击Code -> Download zip到本地修改并继续运行.

2. 首次运行的准备

在项目目录运行:

Terminal window
python3 running/garminconnect_exporter.py --username YOUR_MAIL --password YOUR_PSWD

这一步的作用是在本地生成2个JSON格式的Token, 用来持久化登录, 有效期据github上的大家说是1年.

在你首次运行并接收到验证码后, 这两个文件会生成到位于你电脑的根目录的.garminconnect文件夹内, 文件的名字是oauth1_token.json/oauth2_token.json, 之后你运行一下命令就可以直接基于token进行登录了:

Terminal window
python3 running/garminconnect_exporter.py

首次运行后你会发现csv文件生成于src/components/activities.csv. 这就是后续使用Astro可以进行读取的文件了. 接下来的步骤需要你先推送到github.

3. (重要)(可选)Github Actions自动更新

如果你更倾向于手动更新, 那么恭喜你, 你可以略过这里跳转到部署那一步了.

本地运行garminconnect_exporter.py依托于本地的那2个token, 但是在Github上如果直接将这2个json的内容作为variable传入, 会出现换行符等问题导致没法正常使用, 所以需要用base64转换并存储, 接下来是详细步骤:

3.1 生成base64文件:

到本地.garminconnect文件夹的目录中, 你会发现那2个json文件, 分别运行:

Terminal window
base64 -i oauth1_token.json

Terminal window
base64 -i oauth2_token.json

分别复制这2个命令的输出, 并点击存储库的setting: Setting->Secrets and variables->Actions->New repository secrets 设置两个secret, 命名为GARMIN_OAUTH1_B64/GARMIN_OAUTH2_B64, 分别存储这2个命令的输出.

3.2 (可选)存储账号密码到secret

这一步的作用是方便没有邮箱/短信登录验证的人使用的, 以及如果后续token失效, 你的邮箱/短信会收到一次验证码, 可以起到提醒你更新token的作用. 依旧点击存储库的setting: Setting->Secrets and variables->Actions->New repository secrets, 设置两个secret, 命名为GARMIN_USERNAME/GARMIN_PASSWORD, 值就是你的登录账号密码.

3.3 试运行

删除github repo中之前生成的csv文件, 点击Actions手动运行一下, 查看是否正确生成.

4. 部署(Cloudflare)

侧边栏选择计算(Workers), 创建pages, 模板选择Astro, 默认的命令和路径不需要改变, 等待部署成功即可.

Random Read