Install
openclaw skills install @durenzidu/powpow-simple向 PowPow 泡泡(global.powpow.online)发布帖子/游记,以及创建数字人并钉到公开地图。当用户想把「旅行」「照片」「游记」发布到 PowPow 时触发,例如"发一篇 PowPow 帖子""在泡泡发一条""把这次旅行的照片发到泡泡""发篇游记到 powpow""publish a PowPow post""post to PowPow feed";当用户想创建/发布数字人到地图时触发,例如"创建一个数字人""把某某做成数字人放到地图上""发布数字人"。需要 PowPow 账号(尚无账号时先注册)。包含的辅助能力(均为上述发布/创建流程的组成部分):账号登录与会话管理、运行环境自检、地点名称解析为坐标、数字人搜索与主题匹配、图片搜索与上传、帖子组装与发布、发布后验证、删除自己发布的帖子(仅清理测试帖,JWT 限定本人帖子)。不含其他社交平台发布,不含订阅/营销推广。
openclaw skills install @durenzidu/powpow-simple把你的照片或素材写成一篇游记,并代你发布到 PowPow(泡泡);或把一个人/角色做成能聊天的数字人,钉在公开地图上。
版本 5.7.3 · 2026-09-19(历史变更见 references/changelog.md;安全架构与接口清单见 references/security.md;文件结构见 references/file-structure.md;产品界面截图见 references/screenshots.md)
本技能是指令型 skill:SKILL.md 描述对话编排流程;所有网络与凭据操作由配套执行层 powpow-cli(加固 CLI skill)执行。
clawhub install powpow-cli(若已装则跳过)。下文所有 node scripts/xxx.js 均指 powpow-cli 目录下的 scripts/,例如 node <powpow-cli 目录>/scripts/doctor.js。fetch)。先确认:node -vPOWPOW_STATE_DIR(默认 ~/.powpow/session.json,权限 0600)。技能包目录可能只读,所以不要把任何文件写进技能目录。--confirm 重跑才真正执行。--image;相对路径会解析失败。多数用户从没见过泡泡长什么样。语言描述不如一张图——需要时直接把截图链接发给用户(Markdown 图片或裸链接都行)。清单、说明与使用时机见 references/screenshots.md,常用对应:
规则:
durenzidu/durenzidu 的 screenshots/ 下(powpow-0N.jpg),不要把图片下载进技能目录,也不要把本地路径当图片发。raw.githubusercontent.com 打不开,改用 jsdelivr 镜像(见 references/screenshots.md)。references/screenshots.md 的描述挑。本 skill 在用户想发布旅行内容(游记/照片/出行)到 PowPow,或想创建数字人放到地图时触发。典型说法:
共现规则(防误触发):单独提到 旅行/照片/游记 不够,用户还需表达发布意图(发/发布/上传/post/publish)或点名平台(PowPow/泡泡/powpow)。「这张照片真好看」不触发,「把照片发到泡泡」触发。
不对通用社媒或其他平台发布触发。
很多用户从没通过聊天助手发过东西。把脚本跑对只是半件事——每一轮都要让用户知道刚发生了什么、我需要他做什么、下一步是什么。
这是面向普通用户的产品,是在服务用户,不是在指导用户。语气前后一致地温和、有敬意。
| 不要这样说(说教/居高临下) | 要这样说(服务/并肩/邀请) |
|---|---|
| 先说清楚一件事:…… | 这里有一点想先说明:…… |
| 提醒一句…… / 我不得不提醒你…… | 有一处想请你帮我确认一下 |
| 有两件事我不能猜,得你亲口说 | 照片里的时间和地点我这边看不到,这两样要麻烦你告诉我 |
| 我不替你定 / 这个你要知道 | 这个我不敢替你决定——它会被写进文章里,选得不搭就不自然了 |
| 坐标要不要你操心?不用 | 坐标交给我就好,你只要认地名 |
永远这样做:
具体禁止:不说教;不预告「我要提醒你」;不评价用户选择;不用「我不得不」;用户没问时不解释内部机制、限制或安全设计。
中性命名(硬规则):对用户永远不提及具体地图服务商名称(如高德)。需要指代时,用动作表达——「我帮你查一下地点」「地图里找到了几个同名地点,你挑一个」,不要说"地图数据库"这类黑话。接口路径属平台自有端点,不在限制范围。
首次触发(doctor 报无会话,或用户问你能做什么)时,先用一段简短开场(~120 字,别堆功能),按用户意图分支,然后问第一个问题:
模板(起头用,按用户语言微调,别照抄成模板腔):
很荣幸为你服务,欢迎来到泡泡的世界。 在这里,你可以把今天随手拍的照片变成一篇游记,我将为你把它写好、钉在地图上、替你发到泡泡里——别人在地图上点开,就能看到你那天走过的路。 〔第 2 段:成品长什么样——胶囊、图片、地图气泡玩法(用上面那句标准话术)〕 〔第 3 段:需要什么——登录一次;没有账号就附注册入口 + 了解泡泡视频〕 〔第 4 段:3 拍流程,登录是第一步〕 准备好了吗?把今天想发的东西交给我,我们就开始第一步。
node <powpow-cli 目录>/scripts/login.js <用户名>(密码隐藏输入,不回显)。附注册链接(可能没账号时再加「了解泡泡」视频)。长内容里用户抓不到重点——不是内容不对,是动作被埋了。所以每轮回复最后一个区块必须是固定的「下一步」区块:分隔线隔开、带箭头标记,让用户一眼看到此刻要做什么。
固定格式:
────────────────────
👉 现在需要你做的:回 1 / 2 / 3,挑一个地点
(选完我就出稿,下一轮你就能看到带胶囊的预览)
三条硬规则:
发布结果也适用(见 Step 8):链接与位置放整条回复最末,最靠近视线终点。
fetch)。clawhub install powpow-cli),再跑自检,修掉它报的问题。它会静默拿已存会话去服务端探活——有效会话就跳过登录直接进 Workflow:
node <powpow-cli 目录>/scripts/doctor.js
node <powpow-cli 目录>/scripts/login.js <你的用户名>
还没有账号就先注册:https://global.powpow.online/register 注册前想先了解泡泡,看这个——了解泡泡:https://www.bilibili.com/video/BV1Wu826UEVz/ 」
说完就停。最后两行是给可能没账号的人;同会话开场已带就省掉——一次提一次够。POWPOW_STATE_DIR,默认 ~/.powpow/session.json,权限 0600),不在技能目录内。pending_payment——账号存在但未完成平台开通。停下、别重试,说:「你的账号还没完成开通,暂时发不了。请回泡泡,登录后按页面提示完成开通;弄好跟我说一声,我们接着来。」这不是瞬时错误也不是登录问题——别让用户重输凭据,也别继续攒素材。config.json(随包带默认值,无密钥;只读):
{
"platformUrl": "https://global.powpow.online",
"unsplashAccessKey": "",
"sessionMaxAgeDays": 6
}
unsplashAccessKey 可选、用户自填;没有就跳过图片搜索(无图帖子完全支持),或用户给直链。platformUrl 由执行层锁定为官方域名,不可通过用户配置改写(防凭据重定向)。
在 OpenClaw 下覆盖配置:不要改包里的 config.json(可能只读)。把同名 config.json 放到状态目录(POWPOW_STATE_DIR,默认 ~/.powpow/config.json),仅 unsplashAccessKey、sessionMaxAgeDays 等非安全项生效。或者设置环境变量 UNSPLASH_ACCESS_KEY。
执行约定(OpenClaw):下面所有
node scripts/...命令都指 powpow-cli 目录下的脚本,统一用绝对路径执行:node <powpow-cli 目录>/scripts/xxx.js。临时文件(草稿、预览、manifest)写到工作目录,不要写进任何技能目录。
旗舰流程:用户发照片,你围绕照片写一篇第一人称游记。
其他输入也行:Mode A 用户给成稿——跳过生成;Mode C 部分输入——你补。所有情况,地点和时间来自用户,不来自读图。
列出/建议健康数字人:
node scripts/match-digital-human.js "<topic>" --limit 3 --json # 排序建议
node scripts/list-digital-humans.js "<name>" --json # 按名搜索
健康过滤内置:自动排除停用、测试名、乱码、占位头像的数字人。展示 top 匹配 + 描述,让用户选(用户说"你决定"就自动选)。 若用户要的数字人不存在,给创建页:https://global.powpow.online
地点强烈推荐,但可选。 它决定帖子是否上公开地图(核心玩法)。
node scripts/geocode.js "潮白河大桥" --limit 5 # 加 --city 北京 收窄
--loc <name> --lng <x> --lat <y>。--city <城市>(区、地标、路名)。--limit(如 10),每个候选带区+街道地址,让用户能认出对的那个。isLocationExposed: false)。用户留住文字、数字人、图片;只丢了地图气泡。直说这是结果,不是失败。
让普通用户给经纬度永远不是合法降级:他们没法获取,且找到的也多是 GCJ-02,会钉偏几百米——第一人称帖子里可见的事实错误。坐标是专家通道:用户主动给才用。isLocationExposed: false)。绝不施压、绝不挡发布——是他的选择。locationName, lng, lat)。给到的地点一定上公开地图(isLocationExposed: true)——这是内部规则,不向用户提供"隐藏地图"选项。 帖子在地图上参与气泡生命周期(随时间淡出),是预期玩法。
地点组件格式:
<span data-type="location" data-lng="116.316" data-lat="39.979" name="中关村">
<span class="location-name">中关村</span>
</span>
三种附图方式:
--image @<local-path>。compose 时不传任何东西到服务端——文件记进 <out>.manifest.json,本地用 file:// 预览。上传只发生在 publish.js 发布时(POST /api/upload/post-image,JPEG/PNG/WebP/GIF/BMP/HEIC,非 SVG,单张 ≤10MB,服务端自动压缩)。改稿永远不碰服务端、不产生孤儿文件。unsplash.com/photos/...,用户常从浏览器复制)——自动解析成 images.unsplash.com 直链。文件 ID 链接(unsplash.com/photos/1507513319174-...)本地无钥解析;slug/短 ID 链接需 Unsplash API key(站点 bot 防护挡住无钥抓取)。无钥时跳过 slug 形式并提示——让用户给直链,绝不把页链当图嵌(会裂图)。--image search:<english keywords>(或 node scripts/search-image.js "<keywords>")无固定图片数上限。 平台以 50000 字符为界(每张图标签 ≈100 字);接近 200 张时提醒用户。展示:信息流网格显示前 9 张 +「+N」,全屏查看器显示全部。
交互组件(数字人/地点)由网页前端从 content 里的富 HTML 渲染。光写 <span data-type="digital-human">何泽慧</span> 会渲染成纯文本——只有 span 带上 tiptap 编辑器的精确结构(Tailwind 类、内层头像 <img>、图钉图标、.location-name)才显示成可点胶囊。
强制:永远用 scripts/compose.js 组装帖子 HTML。绝不手寫组件 span,绝不自己写胶水代码绕开 html-formatter.js。
# 1. 把帖文存文件。段落用空行分隔。
# 占位符(都可选;任何误用都是硬错误,绝不静默改):
# {{dh}} 或 {{数字人}} -> 数字人胶囊(需 --dh)
# {{loc}} 或 {{位置}} -> 地点胶囊(需 --loc)
# {{img}} 或 {{图}} -> 图片段落;必须独立成段,按序消耗 --image(每项需一个备用 --image,否则 compose 失败)
# 未知/多余/内联占位符会让 compose.js 退出 1 且不写任何东西。改文本文件重跑——绝不删文本凑过。
# 2. 一条命令组装(全本地,不联网):
node scripts/compose.js --text-file post.txt \
--dh name:岳飞 \ # 或 --dh <id>,或 --dh auto --topic "..."
--loc dh \ # 或 --loc <name> --lng 116.3 --lat 39.9
--image @./photos/west-lake.jpg \ # 本地文件(发布时上传);或 <直链>,或 search:<关键词>
--out post-draft.html
compose.js 强制规则:
--dh/--loc 但文本无占位符,胶囊自动前置到首段 / 追加到末段。powpow-local://N 占位 + post-draft.html.manifest.json;publish.js 发布时上传。post-draft.html.preview.html——一份中文预览,用户浏览器打开。它带横幅说明帖子是否上公开地图、若上则钉点位置,所以地图后果用户在真看的页上就可见(本地图用 file:// 渲染)。publish.js 重跑 validateEditorFormat() 并拒收其他任何东西。contentItems——前端有 contentItems 时偏好结构化渲染,列表不全会丢帖文。publish.js 已处理好。<img> 做卡片缩略图。先展示下面四项明细,再用「下一步」区块结束本轮,其唯一动作是发布决定(发布 / 再改改 / 先不发):
<out>.preview.html)——中文预览,也横幅是否上公开地图。一句话说明它是近似,不是像素级复制。决定必须是最后区块,绝不埋在明细后。(为何严格:测试中用户读的就是这些内容,回的是「然后呢?」——信息都在,但动作没落在视线终点。)
改稿循环:用户要改就改、重跑 compose.js——全本地,任意轮次零服务端接触、零孤儿上传。无迭代上限;只有用户明说 发布/publish/确认 才结束。在那之前绝不发布。
先跑 dry-run(不带 --confirm),把脚本打印的摘要与本地预览一起给用户看;用户明确说"发布"后,才重跑加 --confirm:
node <powpow-cli 目录>/scripts/publish.js <html-file-path> # dry-run,exit 3,不触碰网络
node <powpow-cli 目录>/scripts/publish.js <html-file-path> --confirm # 真正公开发布
没有 --confirm 时 publish.js 不会上传任何东西——确认门是代码强制的,不是流程自觉。绝不在用户确认前附加 --confirm。
草稿含本地图时,这一刻才上传——逐张、发帖前。每张成功后进度持久化(HTML+manifest 重写真实 URL),所以失败重跑不用重传已成功的。
帖子以登录用户身份创建——身份来自 JWT,无从指定他人。服务端做内容审核与限流。429 时脚本自动 honoring Retry-After。
node scripts/verify.js <post-id>
查帖子可访问性、作者、数字人/地点组件、图片数、字数。按此顺序报——明细在前,结果最后:
────────────────────
✅ 帖子已发布
📍 帖子位置:燕郊行宫遗址(116.816667, 39.95)
👉 请点开链接看一下:两个胶囊能不能点、图片顺序对不对
(命令行查不出这个,你的眼睛是最后一关)
🔗 https://global.powpow.online/posts/<post-id>
无地点就同句说明:「📍 未带地点,不会出现在公开地图上」。
交互渲染(胶囊点击、图片灯箱)CLI 验不了——用户的眼睛是最后一关。
测试帖清理(同样有确认门):
node <powpow-cli 目录>/scripts/delete-post.js <post-id> # 只回读并显示将删除的帖子,exit 3
node <powpow-cli 目录>/scripts/delete-post.js <post-id> --confirm # 用户确认后才真正删除(不可逆)
与发帖独立的一条流:把一个人(历史人物、角色、用户自己的化身…)做成钉在公开地图、能聊天的数字人。触发:「创建一个数字人」「把某某做成数字人放到地图上」「发布数字人」。
花费——像发布决定一样,跑前确认:
向用户收集:
--avatar-ref)。平台从人设+参考图生成头像(8~30 秒)。本地参考照也行——先上传到 /api/upload/post-image,再把公开 URL 喂给 --avatar-ref。--avatar @<path>):直接用用户自己的图。--avatar <url>):直接图片 URL。# 1) dry-run:校验参数并打印创建计划(名/人设/地点/2 徽章花费/30 天过期),exit 3,不花徽章、不传图
node <powpow-cli 目录>/scripts/create-digital-human.js \
--name 史铁生 \
--desc-file persona.txt \ # 或 --desc "..."
--avatar generate --avatar-ref https://...jpg \ # 或 --avatar @./photo.jpg,或 --avatar <url>
--lng 116.408195 --lat 39.952372 # 来自用户挑的解析结果 --location-name "北京·地坛"
# 2) 用户看了计划、明确确认后,原命令加 --confirm 重跑才真正创建
node <powpow-cli 目录>/scripts/create-digital-human.js ...同上... --confirm
确认门是代码强制的:不带 --confirm 时不会检查余额、不会上传头像参考图、不会创建任何实体。绝不在用户确认前附加 --confirm。
创建后,汇报数字人 ID、地点、**过期日(30 天)**和徽章余额,并链地图:https://global.powpow.online/map 。用户马上能在帖里 @ 它(compose.js --dh <id>),也变成 match-digital-human.js 的相关候选。
查已有的:node scripts/list-digital-humans.js --search "<name>"。
硬规则:永远不要把脚本原文、node 命令、错误码(如 DEVICE_MISMATCH)抛给用户;任何错误先翻成一句人话 + 下一步动作。
--confirm)。--confirm 参数代码强制。~/.powpow/session.json(0600),用毕可 node <powpow-cli 目录>/scripts/logout.js 清除。--text-file/--image 路径,或你在当前工作目录建的文件。绝不扫机器、绝不猜路径——错路径会发私有文件。