OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  runstr-fitness:让你的 AI 智能体访问你的健康与健身数据

runstr-fitness:让你的 AI 智能体访问你的健康与健身数据

 
  redis ·  2026-02-05 09:53:49 · 3 次点击  · 0 条评论  

名称: runstr-fitness
描述: 为你的 AI 助手提供来自 RUNSTR 的健康与健身数据访问权限。可从 Nostr 获取锻炼记录、习惯、日记条目、心情、步数等信息。当用户询问其锻炼情况、健身历史、健康习惯、心情追踪,或希望基于真实数据获得 AI 健身指导时使用。
元数据: {"openclaw":{"emoji":"\ud83c\udfc3","requires":{"bins":["nak"]},"install":[{"id":"go","kind":"go","package":"github.com/fiatjaf/nak@latest","bins":["nak"],"label":"通过 Go 安装 nak"}]}}


RUNSTR 健身技能

让你的 AI 助手能够访问你真实的健康与健身数据。RUNSTR 是一款免费的健身应用,可以追踪锻炼、习惯、日记、心情和步数,并将加密备份存储在 Nostr 协议上。此技能让你的机器人能够读取这些数据,从而提供健身指导、习惯监督、心情追踪和健康洞察。

你的机器人可以访问:
- 锻炼历史(跑步、步行、骑行、徒步、力量训练、瑜伽等)
- 每日习惯与连续打卡记录(如戒烟、每日冥想等)
- 附带心情和能量等级的日记条目
- 每日步数
- 你所支持的慈善机构及奖励分配方式

设置:将你的数据提供给机器人

如果你已是 RUNSTR 用户并已启用备份,请直接跳至第 3 步。

1. 下载 RUNSTR(如果尚未安装)

  • iOS: 在 App Store 搜索 "RUNSTR"
  • Android: 可在 Zapstore 获取或直接下载 APK
  • GitHub: https://github.com/RUNSTR (开源)

RUNSTR 完全免费。锻炼即可赚取比特币(聪)。

2. 使用应用

  • 创建或导入一个 Nostr 身份(应用会为你生成)
  • 记录锻炼、打卡习惯、撰写日记
  • 进入 设置 > 备份,点击 备份至 Nostr

此操作会加密你所有的健身数据并发布到 Nostr 中继。只有你(使用你的私钥)才能解密读取。

3. 向机器人提供你的 nsec

你的 nsec 是你的 Nostr 私钥。在 RUNSTR 的 设置 > 密钥 中(或你的 Nostr 密钥管理器中)找到它。

告诉你的机器人: "这是我的 RUNSTR nsec: nsec1..."

你的机器人将使用此 nsec 从 Nostr 解密你加密的健身备份。nsec 不会被存储、记录或传输——仅在你当前会话的解密步骤中使用。

为什么是 nsec 而不是 npub? 你的健身数据是加密的。公钥(npub)只能看到旧的公开锻炼帖子(如果有的话)。而解密你的习惯、日记、心情、步数和当前锻炼历史需要私钥(nsec)。

隐私提示: 如果你希望为健身数据使用一个独立的身份,可以在 RUNSTR 中创建一个新的 Nostr 账户。你的健身 nsec 不必是你的主要 Nostr 身份。

4. 保持备份为最新状态

机器人只能看到你最后一次备份的内容。在一周的新锻炼后,请进入 RUNSTR 的 设置 > 备份 并再次点击备份,以便将最新数据同步到 Nostr。


给 AI 助手:如何获取 RUNSTR 数据

以下所有内容均为给 AI 助手的指令,而非给用户的。

前提条件

必须安装 nak (Nostr Army Knife):

go install github.com/fiatjaf/nak@latest

中继

始终查询以下四个中继(RUNSTR 默认设置):

wss://relay.damus.io wss://relay.primal.net wss://nos.lol wss://relay.nostr.band

步骤 1:解码 nsec

hex_sk=$(nak decode nsec1...)
hex_pk=$(nak key public $hex_sk)

步骤 2:获取用户资料(Kind 0)

nak req -k 0 -a $hex_pk -l 1 \
  wss://relay.damus.io wss://nos.lol | \
  jq -r '.content | fromjson | {name, about, lud16, picture}'

步骤 3:获取加密备份(Kind 30078)

这是主要数据源

nak req -k 30078 -a $hex_pk -t d=runstr-workout-backup -l 1 \
  wss://relay.damus.io wss://relay.primal.net wss://nos.lol wss://relay.nostr.band

如果未找到备份: 告知用户:"在 Nostr 上未找到备份。请在手机上打开 RUNSTR,进入 设置 > 备份,创建一个备份。然后重试。"

如果找到备份但 exportedAt 时间过旧: 提醒用户备份已过期,可能缺少近期数据。建议他们在应用中重新备份。

解密备份

备份采用 NIP-44 自加密并经过 gzip 压缩。

方法 1:使用 nak

content=$(nak req -k 30078 -a $hex_pk -t d=runstr-workout-backup -l 1 \
  wss://relay.damus.io wss://nos.lol | jq -r '.content')

# 解密 (NIP-44 自解密:用户到自己的公钥)
decrypted=$(echo "$content" | nak encrypt --sec $hex_sk $hex_pk --decrypt)

# 解压缩 (先检查是否存在 ["compression", "gzip"] 标签)
echo "$decrypted" | base64 -d | gunzip | jq .

方法 2:Node.js 备用方案

// /tmp/decrypt-runstr.mjs — 运行方式:node /tmp/decrypt-runstr.mjs <hex_sk> '<content>'
import { gunzipSync } from 'zlib';
import NDK, { NDKPrivateKeySigner } from '@nostr-dev-kit/ndk';

const signer = new NDKPrivateKeySigner(process.argv[2]);
const user = await signer.user();
const decrypted = await signer.decrypt(user, process.argv[3]);

try {
  console.log(gunzipSync(Buffer.from(decrypted, 'base64')).toString());
} catch {
  console.log(decrypted);
}

备份数据结构

{
  "version": 1,
  "exportedAt": "2025-01-15T10:30:00Z",
  "appVersion": "1.6.5",
  "workouts": [
    {
      "id": "uuid",
      "type": "running",
      "startTime": "2025-01-15T07:00:00Z",
      "endTime": "2025-01-15T07:35:00Z",
      "duration": 2100,
      "distance": 5200,
      "calories": 312
    }
  ],
  "habits": [
    {
      "id": "id",
      "name": "No Smoking",
      "type": "abstinence",
      "currentStreak": 45,
      "longestStreak": 45,
      "checkIns": ["2025-01-15", "2025-01-14"]
    }
  ],
  "journal": [
    {
      "id": "uuid",
      "date": "2025-01-15",
      "content": "Great morning run today.",
      "mood": "great",
      "energy": 4,
      "tags": ["morning", "outdoors"]
    }
  ],
  "stepHistory": [
    { "date": "2025-01-15", "steps": 12450, "source": "healthkit" }
  ],
  "preferences": {
    "unitSystem": "imperial",
    "selectedCharity": "hrf"
  }
}

字段参考:
- workouts[].type: running, walking, cycling, hiking, strength, meditation, yoga, diet, swimming, rowing
- workouts[].duration: 秒
- workouts[].distance: 米
- habits[].type: "abstinence" (戒除某事) 或 "positive" (建立某事)
- journal[].mood: great, good, neutral, low, bad
- journal[].energy: 1-5 等级
- stepHistory[].source: healthkit, health_connect, native

步骤 4:检查旧的公开锻炼记录(Kind 1301)

较老的用户可能有公开的锻炼事件。始终检查:

nak req -k 1301 -a $hex_pk -l 50 \
  wss://relay.damus.io wss://relay.primal.net wss://nos.lol wss://relay.nostr.band

如果找到,解析 tags 数组:

标签 示例
exercise ["exercise", "running"]
distance ["distance", "5.2", "km"]
duration ["duration", "00:30:45"]
calories ["calories", "312"]
avg_pace ["avg_pace", "05:39", "min/km"]
steps ["steps", "8432"]
team ["team", "hrf"]

与备份数据合并。通过匹配锻炼开始时间或 ID 进行去重。

步骤 5:分析与呈现

锻炼摘要: 总锻炼次数、按活动类型细分、距离/时长/卡路里、频率、个人最佳记录。

趋势: 频率变化、配速提升、间隔时间、一周中的活跃日。

习惯: 当前连续打卡天数、最长连续打卡天数、坚持率。

日记与心情: 心情趋势、平均能量水平、锻炼与心情的关联性。

步数: 日均步数、周总步数、趋势。

慈善: 支持的团队/慈善机构、奖励分配方式(用户 vs 慈善机构)。

步骤 6:将健康摘要存入记忆

保存一份结构化的摘要供后续对话使用,避免每次重新查询:

# 健康与健身摘要
最后更新:YYYY-MM-DD
数据源:RUNSTR (Nostr 加密备份)
用户:<姓名或 npub>

## 近期活动 (最近 30 天)
- 总锻炼次数:X
- 跑步:X 次,Y 公里,平均配速 Z/公里
- 步行:X 次,Y 公里
- 骑行:X 次,Y 公里

## 频率
- 平均每周 X 次锻炼
- 最活跃日:[星期几]

## 习惯
- [习惯名]:X 天连续打卡

## 心情与能量
- 平均心情:[等级],平均能量:X/5

## 步数
- 平均:X,XXX 步/天

## 洞察
- [发现的模式和观察结果]

指导模式

获取数据后,你可以:
- 根据历史和目标推荐锻炼计划
- 基于训练负荷建议休息日
- 检查习惯打卡情况
- 关联心情与活动
- 追踪目标(如"本周跑 20 公里")
- 根据常规锻炼计划进行提醒

故障排除

问题 解决方案
未找到备份 用户需要打开 RUNSTR > 设置 > 备份
备份已过期 用户需要在应用中重新备份
解密失败 nsec 错误,或尝试方法 2 (Node.js)
nak 未安装 go install github.com/fiatjaf/nak@latest
未安装 Go 使用方法 2 (Node.js with NDK)
workouts 数组为空 用户尚未记录任何锻炼
无习惯/日记数据 用户尚未在应用中使用这些功能

关于 RUNSTR

RUNSTR 是一款面向比特币/Nostr 社区的免费开源健身应用。记录锻炼、通过运动赚取比特币(聪)、支持慈善机构并参与健身竞赛。你的数据完全属于你——存储在设备上,并加密备份到 Nostr。

  • 官网:https://runstr.app
  • GitHub:https://github.com/RUNSTR
  • 奖励:通过 Lightning 地址,每次日常锻炼可获得 50 聪
  • PPQ.AI 积分:通过锻炼赚取 AI 积分
3 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor