WHOOP健康数据集成工具Skill whoop

WHOOP健康数据集成工具是一个通过OAuth 2.0认证连接WHOOP API的脚本集合,用于自动化获取和分析用户的睡眠质量、恢复分数、心率变异性(HRV)、每日压力值和锻炼数据。该工具支持批量数据导入、JSON格式输出和自定义时间范围查询,适用于健康追踪、量化自我、运动表现分析和数据可视化场景。关键词:WHOOP API,健康数据,睡眠分析,恢复分数,HRV,压力值,锻炼数据,OAuth认证,数据集成,量化健康。

数据分析 0 次安装 8 次浏览 更新于 2/24/2026

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开发者应用

  1. 访问 https://developer.whoop.com/
  2. 使用WHOOP账户登录
  3. 创建新应用
  4. 添加以下重定向URI(精确匹配;无额外尾部斜杠):
    • Postman浏览器回调(推荐认证路径):
      https://oauth.pstmn.io/v1/browser-callback
      
    • 可选本地回调(仅由auth.js使用):
      https://localhost:3000/callback
      
    您可以同时保留两者。
  5. 复制客户端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
  1. 在WHOOP仪表板中,确保您注册了Postman回调重定向URI:
https://oauth.pstmn.io/v1/browser-callback
  1. 在Postman中:
  • 创建环境并设置变量:
    • ClientId = 您的WHOOP客户端ID
    • ClientSecret = 您的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
    • 客户端认证:在请求体中发送客户端凭据
  1. 点击“获取新访问令牌”,登录WHOOP,然后点击“授权”。

  2. 在Postman的“管理访问令牌”模态框中:

  • 点击“使用令牌”(以便请求工作)
  • 重要:复制并保存两者:
    • access_token
    • refresh_token Postman通常不会为您保留刷新令牌。
  1. 将令牌保存到~/.clawdbot/whoop/token.json
  • 使用token.example.json作为模板
  • 设置:
    • obtained_at为当前时间(毫秒)
    • redirect_uri为:
      https://oauth.pstmn.io/v1/browser-callback
      
  1. 验证(并测试刷新):
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未列入白名单”

  1. 访问 https://developer.whoop.com/
  2. 编辑您的应用
  3. 确保此确切URI在重定向URI中:
    https://oauth.pstmn.io/v1/browser-callback
    
    如果您在本地使用auth.js,还需添加:
    https://localhost:3000/callback
    
  4. 保存并重试

令牌过期

令牌会在需要时自动刷新(无需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
  • 令牌过期时自动刷新