名称: 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"}]}}
让你的 AI 助手能够访问你真实的健康与健身数据。RUNSTR 是一款免费的健身应用,可以追踪锻炼、习惯、日记、心情和步数,并将加密备份存储在 Nostr 协议上。此技能让你的机器人能够读取这些数据,从而提供健身指导、习惯监督、心情追踪和健康洞察。
你的机器人可以访问:
- 锻炼历史(跑步、步行、骑行、徒步、力量训练、瑜伽等)
- 每日习惯与连续打卡记录(如戒烟、每日冥想等)
- 附带心情和能量等级的日记条目
- 每日步数
- 你所支持的慈善机构及奖励分配方式
如果你已是 RUNSTR 用户并已启用备份,请直接跳至第 3 步。
RUNSTR 完全免费。锻炼即可赚取比特币(聪)。
此操作会加密你所有的健身数据并发布到 Nostr 中继。只有你(使用你的私钥)才能解密读取。
你的 nsec 是你的 Nostr 私钥。在 RUNSTR 的 设置 > 密钥 中(或你的 Nostr 密钥管理器中)找到它。
告诉你的机器人: "这是我的 RUNSTR nsec: nsec1..."
你的机器人将使用此 nsec 从 Nostr 解密你加密的健身备份。nsec 不会被存储、记录或传输——仅在你当前会话的解密步骤中使用。
为什么是 nsec 而不是 npub? 你的健身数据是加密的。公钥(npub)只能看到旧的公开锻炼帖子(如果有的话)。而解密你的习惯、日记、心情、步数和当前锻炼历史需要私钥(nsec)。
隐私提示: 如果你希望为健身数据使用一个独立的身份,可以在 RUNSTR 中创建一个新的 Nostr 账户。你的健身 nsec 不必是你的主要 Nostr 身份。
机器人只能看到你最后一次备份的内容。在一周的新锻炼后,请进入 RUNSTR 的 设置 > 备份 并再次点击备份,以便将最新数据同步到 Nostr。
以下所有内容均为给 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
hex_sk=$(nak decode nsec1...)
hex_pk=$(nak key public $hex_sk)
nak req -k 0 -a $hex_pk -l 1 \
wss://relay.damus.io wss://nos.lol | \
jq -r '.content | fromjson | {name, about, lud16, picture}'
这是主要数据源。
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
较老的用户可能有公开的锻炼事件。始终检查:
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 进行去重。
锻炼摘要: 总锻炼次数、按活动类型细分、距离/时长/卡路里、频率、个人最佳记录。
趋势: 频率变化、配速提升、间隔时间、一周中的活跃日。
习惯: 当前连续打卡天数、最长连续打卡天数、坚持率。
日记与心情: 心情趋势、平均能量水平、锻炼与心情的关联性。
步数: 日均步数、周总步数、趋势。
慈善: 支持的团队/慈善机构、奖励分配方式(用户 vs 慈善机构)。
保存一份结构化的摘要供后续对话使用,避免每次重新查询:
# 健康与健身摘要
最后更新: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 是一款面向比特币/Nostr 社区的免费开源健身应用。记录锻炼、通过运动赚取比特币(聪)、支持慈善机构并参与健身竞赛。你的数据完全属于你——存储在设备上,并加密备份到 Nostr。