Social Poster Hardened
通过 VibePost API 发布内容至社交媒体,支持 Twitter/X 等平台。
基于AI与浏览器自动化,自动生成小红书风格图片。
openclaw skills install @katherine0325/visnote-image-creator命令、参数、文件名以原文为准
此技能通过结合 AI 智能与 Playwright 驱动的浏览器自动化,实现小红书风格图片的自动生成。AI 会分析用户请求,从实时模板注册表中选择合适的模板,并协调整个图片生成流程。
在以下情况使用该技能:
在处理任何用户请求前,请执行以下检查:
cat config.jsonapikey 字段为空:立即停止,并向用户提示: ⚠️ 需要先在 config.json 中设置 apikey 才能使用图片生成功能。
请按以下步骤设置:
1. 访问 VisNote 个人主页获取 API Key:https://vis-note.netlify.app/profile,复制 API Key
2. 复制项目根目录的 example-config.json 文件,并重命名为 config.json
3. 将复制的 API Key 填入 config.json 的 "your_api_key_here" 位置
设置完成后,再次尝试生成图片。apikey 已设置:进入下一步从用户请求中提取以下信息:
从 API 获取模板列表:
GET /api/open/templates缓存策略(重要):
首次请求(本对话中): 必须从 API 获取最新的模板列表。
同一对话中的后续请求:
缓存复用示例:
缓存失效示例(需重新获取):
可选查询参数:
keyword:按模板名称/描述/标签搜索(如 ?keyword=封面,?keyword=正文)curl 示例:
# 获取所有模板
curl "https://vis-note.netlify.app/api/open/templates"
# 搜索封面类模板
curl "https://vis-note.netlify.app/api/open/templates?keyword=封面"响应结构:
{
"success": true,
"data": [
{
"id": "yellow",
"name": "高对比大字报",
"desc": "适合:避坑/干货/教程",
"image": "https://...",
"tags": ["封面"],
"value": {
"title": "示例标题",
"subtitle": "示例副标题",
"tag": "标签",
"color": "#EAB308"
}
}
]
}模板对象字段说明:
id:唯一标识符(用于 --template 参数)name:模板显示名称desc:用途说明(如“适合:避坑/干货/教程”)tags:分类标签(免费, VIP, 封面, 图片)value:模板默认数据结构,包含所有可用字段(用于 --data 参数)关键注意事项:
根据模板注册表数组进行分析,并基于以下逻辑选择:
id 字段匹配的模板并直接使用 - 封面/主图类:选择 tags 中包含 '封面' 的模板
- 正文/内容图类:选择不包含 '封面' 标签,或包含 '图片' 标签的模板
- 含主图的图片:选择 tags 中包含 '图片' 的模板
- 对比类内容:选择 desc 或 name 中包含 '对比' 关键词的模板
- 教程/步骤类内容:选择 desc 或 name 中包含 '步骤' 关键词的模板
desc 字段中搜索与用户请求匹配的关键词,如 避坑、干货、OOTD、情感 等desc 中包含 工具/清单/测评 的模板yellow 模板,确保高对比度可视性场景一:生成封面 + 内容图
tags: ['封面'] 的模板(如 yellow、magazine、laser-holographic 等)'封面' 标签的模板(如 glass、memo、newspaper 等)场景二:含主图的图片
tags: ['图片'] 的模板(如 tape-polaroid、soft-glass-border 等)场景三:对比/前后对比内容
desc 或 name 中包含 '对比' 的模板(如 classic-before-after、polaroid-before-after)场景四:教程/步骤类内容
desc 或 name 中包含 '步骤' 的模板(如 single-image-step、double-row-step、sidebar-nav-step)技能:Visnote 图像生成器
版本:0.1.0
分块:2/4
对于注册表数组中的每个模板:
desc 字段以了解使用场景(格式:"适合:类别1/类别2/类别3")tags 字段以理解分类(免费, VIP, 封面, 图片)value 字段以了解数据结构和可用字段关键点:模板的 value 对象是基础——它包含所有默认值,包括默认图片、颜色、文本等。始终从该完整对象开始,仅覆盖用户明确提供的内容。
标题提取:
标题是"xxx" 或 标题是'xxx'value.title(模板默认值)副标题/正文文本提取:
value 是否包含 subtitle 或 bodyText 字段- 从描述中提取并填入对应字段
- 示例:“生成 OOTD 穿搭封面” → subtitle 可为 "穿搭分享 | 日常记录"
- 示例:“日常碎碎念” → bodyText 可为 "今天天气真好\n心情超级棒"
value.subtitle 或 value.bodyText(模板默认值)图像字段(关键):
value 是否包含 image、image2 等字段image: '/images/jimeng-20260125.png' → 除非用户另有指定,否则保持不变标签提取:
value.tag(模板默认值)作者提取:
@username 格式author 字段value.author(模板默认值)颜色提取:
#RRGGBB 格式color 字段value.color(模板默认值)模板特定字段:
value 对象中存在的所有字段- 若用户明确提供值:使用用户值
- 若用户未提供:使用模板默认值
image、image2 用于对比风格;step 用于教程风格value 对象——这是你的基础,包含所有必需字段- 示例:用户说“生成 OOTD 穿搭” + 已提供标题
→ 若模板有 subtitle,则填入 "穿搭分享 | 日常记录"
→ 若模板有 tag,则填入 "生活分享"
value 中存在的字段——未指定字段使用模板默认值使用正确的 JSON 转义构建命令:
node scripts/generate-image.mjs \
--template <templateId> \
--data '<json_data>' \
--out <absolute-output-path>--template:必填。使用所选模板的 id 字段--data:必填(若需覆盖默认值)。来自合并后数据对象的 JSON 字符串--out:可选。- 若用户明确指定输出路径:使用用户提供的路径
- 若用户未指定路径:生成文件名为 visnote-YYYYMMDDHHmmss.png,其中 YYYYMMDDHHmmss 为当前时间戳格式
- 使用项目默认输出目录(如 ~/Downloads/)作为完整绝对路径
注意:API Key 会自动从 config.json 读取,无需作为参数传递。
value 结构匹配- 将整个 JSON 包裹在单引号中
- 若内部存在单引号:转义为 \'
- 若存在换行符:转义为 \\n
- 若存在反斜杠:转义为 \\\\
示例:
--data '{"title":"我的标题","subtitle":"副标题","color":"#EF4444"}'执行构建好的命令:
- 输出文件位置
- 使用的模板(名称和 ID)
- 相关状态信息
- 服务启动问题
- 模板未找到
- 缺少必填字段
- 文件权限问题
端点:GET /api/open/templates
基础 URL:https://vis-note.netlify.app
使用方式:
# 获取所有模板
curl "https://vis-note.netlify.app/api/open/templates"
# 按关键词搜索模板
curl "https://vis-note.netlify.app/api/open/templates?keyword=封面"调用此 API 时采用缓存策略:
该 API 是以下内容的唯一来源:
value 字段)切勿在响应中硬编码模板信息,因为:
value 对象中可能新增字段缓存优势:
用户请求: “帮我生成一张 Chrome插件 的图片,标题是 一键下载微博文章”
AI 处理流程:
GET /api/open/templates 获取所有模板desc 包含“工具/清单/测评”的模板 → academic-notes- 标题:“一键下载微博文章”(来自“标题是'...'”模式)
- 标签:提取“插件” → “插件分享”
{
"title": "一键下载微博文章", // 用户提供
"bodyText": "核心知识点一\n避坑指南二\n保姆级教程三", // 来自模板.value
"tag": "插件分享", // 提取并格式化
"author": "@你的名字", // 来自模板.value
"color": "#F59E0B" // 来自模板.value
}node scripts/generate-image.mjs \
--template academic-notes \
--data '{"title":"一键下载微博文章","bodyText":"核心知识点一\\n避坑指南二\\n保姆级教程三","tag":"插件分享","author":"@你的名字","color":"#F59E0B"}' \
--out ~/Downloads/visnote-20260302143022.png*备注:由于用户未指定输出路径,使用生成的时间戳文件名 visnote-20260302143022.png*
用户请求: “使用 yellow 模板生成一张干货封面,标题是3秒抓住用户注意力”
AI 处理流程:
GET /api/open/templates 获取所有模板id 为 "yellow" 的模板 → yellow- 标题:“3秒抓住用户注意力”
{
"title": "3秒抓住用户注意力", // 用户提供
"subtitle": "3秒抓住用户注意力 | 涨粉秘籍", // 来自模板.value
"tag": "干货分享", // 从“干货”提取
"color": "#EAB308" // 来自模板.value
}node scripts/generate-image.mjs \
--template yellow \
--data '{"title":"3秒抓住用户注意力","subtitle":"3秒抓住用户注意力 | 涨粉秘籍","tag":"干货分享","color":"#EAB308"}' \
--out ~/Downloads/visnote-20260302143022.png用户请求: “生成一张装修前后对比图,标题装修改造”
AI 处理流程:
GET /api/open/templates 获取所有模板desc 包含“对比”或名称包含“对比”的模板 → classic-before-after- 标题:“装修改造”
{
"title": "装修改造", // 用户提供
"subtitle": "3秒抓住用户注意力 | 涨粉秘籍", // 来自模板.value
"color": "#EF4444" // 来自模板.value
}node scripts/generate-image.mjs \
--template classic-before-after \
--data '{"title":"装修改造","subtitle":"3秒抓住用户注意力 | 涨粉秘籍","color":"#EF4444"}' \
--out ~/Downloads/visnote-20260302143022.png用户请求: “根据文档内容生成封面图和几张内容图,内容是关于小红书配图工具的”
AI 处理流程:
GET /api/open/templates 获取所有模板 - 封面图:查找 tags 包含 '封面' 的模板 → yellow(高对比度,醒目)
- 内容图:选择不包含“封面”标签、适合正文展示的模板 → glass(情绪磨砂玻璃风格,适合传播)
- 提取标题:“做小红书配图终于省心了”
- 提取标签:“实测分享”
- 合并 yellow 模板默认值
node scripts/generate-image.mjs \
--template yellow \
--data '{"title":"做小红书\n配图终于省心了","subtitle":"同一套模板搞定封面+正文","color":"#EAB308","tag":"实测分享"}' \
--out ~/Downloads/visnote-20260302220201.pngglass 模板,颜色可变):- 图像 1(痛点):“以前的痛点” + 关于问题的副标题
- 图像 2(新做法):“新的做法” + 关于解决方案的副标题
- 图像 3(变化一):“变化一” + 关于收益 1 的副标题
- 图像 4(变化二):“变化二” + 关于收益 2 的副标题
- 图像 5(变化三):“变化三” + 关于收益 3 的副标题
- 图像 6(建议):“建议” + 关于技巧的副标题
版本:0.1.0
分块:4/4
--out 参数的值\\n 表示yellow 模板 - 封面类:选择 tags 中包含 '封面' 的模板
- 带图片类:选择 tags 中包含 '图片' 的模板
- 内容主体类:选择不包含 '封面' 标签的模板
- 对比类:在 desc 或 name 中查找 '对比'
- 教程/步骤类:在 desc 或 name 中查找 '步骤'
本技能要求在 config.json 中设置 API Key,否则图像生成将失败。
首次设置:
# 在项目根目录创建或编辑 config.json
cat > config.json << 'EOF'
{
"apikey": "your_api_key_here"
}
EOF验证配置:
cat config.json请确认文件存在且 apikey 字段包含有效的 API Key。
获取 API Key 的方式:
在生成任何图像前,脚本会调用 ${server}/api/open/check 接口进行验证。以下检查将被执行:
- 错误提示:"API Key 不存在"
- 解决方案:检查 config.json 中的 API Key,或前往用户主页重新获取
- 错误提示:"您还不是会员"
- 解决方案:订阅 VIP 会员服务
- 错误提示:"您的会员已过期"
- 解决方案:续订 VIP 会员服务
- 错误提示:"生图额度已用完"
- 解决方案:购买额外额度,或等待额度重置
注:所有验证错误将立即中断图像生成过程,并显示清晰错误信息。
npm install playwright
npx playwright install chromium - 模板列表接口:${server}/api/open/templates
- API Key 验证接口:${server}/api/open/check
错误提示: "API Key 不存在"
config.json:cat config.jsonapikey 字段已填写有效密钥错误提示: "您还不是会员"
错误提示: "您的会员已过期"
错误提示: "生图额度已用完"
/editor 路由存在${server}/api/open/templates已收录 1 个 Skill