Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

小方同学全球首个营销方案Agent

v1.2.9

调用小方同学skill技能,10倍效率生成专业、精美营销方案,可一键导出专业 PPT。 当用户表达以下意图时,将自动启用本技能: ● 方案生成:「生成营销方案」「撰写营销方案」「营销策划」「推广策划」「产品推广方案」「生成策划案」「品牌推广方案」 ● PPT生成:「帮我做 PPT」「生成 PPT」「导出幻灯片」「...

0· 407·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for xiaok8700/aippt-marketing.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "小方同学全球首个营销方案Agent" (xiaok8700/aippt-marketing) from ClawHub.
Skill page: https://clawhub.ai/xiaok8700/aippt-marketing
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install aippt-marketing

ClawHub CLI

Package manager switcher

npx clawhub@latest install aippt-marketing
Security Scan
VirusTotalVirusTotal
Suspicious
View report →
OpenClawOpenClaw
Suspicious
medium confidence
Purpose & Capability
技能名称与描述(生成营销方案、导出 PPT)与运行指令一致:需要浏览器交互以获取登录 token、调用 aippt.cn 的 API、多轮生成与图片轮询。要求 browser 和 exec 工具与其功能相符。
!
Instruction Scope
SKILL.md 明确指示读取浏览器 localStorage 中的 token、询问并收集用户手机号/密码(并用 RSA 加密)、截图登录二维码并将截图上传到外部文件托管/OSS、在 /tmp 写入完整文稿并用 Node/curl 调用导出 API。读取 localStorage 和截图/上传二维码是有必要的登陆量测,但上传到第三方(如文档中出现的 tmpfiles.org / OSS)扩大了数据外泄面;此外使用 exec 执行脚本和写入 /tmp 也增加了本地持久化与数据流动。
Install Mechanism
这是 instruction-only 的技能,没有安装脚本或第三方包,风险较低;它依赖平台提供的工具(browser、exec、Read、WebFetch),没有下载或 extract 操作。
Credentials
技能不要求环境变量或外部凭证(no requires.env),这是合理。但运行时会请求敏感信息:手机号/密码(用于 API 登录)和从浏览器 localStorage 读取的 token。收集这些敏感字段在功能上可被证明必要,但用户应理解这些数据会被用于与第三方服务(aippt.cn)交互,并且某些步骤会将截图/文件上传到未充分说明的托管服务,这可能超出用户期望范围。
Persistence & Privilege
技能没有设置 always:true,也不请求修改系统或其它技能配置。写入 /tmp 是短期临时文件行为,属于可预期的导出流程,但仍应注意临时文件中可能包含完整文稿或用户凭证的敏感信息。
What to consider before installing
在决定安装/使用前请考虑以下事项: - 可信度与域名核验:技能所有 API 调用和主页指向 aippt.cn;确认该域名和服务是你信任的官方服务,避免在不可信站点输入手机号/密码。 - 密码与登录方式:技能允许两种登录(手机号+密码、微信扫码)。如果担心泄露,优先使用微信扫码并在本地完成扫码,不要在聊天窗口明文输入密码。若必须输入密码,确认后端请求目标确实为 aippt.cn 并在会话结束后撤销凭据。 - QR 截图与第三方上传:文档提到将二维码截图并上传到“tmpfiles.org / OSS”等外部托管以便呈现给用户。这会把二维码(可被他人扫描以登录你的账号)暴露给第三方。询问技能提供者:截图上传的具体目标、是否为你控制/受信任的托管、上传后文件的删除策略。若不放心,要求改为平台原生的安全展示或手动扫码流程。 - 本地临时文件与 exec:技能会在 /tmp 写入完整文稿并执行 Node/curl。虽然这是为了构造请求或导出文件,但这些临时文件可能包含敏感内容。审慎评估平台对 /tmp 的访问、是否会保留或上传这些文件到外部位置。 - 要求透明化:在安装前,向技能作者或来源确认并说明: • QR 截图和 OSS 上传的具体端点与隐私策略; • 是否会将任何 token、手机号、密码或生成内容发送到第三方域名; • 临时文件的生命周期和删除方式。 - 最小权限与替代方案:如果不愿暴露密码或上传二维码,可询问是否支持仅用扫码在本地浏览器完成登录,或提供导出时的手动上传选项。 综上:技能功能与其描述一致,但有几处数据出站(二维码托管、OSS 上传、临时文件上传)在文档中未充分说明来源与信任度——把这些问题弄清楚、并尽量避免在不可信场景输入密码,是在继续前的关键步骤。

Like a lobster shell, security has layers — review code before you run it.

latestvk97byv64rchrgk7a0w600tzgq58389qn
407downloads
0stars
21versions
Updated 8h ago
v1.2.9
MIT-0

小方同学营销方案生成

版本检查(每次会话首次触发时执行一次)

当前版本:1.1.0

用 exec 工具执行以下命令,检查是否有新版本:

clawhub inspect aippt-marketing --no-input 2>/dev/null | grep -oP 'Latest:\s*\K[\d.]+'
  • 如果返回的版本号大于 1.1.0,向用户展示:

    小方同学技能有新版本可用(当前 1.0.9 → 最新 X.X.X),执行 clawhub update aippt-marketing 即可更新。

  • 如果命令失败或版本相同,静默跳过,不提示用户
  • 此检查不阻塞后续流程,检查完成后立即继续执行

必读约束

Base URL

https://www.aippt.cn/api/marketing

认证方式

Authorization: Bearer AUTH_TOKEN

Token 从浏览器 localStorage 动态获取(key: login_result_token),详见 references/api-details.md


首次使用提醒

首次使用时,必须提醒用户

使用小方同学营销方案功能需要会员积分。如果您还没有购买,请先前往 小方同学个人中心 购买会员积分,然后再开始生成方案。

  • 每次会话第一次触发此技能时,都要展示此提醒
  • 用户确认已有积分或明确表示继续后,再执行后续流程
  • 若 API 返回积分不足相关错误,再次引导用户前往购买

操作规则

  • 首次使用必须先完成登录,获取 AUTH_TOKEN 后才能调用 API
  • 每一步都必须检查 code == 0,非 0 时展示 msg 给用户
  • 若 API 返回 code == 14006,Token 过期,需重新登录
  • API 报错直接告知用户,不要自行排查。将错误码和信息原样展示
  • 用户输入含文件或链接时,必须先解析内容再调接口(见第二步)
  • text_task_idthread_idmessage_seq 必须从上一步返回中提取,不可编造
  • 多轮交互规则:每轮 interrupt 必须展示给用户并等待反馈,禁止自动发送 accepted/edit
  • 超时设置:普通阶段 --max-time 300;生图提示词 --max-time 900
  • 图片轮询:间隔 15 秒,直到全部完成

快速决策

用户意图执行步骤
「生成营销方案」(无主题)提醒积分 → 询问主题 → 第一步起
「帮我做XX方案」(有主题)提醒积分 → 第一步起
「根据这个链接做方案」提醒积分 → WebFetch 解析 → 第一步起
「根据这个文件做方案」提醒积分 → Read 解析 → 第一步起
「用手机号登录」询问手机号密码 → RSA 加密 → API 登录
用户确认/编辑某阶段发送 accepted/edit → 获取下一阶段
用户选择风格发送风格 → 获取生图提示词 → 轮询图片

执行流程

第一步:登录与获取 Token

先询问用户选择登录方式(不要先打开浏览器):

方式一:手机号密码登录

纯 API 调用,不需要启动浏览器

  1. 询问用户手机号和密码
  2. RSA 加密后调用登录接口(详见 references/api-details.md
  3. 从响应 JSON body 取 data.token.access_token 作为 AUTH_TOKEN
  4. 验证 Token 有效性

方式二:微信扫码登录

需要启动浏览器。

  1. browser_navigate 打开 https://www.aippt.cn/marketing/home?utm_type=fanganskill&utm_source=fanganskill&utm_page=fangan.cn&utm_plan=fanganskill&utm_unit=xiaofangskill&utm_keyword=40515275
  2. browser_evaluate 检查 localStorage 中的 login_result_token

验证 Token

curl -s 'https://www.aippt.cn/api/user/info' \
  -H 'authorization: Bearer AUTH_TOKEN'

code: 0 有效;code: 14006 过期需重新登录。


第二步:获取用户输入

如果用户只说"生成营销方案"而没给具体主题,询问:

请告诉我营销方案的主题,例如:"双十一电商大促方案"、"新品上市推广策略"等。

解析用户附带的文件或链接

输入类型处理方式
本地文件(.pdf.docx.txt.mdRead 读取,提取关键信息作为 reference_content
网络链接(http://https://WebFetch 抓取,提取关键信息作为 reference_content
图片文件(.png.jpgRead 读取图片,识别文字信息

解析后:主题作为第三步 title,内容摘要(≤ 2000 字)填入第四步 messages


流程开始前提醒

创建项目前,必须先告知用户

方案生成过程较长(约 6 轮交互 + 图片生成),如果中途出现中断,发送「继续」即可恢复流程。


第三步:创建项目

curl -s -X POST 'https://www.aippt.cn/api/marketing/create' \
  -H 'authorization: Bearer AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "title": "用户输入的主题",
    "reference_content": "",
    "is_regeneration": false,
    "senior_options": "",
    "type": 25
  }'

提取data.idtext_task_id


第四步:创建生成任务

curl -s -X POST 'https://www.aippt.cn/api/marketing/task/create' \
  -H 'authorization: Bearer AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "messages": [{"role": "user", "content": "用户输入的主题"}],
    "text_task_id": TEXT_TASK_ID,
    "resources": []
  }'

提取data.thread_iddata.message_seq


第五步:多轮交互循环(核心流程)

进入 "获取结果 → 展示 → 用户确认/编辑" 的循环。共 6 轮 interrupt,每轮可编辑重复。

详细阶段说明见 references/api-details.md

获取阶段结果

curl -s --max-time 300 'https://www.aippt.cn/api/marketing/task/result?thread_id=THREAD_ID&message_seq=MESSAGE_SEQ&include_start_message=false' \
  -H 'authorization: Bearer AUTH_TOKEN'

拼接所有 message_chunkcontent 得到完整内容。收到 interrupt 后展示给用户。

用户确认(accepted)

curl -s -X POST 'https://www.aippt.cn/api/marketing/task/create' \
  -H 'authorization: Bearer AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "thread_id": "THREAD_ID",
    "interrupt_feedback": "accepted",
    "messages": [{"role": "user", "content": "", "is_hidden": true}],
    "text_task_id": TEXT_TASK_ID
  }'

用户要求修改(edit)

curl -s -X POST 'https://www.aippt.cn/api/marketing/task/create' \
  -H 'authorization: Bearer AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "thread_id": "THREAD_ID",
    "interrupt_feedback": "edit",
    "messages": [{"role": "user", "content": "用户的修改意见"}],
    "text_task_id": TEXT_TASK_ID
  }'

edit 后用返回的新 message_seq 再次获取结果(重复当前阶段),直到用户确认。

循环直到收到 agent: "marketing_picture_style" 的 interrupt → 进入第六步。

特殊处理:第 5 轮 marketing_report(最终文稿)

收到 marketing_report 的 interrupt 后,不需要等用户反馈,直接:

  1. 将完整文稿保存到临时文件(必须先写文件,后续步骤依赖此文件):
    mkdir -p /tmp/aippt-pdf-TASK_ID
    
    用 exec 将完整文稿内容写入 /tmp/aippt-pdf-TASK_ID/marketing-report.md
  2. 构造请求 JSON 文件(避免长文本内联导致 JSON 损坏):
    node -e "
    const fs = require('fs');
    const report = fs.readFileSync('/tmp/aippt-pdf-TASK_ID/marketing-report.md', 'utf8');
    const body = JSON.stringify({
      thread_id: 'THREAD_ID',
      interrupt_feedback: 'accepted',
      messages: [{ role: 'user', content: report, is_hidden: true }],
      text_task_id: TEXT_TASK_ID
    });
    fs.writeFileSync('/tmp/aippt-pdf-TASK_ID/accepted-body.json', body);
    "
    
  3. 发送 accepted 请求:
    curl -s -X POST 'https://www.aippt.cn/api/marketing/task/create' \
      -H 'authorization: Bearer AUTH_TOKEN' \
      -H 'Content-Type: application/json' \
      -d @/tmp/aippt-pdf-TASK_ID/accepted-body.json
    
  4. 用返回的新 message_seq 继续获取下一阶段结果

第六步:选择美化风格

收到 marketing_picture_style interrupt 后,向用户展示以下选项:


请选择 PPT 美化风格:

① 风格类型(三选一):

1️⃣ 企业品牌风格

  • 智能推荐品牌色(可输入品牌色或 HEX 色值)
  • 上传企业/品牌 logo

2️⃣ 行业风格(默认推荐 ✅)

  • 智能模板,根据行业自动匹配

3️⃣ 经典风格(15 种可选) 写实 / 极简 / 商务 / 科技 / 经典中式 / 新中式 / 孟菲斯 / 拼贴 / 像素 / 环保主义 / 液态酸 / 弥散光 / 报刊 / 宏伟磅礴 / 自定义

② 画面比例:16:9(默认)/ 4:3

③ PPT 页数:智能页数(默认)/ 10-20页 / 21-40页 / 41-60页 / 自定义(小于100页)

不指定的话,我按 行业风格 + 16:9 + 智能页数 生成哦~


用户选择后,将用户的选择原文直接发送:

curl -s -X POST 'https://www.aippt.cn/api/marketing/task/create' \
  -H 'authorization: Bearer AUTH_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "thread_id": "THREAD_ID",
    "interrupt_feedback": "accepted",
    "messages": [{"role": "user", "content": "用户的选择原文", "is_hidden": true}],
    "text_task_id": TEXT_TASK_ID
  }'

第七步:获取生图提示词与 job_id

curl -s --max-time 900 'https://www.aippt.cn/api/marketing/task/result?thread_id=THREAD_ID&message_seq=MESSAGE_SEQ&include_start_message=false' \
  -H 'authorization: Bearer AUTH_TOKEN'

此步骤耗时较长(5-10 分钟),提前告知用户"正在生成图片提示词,请稍候..."。

关键job_id 嵌套在 content 的 JSON 字符串内,需二次解析。详见 references/api-details.md


第八步:获取生成的图片

curl -s 'https://www.aippt.cn/api/marketing/image/gen/job/result?job_ids=JOB_IDS&task_id=TEXT_TASK_ID' \
  -H 'authorization: Bearer AUTH_TOKEN'

间隔 15 秒轮询,直到 task_job_status: "done"。详见 references/api-details.md

全部完成后,用 Markdown 图片语法逐页展示给用户(直接显示图片,不要只发链接):

![第1页](IMAGE_URL_1)
![第2页](IMAGE_URL_2)
...

第九步:生成文件并提供下载链接

图片全部展示完后,自动生成方案 PDF 和文稿文件,上传后一起返回给用户。

1. 下载所有图片到临时目录

mkdir -p /tmp/aippt-pdf-TASK_ID && \
curl -s -o /tmp/aippt-pdf-TASK_ID/page-01.jpg "IMAGE_URL_1" && \
curl -s -o /tmp/aippt-pdf-TASK_ID/page-02.jpg "IMAGE_URL_2" && \
...

2. 合成方案 PDF(按顺序尝试,成功即停)

优先用 Node.js:

node -e "
const fs = require('fs');
const { PDFDocument } = require('pdf-lib');
const glob = require('glob');

(async () => {
  const files = glob.sync('/tmp/aippt-pdf-TASK_ID/page-*.jpg').sort();
  const doc = await PDFDocument.create();
  const PAGE_WIDTH = 1280;
  for (const f of files) {
    const img = await doc.embedJpg(fs.readFileSync(f));
    const scale = PAGE_WIDTH / img.width;
    const pageHeight = img.height * scale;
    const page = doc.addPage([PAGE_WIDTH, pageHeight]);
    page.drawImage(img, { x: 0, y: 0, width: PAGE_WIDTH, height: pageHeight });
  }
  fs.writeFileSync('/tmp/aippt-pdf-TASK_ID/marketing-plan.pdf', await doc.save());
})();
"

如果 Node.js 缺少 pdf-lib,改用 Python Pillow

python3 -c "
from PIL import Image
import glob
PAGE_WIDTH = 1280
imgs = sorted(glob.glob('/tmp/aippt-pdf-TASK_ID/page-*.jpg'))
pages = []
for p in imgs:
    img = Image.open(p).convert('RGB')
    scale = PAGE_WIDTH / img.width
    img = img.resize((PAGE_WIDTH, int(img.height * scale)), Image.LANCZOS)
    pages.append(img)
pages[0].save('/tmp/aippt-pdf-TASK_ID/marketing-plan.pdf', save_all=True, append_images=pages[1:])
"

如果 Pillow 也不可用,改用 ImageMagick

convert /tmp/aippt-pdf-TASK_ID/page-*.jpg -resize 1280x /tmp/aippt-pdf-TASK_ID/marketing-plan.pdf

3. 上传方案 PDF 和文稿到 tmpfiles.org

# 上传方案 PDF
curl -s -L --max-time 60 \
  -F "file=@/tmp/aippt-pdf-TASK_ID/marketing-plan.pdf" \
  https://tmpfiles.org/api/v1/upload

# 上传方案文稿
curl -s -L --max-time 60 \
  -F "file=@/tmp/aippt-pdf-TASK_ID/marketing-report.md" \
  https://tmpfiles.org/api/v1/upload

将返回 URL 中的 tmpfiles.org/ 替换为 tmpfiles.org/dl/ 得到直链。

4. 发送给用户

![第1页](IMAGE_URL_1)
![第2页](IMAGE_URL_2)
...

📥 [方案 PDF 下载(有效期约1小时)](PDF_DIRECT_URL)

📄 [方案文稿下载(有效期约1小时)](REPORT_DIRECT_URL)

如需编辑,请前往 [小方同学](https://www.fangan.cn)
  • 如果某个文件上传失败,只展示成功的链接,不阻塞流程
  • 最后清理临时文件:rm -rf /tmp/aippt-pdf-TASK_ID
  • 发送完下载链接后,本次技能流程结束,不要追加任何额外话术(如"如需修改随时告诉我"等)

参数依赖关系

第一步 login → AUTH_TOKEN
         ↓
第三步 create → text_task_id
         ↓
第四步 task/create → thread_id, message_seq
         ↓
第五步 多轮交互循环(6 轮 interrupt,每轮可 edit 重复)
         ↓
第六步 用户选择风格 → accepted + 风格名称
         ↓
第七步 task/result → 提取 job_id(content 内 JSON 二次解析)
         ↓
第八步 image/gen/job/result → 轮询获取图片 URL
         ↓
第九步 合成 PDF + 文稿 → 上传 tmpfiles.org → 返回下载链接

Comments

Loading comments...