你的 Apple Watch 每隔几分钟记录一次心率,每一步都记,整晚的睡眠阶段也记。这些数据现在就躺在你的 iPhone 里。
但你想把它拿出来——自动地、每天一次,导进你自己能控制的地方:一张表格、一个仪表盘、一个 AI 助手。你会发现没有路。
![]()
没有网页 API。HealthKit 只在 iOS 应用内部工作。能导出健康数据的应用大多要付费或订阅。唯一能找到的一篇用快捷指令实现的教程,还锁在付费墙后面。
于是有人用手机上现成的东西把它搭了出来:一个免费快捷指令 + 一个免费 Cloudflare Worker。整套流程现在就在他的手机上跑着。下面就是完整管线、代码,以及四个让它静默失败的坑——省得你对着空数据库发呆,想不通为什么。
先想清楚:这是敏感数据
健康数据很敏感。在这套方案里,它存在你的 Cloudflare 账号上,由一个你自己设定的密钥令牌保护。不要把 Worker 的 URL 或令牌发到任何地方,也不要传你不需要的数据类型。
搭建从服务端开始,这样快捷指令才有地方可发,你也能逐步测试每一环。你需要一个免费的 Cloudflare 账号,以及电脑上的 Node.js。
第一步,创建项目并登录:
mkdir health-receiver && cd health-receivernpx wrangler login(会打开一次浏览器)npx wrangler d1 create health(会打印一个 database_id,复制它)
第二步,写 wrangler.toml:
name = "health-receiver"main = "src/index.js"compatibility_date = "2026-10-01"[[d1_databases]]binding = "DB"database_name = "health"database_id = "PASTE-THE-ID-FROM-STEP-1"第三步,写 schema.sql 建表:
CREATE TABLE IF NOT EXISTS samples( metric TEXT NOT NULL, ts INTEGER NOT NULL, end_ts INTEGER, value REAL NOT NULL, stage TEXT NOT NULL DEFAULT '', UNIQUE(metric, ts, value, stage));那条 UNIQUE 行是整个项目里最关键的一行。记住它,第二个坑要用到。
Worker 里到底做了什么
Worker 的代码负责接收和聚合。它先校验请求头里的 x-health-token 是否等于环境变量里的 HEALTH_TOKEN,不匹配直接返回 401。
收到 POST 到 /health 的请求后,它把文本按行拆开、按竖线分列。步数和心率走同一套解析:时间戳转毫秒,数值转数字,任何一个转不动就记进 skipped 列表跳过。
睡眠单独处理,因为它需要开始和结束两个时间点。如果只有开始没有结束,这条会被跳过——没有结束时间就没法知道睡了多久。
写入用 INSERT OR IGNORE,配合那条 UNIQUE 约束,重复发送同样的样本不会出错。重叠的数据等于免费补录。
另一个接口 /days 负责聚合。它把数据按本地日期分组:步数累加,心率收集后算出平均、最小、最大,睡眠则把非清醒、非卧床的阶段时长加起来,归到醒来的那一天。
第四步,部署:
npx wrangler d1 execute health --remote --file schema.sqlnpx wrangler secret put HEALTH_TOKEN # 输入一个长随机字符串,比如从密码管理器里生成npx wrangler deploy # 会打印 https://health-receiver..workers.dev第五步,先在电脑上测,再碰手机:
curl -X POST "https://health-receiver..workers.dev/health" \ -H "x-health-token: YOUR-TOKEN" -H "content-type: ap四个让它静默失败的坑
这套流程的难点不在写代码,而在那些不报错、只是默默什么都不发生的地方。作者踩了四个,所以你能跳过。
第一个坑和时区有关。代码里有一个 OFFSET_MIN 常量,代表你的 UTC 偏移分钟数。印度标准时间是 +5:30,也就是 33
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.