name: whoop description: WHOOP中心 - OAuth认证及获取WHOOP数据(睡眠、恢复、压力、锻炼)的脚本。当用户询问睡眠、恢复分数、HRV、压力或锻炼数据时使用。 version: 1.0.2 metadata: clawdbot: emoji: “🏋️” requires: bins: [“node”, “openssl”]
WHOOP中心
通过v2 API访问WHOOP的睡眠、恢复、压力和锻炼数据。
快速命令
# 1) 一次性设置(写入~/.clawdbot/whoop/credentials.json)
node src/setup.js
# 2) 推荐:通过Postman获取令牌(见认证部分),然后验证
node src/verify.js
node src/verify.js --refresh
# 提示友好的快照(包含最近一次锻炼)
node src/today.js
# 每日摘要(所有指标)
node src/summary.js
# 单个指标
node src/recovery.js
node src/sleep.js
node src/strain.js
node src/workouts.js
# 批量导入到~/clawd/health/logs/whoop/*
node src/import-historical.js
可用数据
| 指标 | 数据点 |
|---|---|
| 恢复 | 分数(0-100%)、HRV、静息心率、血氧饱和度、皮肤温度 |
| 睡眠 | 时长、阶段(REM/深睡/浅睡)、效率、表现 |
| 压力 | 每日压力值(0-21)、卡路里、平均/最大心率 |
| 锻炼 | 活动类型、时长、压力值、卡路里、心率 |
恢复分数指南
- 💚 67-100% 绿色 - 准备就绪
- 💛 34-66% 黄色 - 中等准备度
- ❤️ 0-33% 红色 - 专注于恢复
设置
0. 要求
- Node.js 18+(此仓库使用ESM)
openssl(仅在使用https://localhost的可选auth.js流程时需要;Postman认证不需要)
1. 创建WHOOP开发者应用
- 访问 https://developer.whoop.com/
- 使用WHOOP账户登录
- 创建新应用
- 添加以下重定向URI(精确匹配;无额外尾部斜杠):
- Postman浏览器回调(推荐认证路径):
https://oauth.pstmn.io/v1/browser-callback - 可选本地回调(仅由
auth.js使用):https://localhost:3000/callback
- Postman浏览器回调(推荐认证路径):
- 复制客户端ID和客户端密钥
团队注意:此技能不附带任何客户端凭据。每个用户可以创建自己的WHOOP应用,
或者(如果彼此信任)团队可以共享一个应用的client_id/client_secret,并允许多个WHOOP账户授权它。
2. 保存凭据(推荐:交互式)
运行:
node src/setup.js
这将写入~/.clawdbot/whoop/credentials.json(如果您粘贴令牌,还会写入token.json)。
3. 认证(推荐:Postman)
Postman是许多账户最可靠的引导方式,因为WHOOP可能会阻止类似浏览器的流量访问OAuth端点(或根据标头行为不同)。
Postman清单(不要跳过这些):
- WHOOP仪表板重定向URI包括:
https://oauth.pstmn.io/v1/browser-callback
- Postman OAuth设置:
- 范围包括
offline(否则您将不会获得refresh_token) - 客户端认证为在请求体中发送客户端凭据(
client_secret_post)
- 范围包括
- 在WHOOP仪表板中,确保您注册了Postman回调重定向URI:
https://oauth.pstmn.io/v1/browser-callback
- 在Postman中:
- 创建环境并设置变量:
ClientId= 您的WHOOP客户端IDClientSecret= 您的WHOOP客户端密钥
- 打开WHOOP API集合(或任何请求),然后打开认证选项卡:
- 类型:OAuth 2.0
- 添加认证数据到:请求头
- 授权类型:授权码
- 回调URL:勾选使用浏览器授权
- 认证URL:
https://api.prod.whoop.com/oauth/oauth2/auth - 访问令牌URL:
https://api.prod.whoop.com/oauth/oauth2/token - 客户端ID:
{{ClientId}} - 客户端密钥:
{{ClientSecret}} - 范围(空格分隔):包括
offline以及您需要的任何读取范围,例如:offline read:profile read:sleep read:recovery read:workout read:cycles read:body_measurement - 状态:任意8+字符(例如
loomingState) - 客户端认证:在请求体中发送客户端凭据
-
点击“获取新访问令牌”,登录WHOOP,然后点击“授权”。
-
在Postman的“管理访问令牌”模态框中:
- 点击“使用令牌”(以便请求工作)
- 重要:复制并保存两者:
access_tokenrefresh_tokenPostman通常不会为您保留刷新令牌。
- 将令牌保存到
~/.clawdbot/whoop/token.json:
- 使用
token.example.json作为模板 - 设置:
obtained_at为当前时间(毫秒)redirect_uri为:https://oauth.pstmn.io/v1/browser-callback
- 验证(并测试刷新):
node src/verify.js
node src/verify.js --refresh
4. 可选:通过auth.js认证(某些账户可能失败)
如果您更喜欢完全本地的OAuth循环(并且WHOOP允许),可以使用auth.js。
前提:在WHOOP仪表板中添加此重定向URI:
https://localhost:3000/callback
运行:
WHOOP_REDIRECT_URI='https://localhost:3000/callback' node src/auth.js
如果需要在手机/远程设备上操作:
WHOOP_REDIRECT_URI='https://localhost:3000/callback' node src/auth.js --manual
注意:对于本地HTTPS,脚本会生成自签名证书,您的浏览器将显示TLS警告。 您必须跳过警告,以便重定向可以完成。
4. 验证是否正常工作
node src/verify.js
node src/summary.js
故障排除
浏览器在登录页面之前显示NotAuthorizedException
这是WHOOP端阻止浏览器User-Agent访问api.prod.whoop.com OAuth端点。
- 使用更新的
node src/auth.js,它会引导登录URL并将您的浏览器直接发送到id.whoop.com。 - 如果仍然看到,请尝试
node src/auth.js --manual并打开打印的URL。
“redirect_uri未列入白名单”
- 访问 https://developer.whoop.com/
- 编辑您的应用
- 确保此确切URI在重定向URI中:
如果您在本地使用https://oauth.pstmn.io/v1/browser-callbackauth.js,还需添加:https://localhost:3000/callback - 保存并重试
令牌过期
令牌会在需要时自动刷新(无需cron)。如果问题持续:
rm ~/.clawdbot/whoop/token.json
node src/auth.js
“授权无效”
这通常意味着您的访问令牌已过期/失效(常见于您在其他地方重新认证或刷新令牌时;WHOOP刷新令牌会轮换)。
- 重新运行
node src/auth.js,或 - 从Postman复制最新的
access_token+refresh_token到~/.clawdbot/whoop/token.json并更新obtained_at。
从手机/远程设备认证
使用手动模式:
node src/auth.js --manual
在任何设备上打开URL,授权,然后从回调URL复制代码。
error=request_forbidden / “请求不被允许”
这是WHOOP在登录/同意后拒绝授权请求。常见原因:
- 重定向URI策略(WHOOP文档仅提及
https://或whoop://重定向URI) - 应用/账户限制(会员/批准/测试用户限制)
- 范围限制(尝试请求更少的范围)
如果您怀疑是重定向URI策略,请使用HTTPS隧道:
# 1) 获取一个转发到localhost:3000的公共HTTPS URL(示例)
ngrok http 3000
# 2) 将ngrok HTTPS URL + /callback添加到WHOOP仪表板重定向URI,然后运行:
WHOOP_REDIRECT_URI=https://YOUR-NGROK-DOMAIN.ngrok-free.app/callback node src/auth.js
如果您怀疑是范围限制,请尝试最小范围集:
WHOOP_SCOPES="read:profile" node src/auth.js
如果您的WHOOP重定向URL是https://localhost:3000/callback
这会改变本地回调服务器的运行方式:必须是HTTPS(不是HTTP)。
脚本支持此功能。运行:
WHOOP_REDIRECT_URI=https://localhost:3000/callback node src/auth.js
它将在本地生成自签名证书,您的浏览器可能会显示https://localhost的警告。
跳过警告,以便重定向可以完成。
JSON输出(用于工具)
这些命令支持:
--json(单个JSON块)--jsonl(每行一个JSON对象;适用于管道)--limit N(在支持的情况下)- 时间过滤器(在支持的情况下):
--days N、--since 7d/12h、--start ISO、--end ISO
node src/summary.js --json
node src/recovery.js --json --limit 1
node src/sleep.js --json --limit 1
node src/strain.js --json --limit 1
node src/workouts.js --json --limit 1
# 带过滤器的示例
node src/sleep.js --json --days 7
node src/workouts.js --jsonl --since 30d
node src/recovery.js --json --start 2026-01-01T00:00:00Z --end 2026-02-01T00:00:00Z
API注意事项
- 使用WHOOP开发者API v2
- OAuth 2.0认证,带刷新令牌
- 范围:offline、read:recovery、read:sleep、read:workout、read:cycles、read:profile
- 令牌过期时自动刷新