调用小方同学skill技能,10倍效率生成专业、精美营销方案,可一键导出专业 PPT。 当用户表达以下意图时,将自动启用本技能: ● 方案生成:「生成营销方案」「撰写营销方案」「营销策划」「推广策划」「产品推广方案」「生成策划案」「品牌推广方案」 ● PPT生成:「帮我做 PPT」「生成 PPT」「导出幻灯片」「...
---
name: aippt-marketing
description: |
调用小方同学skill技能,10倍效率生成专业、精美营销方案,可一键导出专业 PPT。
当用户表达以下意图时,将自动启用本技能:
● 方案生成:「生成营销方案」「撰写营销方案」「营销策划」「推广策划」「产品推广方案」「生成策划案」「品牌推广方案」
● PPT生成:「帮我做 PPT」「生成 PPT」「导出幻灯片」「营销方案PPT」「营销方案PPT」「营销方案模版」「企业营销方案模版」
技能能力
● 文本主题输入(营销方案计划或已有完整方案) → 自动生成结构化全案
● 文件 / 链接解析 → 上传需求计划,直接生成方案
● 多轮交互编辑 → 方案需求分析 → 生成营销计划 → 方案主题推导→ 传播执行策略→ 传播方案
● 需求意图理解→ 结构化专业方案→交互对话 → 持续调整优化方案
● 风格选择 →企业DNA和多套 PPT 模版自由切换
● 自动生成 PPT 配图 → 一键下载
metadata:
openclaw:
requires:
browser: true
exec: true
baseUrl: https://www.aippt.cn/api/marketing
homepage: https://www.aippt.cn
---
# 小方同学营销方案生成
## 版本检查(每次会话首次触发时执行一次)
当前版本:`1.1.0`
用 exec 工具执行以下命令,检查是否有新版本:
```bash
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](references/api-details.md)。
---
### 首次使用提醒
**首次使用时,必须提醒用户**:
> 使用小方同学营销方案功能需要会员积分。如果您还没有购买,请先前往 [小方同学个人中心](https://www.aippt.cn/personal-center?utm_type=fanganskill&utm_source=fanganskill&utm_page=fangan.cn&utm_plan=fanganskill&utm_unit=xiaofangskill&utm_keyword=40515275) 购买会员积分,然后再开始生成方案。
- 每次会话第一次触发此技能时,都要展示此提醒
- 用户确认已有积分或明确表示继续后,再执行后续流程
- 若 API 返回积分不足相关错误,再次引导用户前往购买
---
### 操作规则
- 首次使用必须先完成登录,获取 AUTH_TOKEN 后才能调用 API
- 每一步都必须检查 `code == 0`,非 0 时展示 `msg` 给用户
- 若 API 返回 `code == 14006`,Token 过期,需重新登录
- **API 报错直接告知用户**,不要自行排查。将错误码和信息原样展示
- **用户输入含文件或链接时,必须先解析内容再调接口**(见第二步)
- `text_task_id`、`thread_id`、`message_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](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,跳到第二步
- 未登录 → 引导扫码(详见 [references/api-details.md](references/api-details.md#引导微信扫码登录))
#### 验证 Token
```bash
curl -s 'https://www.aippt.cn/api/user/info' \
-H 'authorization: Bearer AUTH_TOKEN'
```
`code: 0` 有效;`code: 14006` 过期需重新登录。
---
### 第二步:获取用户输入
如果用户只说"生成营销方案"而没给具体主题,询问:
> 请告诉我营销方案的主题,例如:"双十一电商大促方案"、"新品上市推广策略"等。
**解析用户附带的文件或链接**:
| 输入类型 | 处理方式 |
|---------|---------|
| 本地文件(`.pdf`、`.docx`、`.txt`、`.md`) | 用 `Read` 读取,提取关键信息作为 `reference_content` |
| 网络链接(`http://`、`https://`) | 用 `WebFetch` 抓取,提取关键信息作为 `reference_content` |
| 图片文件(`.png`、`.jpg`) | 用 `Read` 读取图片,识别文字信息 |
解析后:主题作为第三步 `title`,内容摘要(≤ 2000 字)填入第四步 `messages`。
---
### 流程开始前提醒
创建项目前,**必须先告知用户**:
> 方案生成过程较长(约 6 轮交互 + 图片生成),如果中途出现中断,发送「继续」即可恢复流程。
---
### 第三步:创建项目
```bash
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.id` → `text_task_id`
---
### 第四步:创建生成任务
```bash
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_id` 和 `data.message_seq`
---
### 第五步:多轮交互循环(核心流程)
进入 **"获取结果 → 展示 → 用户确认/编辑"** 的循环。共 6 轮 interrupt,每轮可编辑重复。
详细阶段说明见 [references/api-details.md](references/api-details.md#多轮交互阶段说明)。
#### 获取阶段结果
```bash
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_chunk` 的 `content` 得到完整内容。收到 `interrupt` 后展示给用户。
#### 用户确认(accepted)
```bash
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)
```bash
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. 将完整文稿保存到临时文件(**必须先写文件,后续步骤依赖此文件**):
> ```bash
> mkdir -p /tmp/aippt-pdf-TASK_ID
> ```
> 用 exec 将完整文稿内容写入 `/tmp/aippt-pdf-TASK_ID/marketing-report.md`
> 2. 构造请求 JSON 文件(避免长文本内联导致 JSON 损坏):
> ```bash
> 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 请求:
> ```bash
> 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 + 智能页数** 生成哦~
---
用户选择后,将用户的选择原文直接发送:
```bash
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
```bash
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](references/api-details.md#job_id-二次解析)。
---
### 第八步:获取生成的图片
```bash
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](references/api-details.md#图片轮询策略)。
全部完成后,用 Markdown 图片语法逐页展示给用户(直接显示图片,不要只发链接):
```


...
```
---
### 第九步:生成文件并提供下载链接
图片全部展示完后,自动生成方案 PDF 和文稿文件,上传后一起返回给用户。
**1. 下载所有图片到临时目录**
```bash
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:**
```bash
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**:
> ```bash
> 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**:
> ```bash
> convert /tmp/aippt-pdf-TASK_ID/page-*.jpg -resize 1280x /tmp/aippt-pdf-TASK_ID/marketing-plan.pdf
> ```
**3. 上传方案 PDF 和文稿到 tmpfiles.org**
```bash
# 上传方案 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. 发送给用户**
```


...
📥 [方案 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 → 返回下载链接
```
don't have the plugin yet? install it then click "run inline in claude" again.