From brand-extractor
从PPT品牌案例文件中提取品牌信息。支持四种模式:(1)品牌目录 - 提取封面图和简短介绍;(2)品牌详情 - 提取品牌背景、产品、流量分布、KPI;(3)品牌分析 - 提取用户定位、流量模型、SEO、外链数据;(4)品牌社媒 - 提取社媒数据、KOL合作、品牌活动。根据用户提到的关键词自动选择模式。
npx claudepluginhub within-7/minto-plugin-tools --plugin brand-extractorThis skill uses the workspace's default tool permissions.
| 模式 | 图片位置 | 数据位置 | 说明 |
PROMPT_TEMPLATE.mdreferences/checklist.mdreferences/examples/complete_example.mdreferences/extraction_rules.mdreferences/image_identification_rules.mdreferences/layouts/backlink_keywords_slide.mdreferences/layouts/backlink_slide.mdreferences/layouts/backlink_slide_layout.mdreferences/layouts/brand_intro_slide.mdreferences/layouts/cover_slide.mdreferences/layouts/kol_slide.mdreferences/layouts/persona_slide.mdreferences/layouts/product_slide.mdreferences/layouts/seo_slide.mdreferences/layouts/social_activity_slide.mdreferences/layouts/social_platform_slide.mdreferences/layouts/social_style_slide.mdreferences/layouts/traffic_model_slide.mdreferences/layouts/traffic_slide.mdreferences/layouts/user_position_slide.mdGuides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
| 模式 | 图片位置 | 数据位置 | 说明 |
|---|---|---|---|
| 品牌目录 | assets/brands/ | assets/brands/ | 图片和数据在同一目录 |
| 品牌详情 | assets/brand_details/ | data/ | 图片和数据分开存放 |
| 品牌分析 | assets/brand_analysis/ | data/ | 图片和数据分开存放 |
| 品牌社媒 | assets/brand_social/ | data/ | 图片和数据分开存放 |
只有品牌目录模式:JSON和图片都放在 assets/brands/
其他三种模式:图片在 assets/xxx/,数据文件在 data/
| 序号 | 模式 | 触发关键词 | 图片 | 数据 |
|---|---|---|---|---|
| 1 | 品牌目录 | 品牌目录、品牌列表、brands | 1张 | JSON |
| 2 | 品牌详情 | 品牌背景、产品、KPI | 3张 | Markdown |
| 3 | 品牌分析 | 用户定位、流量模型、SEO、外链 | 6张 | JSON |
| 4 | 品牌社媒 | 社媒、KOL、品牌活动、社媒数据 | 7张 | JSON |
| 参数 | 说明 | 是否必需 |
|---|---|---|
| ppt_file | PPT文件路径 | 必需 |
| output_dir | 输出目录 | 可选(默认询问) |
| brand_name | 品牌名称 | 可选(默认从PPT提取) |
用户提到:品牌目录、品牌列表、brands、封面图
| 文件名 | 内容 | 来源 |
|---|---|---|
{brand}.png | 品牌主图/封面图 | Slide 1 image1.png |
{
"name": "CHEWY",
"nameCN": "Chewy 宠物用品在线平台",
"description": "美国宠物电商龙头"
}
{output_dir}/
└── assets/
└── brands/
├── {brand}.png
└── brand_{brand}_catalog.json
注意:JSON和图片都放在 assets/brands/ 目录下
用户提到:品牌背景、品牌简介、产品信息、KPI、流量分布、品牌详情
| 文件名 | 内容 | 图类型 |
|---|---|---|
{brand}_logo.png | 品牌Logo | 小图标 |
{brand}_product.png | 产品展示图 | 大图 |
{brand}_traffic.png | 独立站流量分布 | 柱状图 |
{output_dir}/
├── assets/brand_details/
│ ├── {brand}_logo.png
│ ├── {brand}_product.png
│ └── {brand}_traffic.png
└── data/
└── brand_{brand}_detail.md
用户提到:用户定位、用户画像、流量模型、SEO、外链、品牌分析
| 文件名 | 内容 | 图类型 |
|---|---|---|
{brand}_user_position.png | 用户定位分布 | 饼图 |
{brand}_persona_1.png | 用户画像1 | 截图 |
{brand}_persona_2.png | 用户画像2 | 截图 |
{brand}_traffic_model.png | 流量模型流程图 | 流程图 |
{brand}_backlink_pie.png | 外链来源分布 | 饼图 |
{brand}_backlink_bar.png | 外链热门关键词 | 横向柱状图 |
{
"brandNumber": "01",
"brandName": "BRAND",
"logoPath": "../assets/logo.png",
"userPositionImagePath": "../assets/brand_analysis/brand_user_position.png",
"userNeeds": {
"coreNeeds": "核心诉求",
"scenarios": "使用场景",
"decisionFactors": "决策因素",
"channels": "购买渠道"
},
"personaImage1Path": "../assets/brand_analysis/brand_persona_1.png",
"personaImage2Path": "../assets/brand_analysis/brand_persona_2.png",
"flowModelImagePath": "../assets/brand_analysis/brand_flow_model.png",
"seoTraffic": {
"text": "SEO说明文字(支持<strong>HTML</strong>)",
"keywords": [
{"rank": 1, "keyword": "dog food", "type": "狗粮", "traffic": "33,480"},
{"rank": 2, "keyword": "cat tree", "type": "猫爬架", "traffic": "22,444"}
]
},
"backlinkTypes": "外链合作网站类型说明",
"backlinkKeywords": "外链热门关键词说明",
"backlinkPieImagePath": "../assets/brand_analysis/brand_backlink_pie.png",
"backlinkBarImagePath": "../assets/brand_analysis/brand_backlink_bar.png"
}
字段说明:
brandNumber brandName logoPath - 品牌基本信息userPositionImagePath - 用户定位图片路径userNeeds - 用户需求(4个字段)personaImage1Path personaImage2Path - 用户画像图片路径flowModelImagePath - 流量模型图片路径seoTraffic.text - SEO说明文字(支持HTML)seoTraffic.keywords - 关键词数组(必须包含 type 字段)backlinkTypes - 外链类型文字说明backlinkKeywords - 外链关键词文字说明backlinkPieImagePath - 外链饼图路径backlinkBarImagePath - 外链柱状图路径{output_dir}/
├── assets/brand_analysis/
│ ├── {brand}_user_position.png
│ ├── {brand}_persona_1.png
│ ├── {brand}_persona_2.png
│ ├── {brand}_flow_model.png
│ ├── {brand}_backlink_pie.png
│ └── {brand}_backlink_bar.png
└── data/
└── brand_{brand}_analysis.json
注意:图片和数据分开存放,图片在 assets/brand_analysis/,JSON在 data/
用户提到:社媒、社交媒体、KOL、品牌活动、社媒数据、社媒风格
| 文件名 | 内容 | 图类型 |
|---|---|---|
{brand}_kol_chart.png | KOL合作统计 | 柱状图/图表 |
{brand}_style_1.png | 社媒风格1 | 截图 |
{brand}_style_2.png | 社媒风格2 | 截图 |
{brand}_style_3.png | 社媒风格3 | 截图 |
{brand}_activity_1.png | 品牌活动1 | 截图 |
{brand}_activity_2.png | 品牌活动2 | 截图 |
{brand}_activity_3.png | 品牌活动3 | 截图 |
{
"brandNumber": "01",
"brandName": "BRAND",
"logoPath": "../assets/logo.png",
"kolStats": {
"summary": "KOL合作数据摘要(支持<strong>HTML</strong>加粗)",
"imagePath": "../assets/brand_social/{brand}_kol_chart.png",
"points": [
"要点一:合作重心集中在某平台",
"要点二:某方面有增长空间",
"要点三:整体趋势描述"
]
},
"socialStyle": {
"items": [
{"title": "风格标题1", "imagePath": "../assets/brand_social/{brand}_style_1.png"},
{"title": "风格标题2", "imagePath": "../assets/brand_social/{brand}_style_2.png"},
{"title": "风格标题3", "imagePath": "../assets/brand_social/{brand}_style_3.png"}
]
},
"activity1": {
"title": "活动标题1",
"description": "活动描述",
"imagePath": "../assets/brand_social/{brand}_activity_1.png"
},
"activity2": {
"title": "活动标题2",
"description": "活动描述",
"imagePath": "../assets/brand_social/{brand}_activity_2.png"
},
"activity3": {
"title": "活动标题3",
"description": "活动描述",
"imagePath": "../assets/brand_social/{brand}_activity_3.png"
}
}
字段说明:
brandNumber brandName logoPath - 品牌基本信息(必需)kolStats.summary - KOL合作数据摘要(支持HTML)kolStats.imagePath - KOL数据图路径kolStats.points - 要点列表(可选,3条左右)socialStyle.items - 社媒风格展示(3张图)activity1/2/3 - 三个活动(各含title, description, imagePath){output_dir}/
├── assets/brand_social/
│ ├── {brand}_kol_chart.png
│ ├── {brand}_style_1.png
│ ├── {brand}_style_2.png
│ ├── {brand}_style_3.png
│ ├── {brand}_activity_1.png
│ ├── {brand}_activity_2.png
│ └── {brand}_activity_3.png
└── data/
└── brand_{brand}_social.json
注意:图片和数据分开存放,图片在 assets/brand_social/,JSON在 data/
| 项目 | 品牌详情 | 品牌分析 |
|---|---|---|
| 流量图类型 | 柱状图(独立站流量) | 饼图(外链来源) |
| 流量图文件 | _traffic.png | _backlink_pie.png |
不要搞混!
| 模式 | 图片位置 | 数据位置 |
|---|---|---|
| 品牌目录 | assets/brands/ | assets/brands/ ← 同一目录 |
| 品牌详情 | assets/brand_details/ | data/ |
| 品牌分析 | assets/brand_analysis/ | data/ |
| 品牌社媒 | assets/brand_social/ | data/ |
只有品牌目录的数据文件放在assets,其他都放在data目录!
本技能依赖以下工具/技能:
| 依赖 | 用途 | 说明 |
|---|---|---|
| skills-pptx | PPT解包 | 用于解包 .pptx 文件,提取XML和图片资源 |
| Python 3 | 辅助脚本 | 运行 scripts/extract_brand.py 可选辅助工具 |
# 1. 用户请求示例
"请从 /path/to/brand.pptx 提取品牌详情,输出到 /path/to/output"
# 2. AI执行步骤
# 2.1 解包PPT
unzip brand.pptx -d workspace/unpacked
# 2.2 扫描定位相关slide
# 2.3 提取图片到 assets/brand_details/
# 2.4 提取数据写入 data/brand_xxx_detail.md
# 3. 最终输出结构
output/
├── assets/brand_details/
│ ├── chewy_logo.png
│ ├── chewy_product.png
│ └── chewy_traffic.png
└── data/
└── brand_chewy_detail.md
# 方法1:使用unzip(推荐)
unzip /path/to/brand.pptx -d ./workspace/unpacked
# 方法2:使用skills-pptx的unpack脚本
python ooxml/scripts/unpack.py /path/to/brand.pptx ./workspace/unpacked
解包后目录结构:
unpacked/
├── ppt/
│ ├── slides/
│ │ ├── slide1.xml
│ │ ├── slide2.xml
│ │ └── ...
│ ├── media/
│ │ ├── image1.png
│ │ ├── image2.png
│ │ └── ...
│ └── slides/_rels/
│ ├── slide1.xml.rels
│ └── ...
└── ...
slideN.xml 文件这是关键步骤,不能跳过!
在提取图片之前,必须先执行以下流程:
import xml.etree.ElementTree as ET
def parse_slide_layout(slide_path, rels_path):
"""解析slide布局,返回所有元素的位置信息"""
# 1. 解析slide XML获取所有元素位置
tree = ET.parse(slide_path)
# 提取每个元素的 x, y, cx, cy (位置和尺寸)
# 2. 解析rels文件获取rId到图片的映射
# rId1 -> image3.jpeg, rId2 -> image2.png ...
return elements_info
必须输出类似以下格式的布局图:
## Slide X 布局结构
| 元素 | 位置 (x, y) | 尺寸 (w×h) | rId | 图片文件 | 用途 |
|------|-------------|------------|-----|----------|------|
| 图片1 | (6, 4) | 34×34 | rId2 | image2.png | 左上角小logo ⚠️忽略 |
| 图片2 | (172, 60) | 327×79 | rId8 | image9.png | **品牌Logo** ✓ |
| 图片3 | (680, 12) | 608×760 | rId1 | image3.jpeg | 全屏背景图 |
### 布局示意图
┌─────────────────────────────────────────────────┐
│ [34×34] │
│ image2 品牌概览 │
│ │
│ ┌─────────────────────────┐ │
│ │ [品牌Logo image9.png] │ │
│ │ (327×79) │ │
│ └─────────────────────────┘ │
│ │
│ [icon] 创立于 2017 年 │
│ [icon] 美国密歇根州 │
│ │
│ [背景图 image3.jpeg] │
└─────────────────────────────────────────────────┘
| 图片类型 | 识别特征 | 位置特征 |
|---|---|---|
| 品牌Logo | 在品牌概览页,品牌名区域 | 尺寸 200-400×50-150,位置居中偏上 |
| 产品图 | 在"爆款产品"页面 | 通常是最大尺寸的图片 |
| 流量分布图 | 在"独立站流量来源分布"页面 | 柱状图特征,中等尺寸 |
| 装饰图标 | 行首小图 | 尺寸 <50×50,忽略 |
| 背景图 | 全屏或右侧大图 | 尺寸 >500×500 |
在复制图片之前,必须和用户确认图片对应关系!
我识别到以下图片:
- 品牌Logo: image9.png (327×79) - 位于品牌名区域
- 产品图: image16.png (1965×1298) - 爆款产品展示
- 流量分布图: image12.png (580×340) - 独立站流量来源分布
请确认是否正确?
ppt/media/ 复制图片到目标目录查看 ppt/slides/_rels/slideN.xml.rels 文件,里面记录了该slide引用的所有图片资源。
通过slide的关系文件(.rels)找到 Target="media/imageX.png",然后从 ppt/media/ 目录获取实际图片。
参考 references/layouts/ 目录下的布局参考文件,里面有详细的字段说明和示例。
错误:unzip命令失败
解决:
1. 检查PPT文件路径是否正确
2. 检查是否有写入权限
3. 尝试使用绝对路径
错误:扫描不到任何匹配的slide
解决:
1. 检查PPT是否正确解包
2. 尝试使用更通用的关键词
3. 手动查看slide内容确认结构
错误:rId无法映射到实际图片
解决:
1. 检查rels文件路径是否正确
2. 确认media目录下图片是否存在
3. 使用glob搜索图片文件
错误:无法创建目录或写入文件
解决:
1. 检查父目录是否存在
2. 使用mkdir -p创建完整目录结构
3. 检查写入权限
scripts/extract_brand.py 是一个可选的辅助工具,用于:
注意:此脚本是可选的,主要提取工作由AI完成。脚本仅作为辅助工具。
使用方法:
python scripts/extract_brand.py --ppt /path/to/brand.pptx --mode detail --output /path/to/output