wechat-cover
公众号爆款封面AI设计工具。基于全网每日收录的10w+文章数据,获取同赛道爆款封面视觉元素,通过AI分析总结高转化视觉规律,生成贴合文章内容、符合平台流量审美的封面设计方案。当用户设计公众号封面、生成封面方案、查询爆款封面规律时使用。触发词:公众号封面、封面设计、爆款封面、封面方案、封面生图。
Install
npx skills add https://github.com/redfox-data/redfox-community/tree/main/skills/wechat-cover
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install redfox-data-redfox-community@llmmart
git clone https://github.com/redfox-data/redfox-community.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole redfox-data/redfox-community collection as a plugin from our marketplace. Git is the plain clone.
README
公众号封面图制作 / wechat-cover
简介
基于全网每日持续收录的 10w+ 文章数据,获取同赛道爆款封面的视觉元素,通过 AI 分析总结高转化视觉规律,生成贴合文章内容、符合平台流量审美的封面设计方案。
核心价值
- 海量样本对齐:每日持续收录爆款文章封面,设计方案有据可依,避免凭空臆造。
- 先析后做:先完成爆款封面风格分析与分类,再输出设计方案,规律清晰、便于选用。
- 方案+生图一体:每个方案附带生图提示词,选中后可直接生成 2.35:1 封面图。
适用对象
- ✍️ 公众号创作者 — 告别封面设计纠结,用爆款规律提升文章点击率。
- 📊 内容运营 — 按赛道关键词快速产出多组封面方案,A/B 测试更高效。
- 🏢 MCN / 新媒体团队 — 同赛道批量提案封面,沉淀可复用的视觉套路。
功能特性
核心功能
- 关键词驱动:输入赛道或内容关键词,自动获取同领域爆款封面数据。
- 7 维度封面分析:逐张分析封面图的文字内容、主体元素、色彩特征、构图布局、视觉风格、点击吸引力、尺寸,深度拆解爆款视觉规律。
- 风格分类汇总:将相似风格的封面归为同一类,按类型展示代表性封面与特征规律。
- 3 套设计方案:基于分析结果生成 3 套差异化封面设计方案,各含核心视觉、案例参考与生图提示词。
- 一键生图:用户选择方案后,直接生成 2.35:1(900×383)封面图,支持上传参考图片。
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk)提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
使用指南
直接用自然语言说出你的赛道、内容主题或封面需求即可,无需记忆固定命令。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 按赛道设计封面 | 「帮我设计美妆教程封面」 | 获取美妆赛道爆款封面数据,分析风格后生成 3 套方案 |
| 按内容主题设计 | 「秋冬美白护肤心得,想要专业感的封面」 | 解析内容意图,匹配专业风格封面规律 |
| 上传参考图 | 「帮我参考这张图设计封面」 + 上传图片 | 分析参考图风格,结合爆款数据生成方案 |
| 选择方案生图 | 回复「选方案 1」 | 按方案提示词生成 900×383 封面图 |
输出示例
完成分析后,你将收到一份可视化封面分析报告(HTML 页面),包含:
- 风格分类展示:每类风格的代表性封面图与特征规律
- 3 套设计方案:各含风格名称、核心视觉、案例参考与生图提示词
- 方案选择区域:选择后即可生成封面图
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 新文配封面 | 公众号创作者 | 「今天发护肤干货,帮我设计封面」 | 基于爆款数据生成专业封面方案 |
| 赛道日常更新 | 内容运营 | 「职场穿搭赛道,需要一组封面方案」 | 快速产出多组风格方案,A/B 测试 |
| 参考图定制 | 设计师 | 「参考这张图帮我出封面」+ 上传图片 | 结合参考图与爆款规律生成方案 |
| 热点追封面 | 新媒体编辑 | 「看看最近美妆赛道什么封面火」 | 获取近期爆款封面风格,紧跟热点 |
重要数据说明
- 数据库仅包含昨天至 30 天前的数据
- 默认时间范围为最近 30 天
Skill manifest
公众号封面图制作
📋 概述
基于全网每日收录的爆款文章数据,获取同赛道爆款封面的视觉元素,通过AI分析总结高转化视觉规律,生成贴合文章内容、符合平台流量审美的封面设计方案(含案例+生图提示词)。仅在主Agent中执行,不派发给子Agent。
🎯 触发规则
| 场景 | 处理方式 |
|---|---|
| 用户提供内容主题/赛道 | 执行任务流程 |
| 用户要求生成封面方案 | 执行任务流程 |
| 用户上传文案或图片要求分析 | 执行任务流程 |
| 用户询问技能功能/用法 | 仅介绍技能 |
| 用户未提供明确创作主题 | 仅介绍技能 |
📝 术语规范
统一使用"爆款封面",禁止使用:爆炸封面→爆款封面、爆炸数据→爆款数据、抓取数据→获取/查询数据、抓取封面→获取封面。
🔒 数据来源
所有爆款数据必须来自接口,禁止联网搜索、使用其他数据源或脑补数据。数据不足时明确告知用户。
🔑 鉴权
获取 API Key
请前往 红狐hub 获取API KEY
配置 API Key
方案1: 以OpenClaw为例,将REDFOX_API_KEY添加到~/.openclaw/openclaw.json中:
{ "env": { "REDFOX_API_KEY": "ak_xxxx..." } }
方案2: 终端配置
export REDFOX_API_KEY="ak_xxxx..."
⚙️ 前置准备
- 依赖:
requests(pip install requests) - 凭证:环境变量
REDFOX_API_KEY(详见鉴权章节) - 数据范围:仅含昨天至30天前的数据,默认查询近30天
🔄 操作流程
步骤1:意图解析
结构化解析用户需求,提取4个维度:
| 维度 | 说明 | 示例 |
|---|---|---|
| 内容主题 | 优先领域词 | 护肤、穿搭、美食、职场 |
| 内容类型 | 内容形式 | 干货、测评、种草、教程 |
| 风格偏好 | 视觉/调性 | 专业、吸引点击、情绪、极简 |
| 核心关键词 | 搜索关键词 | 秋冬、美白、护肤、干皮 |
提取2-5个核心关键词(逗号分隔),优先细分领域词,结合风格偏好补充场景词。
步骤2:爆款数据查询
# 有赛道关键词
python3 scripts/fetch_explosive_covers.py --keyword <关键词1,关键词2,关键词3>
# 无赛道关键词
python3 scripts/fetch_explosive_covers.py --keyword ""
- 最多5个关键词,总长度≤200字符
- 关键词整体一次传入接口,不做拆分循环调用
- 时间参数默认不传(接口自行决定默认范围);用户指定"近N天"时 startDate = 今天 - (N-1)天
步骤3:智能匹配筛选
| 数据量 | 处理 |
|---|---|
| ≥20条 | 直接使用 |
| <20条 | 扩展关键词(如:美白→美白、护肤、美白祛斑),重新查询,合并数据 |
筛选规则:按阅读数从高到低排序,取前20条。关键词扩展最多1-2次,每次2-3个相似词。
步骤4:AI图像分析与特征提取
- 解析脚本返回的JSON数据(含
articles文章数组,以及latestHotArticles、hotTopics、relatedSearches辅助数据) - 提取
imageUrl字段合并为封面候选池——直接使用原始值,不做任何修改(新接口字段名为imageUrl,旧接口为coverUrl,脚本已做兑容) - 按互动量从高到低取前20条
- 逐张分析封面图(使用原生图片理解能力,直接访问 imageUrl)
7维度分析:
| 维度 | 分析内容 |
|---|---|
| 文字内容 | 是否有文字、内容、字体大小、位置、颜色、醒目程度 |
| 主体元素 | 人物/产品/场景/图案等主要视觉元素 |
| 色彩特征 | 主色调、配色方案、对比度、冷暖色调 |
| 构图布局 | 画面结构、元素分布、主体位置、留白处理 |
| 视觉风格 | 实拍/插画/拼贴/极简/炫酷等风格类型 |
| 点击吸引力 | 痛点/好奇/美感/实用——为什么吸引点击 |
| 尺寸检测 | 宽x高,是否合格(≥10px) |
图片过滤规则:
- 空白图片(纯色块、无内容):标注"需过滤",后续所有环节排除
- 小尺寸图片(宽或高 <10px):全部过滤
- 输出前二次检查:确保无空白/小尺寸图片混入
分类汇总:将相似风格的封面归为同一类,统计特征规律(分类前先过滤空白图片)。
步骤5:输出HTML分析报告与设计方案
使用 references/report_template.html(JS渲染型模板),只需注入 JSON 数据,禁止在输出时临时生成完整 HTML。
- 复制模板到输出文件:
cp references/report_template.html ./爆款封面分析报告_{关键词}.html - 将分析结果组装为 JSON 对象(格式见
references/report_template.md) - 用 SearchReplace 在输出文件(非模板原文件)中将
__REPORT_DATA__的默认空值替换为实际 JSON - 执行
open ./爆款封面分析报告_{关键词}.html在浏览器中打开
JSON 结构(只需填充以下字段,无需生成任何 HTML):
{
"keyword": "用户关键词",
"analysisCount": 20,
"styles": [{ "name": "", "count": 0, "coreVisual": "", "features": "", "covers": [] }],
"plans": [{ "name": "", "coreVisual": "", "case": { "imageUrl": "", "url": "", "title": "", "author": "", "reads": "" }, "prompt": "" }]
}
| 要求 | 说明 |
|---|---|
| 模板 | references/report_template.html(JS 渲染型,样式/防盗链已内置) |
| 数据格式 | 详见 references/report_template.md JSON 数据结构章节 |
| 封面展示 | 按风格类型分类,每类最多5张 |
| 案例参考 | imageUrl 原始值 + 标题(url链接) + 作者 + 仅阅读数 |
| 生图提示词 | 严格遵循 2.35:1 横版比例 |
步骤6:用户选择方案并生成封面图
⚠️ 先询问用户,等回复后再生成——不要在用户选择前就生成封面图!
第一阶段(输出报告后立即执行):HTML模板末尾已包含方案选择区域,展示报告后停止,等待用户回复。
第二阶段(用户回复后执行):
- 确认用户选择的方案(1/2/3)及其生图提示词
- 如用户上传了图片,用原生图片理解能力分析
- 使用原生图像生成能力生成封面图(2.35:1,900x383像素)
- 直接展示图片,不需要HTML包裹
步骤7:输出前自检
| 检查项 | 内容 |
|---|---|
| 风格类型 | 每类有:名称、频次、核心视觉、关键特征、封面示例 |
| 三个方案 | 各有风格名称、核心视觉、案例参考(不重复)、生图提示词 |
- 封面图链接使用 imageUrl 字段原始值 | 图片过滤 | 无空白图片、无小尺寸图片 | | 用户交互 | 已询问方案选择并等待回复 |
⚠️ 注意事项
- 封面图容器比例 2.35:1 (900x383),使用
object-fit: cover+object-position: center自适应截取 - HTML添加防盗链 meta 标签
<meta name="referrer" content="no-referrer"> - 案例参考仅保留阅读数(clicksCount),删除点赞和在看
- 封面图用
<a>标签包裹可点击跳转大图,方案标题用 url 字段链接 - 图像分析使用原生图片理解能力,直接访问封面URL,逐张分析
Files (redfox-community)
-
references
-
gzh_trend_data_format.md 4.1 KB
# 公众号爆款数据格式说明 ## 概览 本文档定义了公众号爆款封面数据查询脚本 `fetch_explosive_covers.py` 的输入输出格式规范。 **接口地址**:`POST https://redfox.hk/story/api/gzh/search/hotArticleNew` ## 输入格式 ### 脚本参数 ```bash python3 scripts/fetch_explosive_covers.py --keyword <关键词> [选项] ``` | 参数 | 必填 | 说明 | 默认值 | |------|------|------|--------| | `--keyword` | 是 | 搜索关键词(支持多个,逗号分隔,空字符串查全站热门) | - | | `--start-date` | 否 | 开始日期,格式 yyyy-MM-dd | 不传(接口自行决定) | | `--end-date` | 否 | 结束日期,格式 yyyy-MM-dd | 不传(接口自行决定) | | `--max-items` | 否 | 最多展示文章数量 | 20 | | `--output-format` | 否 | 输出格式:text、json 或 markdown | json | | `--output-file` | 否 | 输出文件路径 | 不输出文件 | | `--debug` | 否 | 调试模式 | False | ## 输出格式 ### 文章数据字段 每篇文章(`articles` 数组中的对象)包含以下字段: #### 文章基本信息 | 字段名 | 类型 | 说明 | |--------|------|------| | `id` | string | 文章ID(唯一标识) | | `title` | string | 文章标题(可能为空,需从 summary 提取) | | `summary` | string | 文章摘要/正文片段 | | `publicTime` | string | 发布时间(格式:YYYY-MM-DD HH:MM:SS) | | `url` | string | 文章链接(完整URL) | #### 作者信息 | 字段名 | 类型 | 说明 | |--------|------|------| | `author` | string | 公众号名称/作者名 | #### 互动数据 | 字段名 | 类型 | 说明 | |--------|------|------| | `clicksCount` | int | 阅读数 | | `watchCount` | int | 在看数 | | `likeCount` | int | 点赞数 | | `shareCount` | int | 分享数 | | `commentsCount` | int | 评论数 | #### 封面图 | 字段名 | 类型 | 说明 | |--------|------|------| | `imageUrl` | string | 封面图URL(旧接口字段名为 `coverUrl`) | #### 评分字段(用于排序) | 字段名 | 类型 | 说明 | |--------|------|------| | `totalScore` | float | 总分(用于排序) | | `relevanceScore` | float | 相关性评分 | | `popularityScore` | float | 热度评分 | | `recencyScore` | float | 时效评分 | #### ⚠️ 新接口缺失字段 以下字段在旧接口(getWxCozeSkillData)中存在,**hotArticleNew 接口不返回**: | 缺失字段 | 说明 | 影响 | |----------|------|------| | `userName` | 公众号名称 | 已改为 `author` 字段 | | `photoId` | 文章旧ID | 已改为 `id` 字段 | | `oriUrl` | 文章旧链接 | 已改为 `url` 字段 | | `accountId` | 公众号账号ID | 无法拼接二维码链接 | | `userHeadUrl` | 作者头像 | 无法展示作者头像 | ### JSON 输出示例 ```json { "keyword": "职场", "articles": [ { "id": "abc123", "title": "职场新人必知的10个技巧", "summary": "刚入职场的你是否感到迷茫...", "author": "职场达人", "publicTime": "2026-07-20 10:30:00", "url": "https://mp.weixin.qq.com/s/xxxxx", "imageUrl": "https://mmbiz.qpic.cn/mmbiz_jpg/...", "clicksCount": 58000, "watchCount": 320, "totalScore": 85.5, "relevanceScore": 8.2, "popularityScore": 7.5, "recencyScore": 6.0 } ], "latestHotArticles": [], "hotTopics": [ { "name": "职场晋升", "count": 120 } ], "relatedSearches": ["职场沟通", "职场穿搭"] } ``` ## 关于封面图 新接口(hotArticleNew)封面图字段名为 `imageUrl`,旧接口为 `coverUrl`,脚本已做双字段兑容处理。 ## 使用注意事项 ### 数据获取原则 1. **必须调用脚本查询**:不能使用其他方式查询或直接搜索网络资讯 2. **必须等待脚本执行完成**:获取返回结果后才能进行后续步骤 3. **必须展示完整数据列表**:不能跳过或询问用户 ### 字段说明 1. **标题提取**:如果 `title` 字段为空,从 `summary` 字段提取前30个字符作为标题 2. **作者名称**:使用 `author` 字段 3. **阅读数格式**:整数,脚本中格式化为 `1.0w` 形式(≥10000时) 4. **文章链接**:使用 `url` 字段 -
report_template.html 8 KB · in bundle
-
report_template.md 4.1 KB
# 爆款封面分析报告 HTML 模板 ## 文件说明 本模板采用 **JS 渲染型** 架构:HTML 结构和渲染逻辑固定在 `references/report_template.html` 中,Agent 只需注入一段 JSON 数据,页面自动渲染,无需在输出时临时生成大量 HTML。 **模板文件**:`references/report_template.html` **⚠️ 重要:按风格类型分类展示封面,不要逐张输出分析结果!** --- ## 使用方式 1. 读取 `references/report_template.html` 模板文件 2. 将分析结果组装为 JSON 对象 3. 用 SearchReplace 将模板中 `__REPORT_DATA__` 的值替换为实际 JSON 4. 写入 `./爆款封面分析报告_{关键词}.html` 5. 执行 `open ./爆款封面分析报告_{关键词}.html` 打开浏览器 **替换目标**(模板中唯一的占位区域): ```javascript var __REPORT_DATA__ = { "keyword": "", "analysisCount": 0, "styles": [], "plans": [] }; ``` --- ## JSON 数据结构 ```json { "keyword": "美食,食谱,做饭", "analysisCount": 20, "styles": [ { "name": "🍽️ 家常俯拍·满桌多菜", "count": 12, "coreVisual": "俯视/高角度拍摄,3-6道菜品铺满白色桌面,自然暖光", "features": "满桌丰盛感营造家的味道;白色桌面干净清爽;菜品色彩丰富", "covers": [ "https://mmbiz.qpic.cn/xxx1/0?wx_fmt=jpeg", "https://mmbiz.qpic.cn/xxx2/0?wx_fmt=jpeg" ] } ], "plans": [ { "name": "家常俯拍·满桌温馨", "coreVisual": "俯视角度拍摄4-6道家常菜铺满白色桌面,暖色自然光", "case": { "imageUrl": "https://mmbiz.qpic.cn/xxx/0?wx_fmt=jpeg", "url": "https://mp.weixin.qq.com/s/xxx", "title": "在家待客,简单四道家常菜", "author": "小李食代", "reads": "10.0w" }, "prompt": "2.35:1横版比例(900x383像素)。参考封面:https://... 。俯视角度拍摄白色大理石桌面上摆放4-5道精致家常菜..." } ] } ``` --- ## 字段说明 ### 顶层字段 | 字段 | 类型 | 说明 | 数据来源 | |------|------|------|----------| | `keyword` | string | 用户输入的主题关键词 | 用户输入 | | `analysisCount` | number | 实际分析的封面图数量 | 过滤后统计 | | `styles` | array | 风格类型分类列表 | 分析归类 | | `plans` | array | 3个设计方案 | 分析总结 | ### styles 数组元素 | 字段 | 类型 | 说明 | |------|------|------| | `name` | string | 风格类型名称(可含emoji) | | `count` | number | 该风格出现次数 | | `coreVisual` | string | 核心视觉描述 | | `features` | string | 关键特征描述 | | `covers` | string[] | 代表性封面图URL(最多5张) | ### plans 数组元素 | 字段 | 类型 | 说明 | |------|------|------| | `name` | string | 方案风格名称 | | `coreVisual` | string | 核心视觉描述 | | `case.imageUrl` | string | 案例封面图URL(imageUrl 字段原始值) | | `case.url` | string | 案例文章链接(url 字段) | | `case.title` | string | 案例文章标题 | | `case.author` | string | 案例作者名(author 字段) | | `case.reads` | string | 案例阅读数(格式化后,如"10.0w") | | `prompt` | string | 生图提示词(含2.35:1比例说明和参考封面URL) | --- ## 图片过滤规则 - 空白图片(纯色块、无内容):排除,不放入 covers 数组 - 小尺寸图片(宽或高 <10px):排除 - 每个风格类型最多5张代表性封面图 --- ## 样式规范 | 元素 | 样式规则 | |------|----------| | 封面图容器比例 | 2.35:1 (180x77px 风格展示 / 300x128px 案例参考) | | 封面图适配 | object-fit: cover, object-position: center | | 防盗链 | 模板已内置 `<meta name="referrer" content="no-referrer">` | --- ## 输出文件命名 生成HTML报告时,文件名格式: ``` 爆款封面分析报告_{关键词}.html ``` 保存路径:当前工作目录(使用相对路径 ./)
-
-
scripts
-
fetch_explosive_covers.py 12.5 KB
#!/usr/bin/env python3 """ 公众号爆款封面数据查询脚本 对接接口:POST https://redfox.hk/story/api/gzh/search/hotArticleNew """ import os import sys import argparse import json from datetime import datetime import requests def _do_fetch(keyword, headers, base_url, start_date=None, end_date=None, debug=False): """执行单次 POST 请求,返回解析后的 dict startDate / endDate 仅在用户显式指定时传入,否则由接口自行决定默认范围。 """ json_body = { "keyword": keyword, "source": "公众号爆款封面生成-GitHub", "pageSize": 50 } # 时间参数:仅在用户显式指定时才传入 if start_date: json_body["startDate"] = start_date if end_date: json_body["endDate"] = end_date if debug: print(f"\n[DEBUG] POST {base_url}", file=sys.stderr) print(f"[DEBUG] Body: {json_body}", file=sys.stderr) try: response = requests.post(base_url, json=json_body, headers=headers, timeout=30) if debug: print(f"[DEBUG] 状态码: {response.status_code}", file=sys.stderr) if response.status_code >= 400: print(f"[DEBUG] HTTP错误: {response.status_code} {response.text[:200]}", file=sys.stderr) return None result = response.json() if result.get("code") == 2000: data = result.get("data", {}) if debug: articles = data.get("articles", []) print(f"[DEBUG] 获取到 {len(articles)} 篇文章", file=sys.stderr) return data else: if debug: print(f"[DEBUG] 接口错误: {result.get('msg')}", file=sys.stderr) return None except Exception as e: if debug: print(f"[DEBUG] 请求异常: {e}", file=sys.stderr) return None def fetch_wx_covers(keyword: str, debug: bool = False, start_date: str = None, end_date: str = None): """ 调用 hotArticleNew 接口获取公众号爆款文章数据 Args: keyword: 搜索关键词(多个关键词用逗号分隔,空字符串表示全站热门) debug: 是否打印调试信息 start_date: 开始日期,格式 yyyy-MM-dd end_date: 结束日期,格式 yyyy-MM-dd(默认今天) Returns: dict: 包含 articles / latestHotArticles / hotTopics / relatedSearches """ api_key = os.getenv("REDFOX_API_KEY") if not api_key: raise ValueError( "缺少 API Key 配置,请设置环境变量 REDFOX_API_KEY。" "获取方式:前往 https://redfox.hk/settings/api-keys?source=github 申请," '然后执行 export REDFOX_API_KEY="ak_xxxx..."' ) base_url = "https://redfox.hk/story/api/gzh/search/hotArticleNew" headers = { "X-API-KEY": api_key, "Content-Type": "application/json", "Accept": "application/json", } # 关键词原样传入,单次调用 kw = keyword.strip() if keyword else "" data = _do_fetch(kw, headers, base_url, start_date=start_date, end_date=end_date, debug=debug) all_articles = data.get("articles", []) if data else [] all_latest_hot = data.get("latestHotArticles", []) if data else [] all_hot_topics = data.get("hotTopics", []) if data else [] all_related_searches = data.get("relatedSearches", []) if data else [] # 按 id 去重 seen_ids = set() unique_articles = [] for article in all_articles: article_id = article.get("id") if article_id and article_id not in seen_ids: seen_ids.add(article_id) unique_articles.append(article) unique_latest = [] for article in all_latest_hot: article_id = article.get("id") if article_id and article_id not in seen_ids: seen_ids.add(article_id) unique_latest.append(article) seen_topics = set() unique_topics = [] for topic in all_hot_topics: topic_name = topic.get("name", "") or topic.get("topic", "") if topic_name and topic_name not in seen_topics: seen_topics.add(topic_name) unique_topics.append(topic) return { "keyword": keyword, "articles": unique_articles, "latestHotArticles": unique_latest, "hotTopics": unique_topics[:10], "relatedSearches": all_related_searches[:10], } def get_cover_urls(data, max_items=20): """ 从 articles 数组提取封面图 URL hotArticleNew 接口封面图字段名为 imageUrl(旧接口为 coverUrl),此处做双字段兑容。 """ urls = [] items = data.get("articles", [])[:max_items] for item in items: # 优先取 imageUrl(新接口),兑容 coverUrl(旧接口) cover_url = item.get("imageUrl", "") or item.get("coverUrl", "") article_id = item.get("id", "") title = (item.get("title", "") or "")[:20] url = item.get("url", "") if cover_url: urls.append({ "title": title, "article_id": article_id, "cover_url": cover_url, "link": url, }) return urls def format_num(n): """格式化数字:10000 → 1.0w""" if not n: return "0" try: n = int(n) except (ValueError, TypeError): return str(n) if n >= 10000: return f"{n / 10000:.1f}w" return str(n) def format_output(data: dict, max_items: int = None, start_date: str = None): """ 格式化输出爆款数据(表格形式) Args: data: 原始数据(含 articles 数组) max_items: 最多展示条数,None 表示展示所有 start_date: 开始日期,用于计算统计时间范围 """ def get_time_range(start_date): if start_date: try: start = datetime.strptime(start_date, "%Y-%m-%d") days = (datetime.now() - start).days return f"近{max(days, 1)}天" except Exception: pass return "近30天" time_range = get_time_range(start_date) def process_title(item): title = item.get("title", "") or "" if not title.strip(): summary = item.get("summary", "") or "" if summary: title = summary.replace("\n", " ").replace("\r", " ").strip()[:30] if len(summary) > 30: title += "..." if not title.strip(): title = "无标题" title = title.replace("|", "\\|").replace("\n", " ").replace("\r", " ") title = " ".join(title.split()) if len(title) > 30: title = title[:30] + "..." return title def format_time(item): pub_time = item.get("publicTime", "") or "" if pub_time: try: month = int(pub_time[5:7]) day = int(pub_time[8:10]) return f"{month}月{day}日" except Exception: pass return "--" output = [] articles = data.get("articles", []) # 按 clicksCount 降序排序 def get_clicks(item): try: return int(item.get("clicksCount", 0) or 0) except (ValueError, TypeError): return 0 articles_sorted = sorted(articles, key=get_clicks, reverse=True) if max_items is not None: articles_sorted = articles_sorted[:max_items] total_count = len(articles) if total_count == 0: keyword = data.get("keyword", "") output.append(f"# 公众号爆款数据分析报告\n\n**关键词**:{keyword}\n\n") output.append("---\n\n") output.append("## 暂无相关爆款数据\n\n") output.append(f"很抱歉,当前关键词 **「{keyword}」** 尚未有足够的爆款文章数据。\n\n") output.append("### 可能原因\n\n") output.append("- 该关键词相对小众或新兴,爆款内容积累较少\n") output.append("- 近期该赛道热度较低,暂无突出爆款文章\n") output.append("- 关键词表述方式可以更加具体或热门\n\n") output.append("### 建议操作\n\n") output.append("- 更换为更热门的关键词,如:**\"职场成长\"**、**\"美食\"**、**\"情感故事\"** 等\n") output.append("- 尝试更细分的长尾关键词\n") output.append("- 输入其他感兴趣的领域或赛道进行追踪\n\n") output.append("---\n\n") output.append("*数据来源:公众号爆款雷达,每日更新最新热门内容*\n") return "\n".join(output) output.append(f"\n### 爆款文章({time_range},按阅读数排序,共 {total_count} 条)\n") output.append("| 序号 | 发布时间 | 标题 | 作者 | 阅读数 | 在看数 |") output.append("|------|----------|------|------|--------|--------|") for idx, item in enumerate(articles_sorted, 1): author = item.get("author", "") or "未知" title = process_title(item) url = item.get("url", "") title_with_link = f"[{title}]({url})" if url else title pub_time = format_time(item) clicks = format_num(item.get("clicksCount", 0)) watches = format_num(item.get("watchCount", 0)) output.append(f"| {idx} | {pub_time} | {title_with_link} | {author} | {clicks} | {watches} |") return "\n".join(output) def main(): """主函数""" parser = argparse.ArgumentParser(description="公众号爆款封面数据查询工具") parser.add_argument("--keyword", required=True, help="搜索关键词(多个用逗号分隔,空字符串查全站热门)") parser.add_argument( "--max-items", type=int, default=20, help="最多展示文章数量(默认20条)", ) parser.add_argument( "--output-format", choices=["text", "json", "markdown"], default="json", help="输出格式:text / json(默认)/ markdown", ) parser.add_argument("--output-file", type=str, default=None, help="输出文件路径") parser.add_argument("--start-date", type=str, default=None, help="开始日期,格式 yyyy-MM-dd(默认不传,接口自行决定)") parser.add_argument("--end-date", type=str, default=None, help="结束日期,格式 yyyy-MM-dd(默认不传,接口自行决定)") parser.add_argument("--debug", action="store_true", help="启用调试模式") args = parser.parse_args() try: data = fetch_wx_covers( args.keyword, debug=args.debug, start_date=args.start_date, end_date=args.end_date, ) # 生成输出内容 if args.output_format == "json": output_content = json.dumps(data, ensure_ascii=False, indent=2) elif args.output_format == "markdown": markdown_header = f"# 公众号爆款数据分析报告\n\n**关键词**:{args.keyword}\n\n" output_content = markdown_header + format_output(data, max_items=args.max_items, start_date=args.start_date) else: output_content = format_output(data, max_items=args.max_items, start_date=args.start_date) output_file = args.output_file if output_file: with open(output_file, "w", encoding="utf-8") as f: f.write(output_content) print(f"✓ 结果已保存到: {output_file}", file=sys.stderr) print(f"✓ 关键词: {args.keyword}", file=sys.stderr) total = len(data.get("articles", [])) print(f"✓ 总计: {total} 条数据", file=sys.stderr) cover_urls = get_cover_urls(data, max_items=3) if cover_urls: print(f"\n=== 封面图URL(用于风格分析)===", file=sys.stderr) for i, item in enumerate(cover_urls, 1): print(f"{i}. {item['title']}: {item['cover_url']}", file=sys.stderr) else: print("\n⚠️ 接口未返回 imageUrl/coverUrl 字段,无法提取封面图URL", file=sys.stderr) else: print(output_content) print(f"\n✓ 关键词: {args.keyword}", file=sys.stderr) total = len(data.get("articles", [])) print(f"✓ 总计: {total} 条数据", file=sys.stderr) print(f"\n另外红狐配套全量数据库可提供完整详实数据,如需了解采购方案,可发送邮件至 redfoxdata@proton.me 对接咨洵") except Exception as e: print(f"❌ 错误: {str(e)}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": main()
-
-
README.en.md 5.5 KB
# WeChat Cover Design / wechat-cover --- ## Introduction Based on daily collected **100K+** article data from across the web, this tool retrieves visual elements from explosive covers in the same niche, analyzes high-conversion visual patterns through AI, and generates cover design proposals that match your content and fit the platform's traffic aesthetics. **Core Value** - **Massive Sample Alignment**: Continuously collects explosive article covers daily, ensuring design proposals are data-driven rather than imagined. - **Analyze First, Design Later**: Completes explosive cover style analysis and classification before outputting design proposals, making patterns clear and easy to choose. - **Proposal + Image Generation All-in-One**: Each proposal includes image generation prompts; after selection, a 2.35:1 cover image can be generated directly. **Target Users** - ✍️ **WeChat Official Account Creators** — Stop struggling with cover design, use explosive patterns to boost article click rates. - 📊 **Content Operators** — Quickly produce multiple cover proposals by niche keywords for efficient A/B testing. - 🏢 **MCN / New Media Teams** — Batch propose covers for the same niche, building reusable visual templates. --- ## Features ### Core Features - **Keyword-Driven**: Enter a niche or content keyword to automatically retrieve explosive cover data for that field. - **7-Dimension Cover Analysis**: Analyzes each cover image across text content, main elements, color characteristics, composition layout, visual style, click appeal, and dimensions for deep pattern extraction. - **Style Classification Summary**: Groups similar-style covers into categories, displaying representative covers and characteristic patterns by type. - **3 Design Proposals**: Generates 3 differentiated cover design proposals based on analysis results, each with core visuals, case references, and image generation prompts. - **One-Click Image Generation**: After selecting a proposal, directly generates a 2.35:1 (900×383) cover image; supports uploading reference images. --- ## API Key Acquisition & Security - This skill requires the environment variable: `REDFOX_API_KEY`. - `REDFOX_API_KEY` is provided by [RedFoxHub](https://redfox.hk/settings/api-keys?source=github) (`https://redfox.hk`). - Please visit [RedFoxHub](https://redfox.hk?source=github) to register an account and obtain `REDFOX_API_KEY`. - Configure the environment variable `REDFOX_API_KEY` on your device before using this skill. - Before providing a key, please confirm its source, scope of use, validity period, and whether it supports reset/revocation. - Never hard-code or expose keys in plain text within code, prompts, logs, or output files. --- ## Usage Guide Simply describe your niche, content topic, or cover needs in natural language — no commands to memorize. ### Quick Reference | Intent | Example Phrase | Result | | --------------------------- | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | | Design by niche | "Design a beauty tutorial cover for me" | Retrieves beauty niche explosive cover data, analyzes styles, generates 3 proposals | | Design by content topic | "Autumn whitening skincare tips, want a professional-looking cover" | Parses content intent, matches professional-style cover patterns | | Upload reference image | "Design a cover referencing this image" + upload | Analyzes reference image style, combines with explosive data to generate proposals | | Select proposal to generate | Reply "Choose proposal 1" | Generates 900×383 cover image per the proposal prompt | ### Output Example After analysis, you'll receive a visual cover analysis report (HTML page) containing: - **Style Classification Display**: Representative covers and characteristic patterns for each style type - **3 Design Proposals**: Each with style name, core visuals, case references, and image generation prompts - **Proposal Selection Area**: Select a proposal to generate the cover image --- ## Use Cases | Scenario | Role | Example Question | Benefit | | --------------------- | ---------------- | -------------------------------------------------------- | ------------------------------------------------------------- | | New article cover | WeChat creator | "Publishing skincare tips today, help me design a cover" | Generate professional cover proposals based on explosive data | | Niche daily updates | Content operator | "Workplace fashion niche, need a set of cover proposals" | Quickly produce multiple style proposals for A/B testing | | Custom with reference | Designer | "Design a cover referencing this image" + upload | Combine reference image with explosive patterns | | Trend-chasing covers | Media editor | "See what covers are hot in the beauty niche lately" | Get recent explosive cover styles, stay on trend | --- ## Important Data Notes - The database only contains data from yesterday to 30 days ago - Default time range is the last 30 days -
README.md 4.4 KB
# 公众号封面图制作 / wechat-cover --- ## 简介 基于全网每日持续收录的 **10w+** 文章数据,获取同赛道爆款封面的视觉元素,通过 AI 分析总结高转化视觉规律,生成贴合文章内容、符合平台流量审美的封面设计方案。 **核心价值** - **海量样本对齐**:每日持续收录爆款文章封面,设计方案有据可依,避免凭空臆造。 - **先析后做**:先完成爆款封面风格分析与分类,再输出设计方案,规律清晰、便于选用。 - **方案+生图一体**:每个方案附带生图提示词,选中后可直接生成 2.35:1 封面图。 **适用对象** - ✍️ **公众号创作者** — 告别封面设计纠结,用爆款规律提升文章点击率。 - 📊 **内容运营** — 按赛道关键词快速产出多组封面方案,A/B 测试更高效。 - 🏢 **MCN / 新媒体团队** — 同赛道批量提案封面,沉淀可复用的视觉套路。 --- ## 功能特性 ### 核心功能 - **关键词驱动**:输入赛道或内容关键词,自动获取同领域爆款封面数据。 - **7 维度封面分析**:逐张分析封面图的文字内容、主体元素、色彩特征、构图布局、视觉风格、点击吸引力、尺寸,深度拆解爆款视觉规律。 - **风格分类汇总**:将相似风格的封面归为同一类,按类型展示代表性封面与特征规律。 - **3 套设计方案**:基于分析结果生成 3 套差异化封面设计方案,各含核心视觉、案例参考与生图提示词。 - **一键生图**:用户选择方案后,直接生成 2.35:1(900×383)封面图,支持上传参考图片。 --- ## 密钥获取与安全说明 - 本技能需要使用环境变量:`REDFOX_API_KEY`。 - `REDFOX_API_KEY` 由 [红狐 hub](https://redfox.hk/settings/api-keys?source=github) (`https://redfox.hk`)提供。 - 请前往 [红狐 hub](https://redfox.hk?source=github) 注册账号,获取 `REDFOX_API_KEY`。 - 配置设备环境变量 `REDFOX_API_KEY` 后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。 - 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。 --- ## 使用指南 直接用自然语言说出你的赛道、内容主题或封面需求即可,无需记忆固定命令。 ### 常用说法速查 | 意图 | 示例话术 | 效果 | | -------------- | -------------------------------------- | ------------------------------------------------- | | 按赛道设计封面 | 「帮我设计美妆教程封面」 | 获取美妆赛道爆款封面数据,分析风格后生成 3 套方案 | | 按内容主题设计 | 「秋冬美白护肤心得,想要专业感的封面」 | 解析内容意图,匹配专业风格封面规律 | | 上传参考图 | 「帮我参考这张图设计封面」 + 上传图片 | 分析参考图风格,结合爆款数据生成方案 | | 选择方案生图 | 回复「选方案 1」 | 按方案提示词生成 900×383 封面图 | ### 输出示例 完成分析后,你将收到一份可视化封面分析报告(HTML 页面),包含: - **风格分类展示**:每类风格的代表性封面图与特征规律 - **3 套设计方案**:各含风格名称、核心视觉、案例参考与生图提示词 - **方案选择区域**:选择后即可生成封面图 --- ## 使用场景 | 场景 | 角色 | 示例问法 | 收益 | | ------------ | ------------ | ---------------------------------- | ------------------------------ | | 新文配封面 | 公众号创作者 | 「今天发护肤干货,帮我设计封面」 | 基于爆款数据生成专业封面方案 | | 赛道日常更新 | 内容运营 | 「职场穿搭赛道,需要一组封面方案」 | 快速产出多组风格方案,A/B 测试 | | 参考图定制 | 设计师 | 「参考这张图帮我出封面」+ 上传图片 | 结合参考图与爆款规律生成方案 | | 热点追封面 | 新媒体编辑 | 「看看最近美妆赛道什么封面火」 | 获取近期爆款封面风格,紧跟热点 | --- ## 重要数据说明 - 数据库仅包含昨天至 30 天前的数据 - 默认时间范围为最近 30 天 -
SKILL.md 7.6 KB
--- name: wechat-cover version: 1.3.0 description: 公众号爆款封面AI设计工具。基于全网每日收录的10w+文章数据,获取同赛道爆款封面视觉元素,通过AI分析总结高转化视觉规律,生成贴合文章内容、符合平台流量审美的封面设计方案。当用户设计公众号封面、生成封面方案、查询爆款封面规律时使用。触发词:公众号封面、封面设计、爆款封面、封面方案、封面生图。 --- # 公众号封面图制作 ## 📋 概述 基于全网每日收录的爆款文章数据,获取同赛道爆款封面的视觉元素,通过AI分析总结高转化视觉规律,生成贴合文章内容、符合平台流量审美的封面设计方案(含案例+生图提示词)。仅在主Agent中执行,不派发给子Agent。 ## 🎯 触发规则 | 场景 | 处理方式 | |------|----------| | 用户提供内容主题/赛道 | 执行任务流程 | | 用户要求生成封面方案 | 执行任务流程 | | 用户上传文案或图片要求分析 | 执行任务流程 | | 用户询问技能功能/用法 | 仅介绍技能 | | 用户未提供明确创作主题 | 仅介绍技能 | ## 📝 术语规范 统一使用"爆款封面",禁止使用:爆炸封面→爆款封面、爆炸数据→爆款数据、抓取数据→获取/查询数据、抓取封面→获取封面。 ## 🔒 数据来源 所有爆款数据必须来自接口,禁止联网搜索、使用其他数据源或脑补数据。数据不足时明确告知用户。 ## 🔑 鉴权 ### 获取 API Key 请前往 [红狐hub](https://redfox.hk/settings/api-keys?source=github) 获取API KEY ### 配置 API Key 方案1: 以OpenClaw为例,将REDFOX_API_KEY添加到~/.openclaw/openclaw.json中: ```json { "env": { "REDFOX_API_KEY": "ak_xxxx..." } } ``` 方案2: 终端配置 ```bash export REDFOX_API_KEY="ak_xxxx..." ``` ## ⚙️ 前置准备 - 依赖:`requests`(`pip install requests`) - 凭证:环境变量 `REDFOX_API_KEY`(详见鉴权章节) - 数据范围:仅含昨天至30天前的数据,默认查询近30天 ## 🔄 操作流程 ### 步骤1:意图解析 结构化解析用户需求,提取4个维度: | 维度 | 说明 | 示例 | |------|------|------| | 内容主题 | 优先领域词 | 护肤、穿搭、美食、职场 | | 内容类型 | 内容形式 | 干货、测评、种草、教程 | | 风格偏好 | 视觉/调性 | 专业、吸引点击、情绪、极简 | | 核心关键词 | 搜索关键词 | 秋冬、美白、护肤、干皮 | 提取2-5个核心关键词(逗号分隔),优先细分领域词,结合风格偏好补充场景词。 ### 步骤2:爆款数据查询 ```bash # 有赛道关键词 python3 scripts/fetch_explosive_covers.py --keyword <关键词1,关键词2,关键词3> # 无赛道关键词 python3 scripts/fetch_explosive_covers.py --keyword "" ``` - 最多5个关键词,总长度≤200字符 - 关键词整体一次传入接口,不做拆分循环调用 - 时间参数默认不传(接口自行决定默认范围);用户指定"近N天"时 startDate = 今天 - (N-1)天 ### 步骤3:智能匹配筛选 | 数据量 | 处理 | |--------|------| | ≥20条 | 直接使用 | | <20条 | 扩展关键词(如:美白→美白、护肤、美白祛斑),重新查询,合并数据 | 筛选规则:按阅读数从高到低排序,取前20条。关键词扩展最多1-2次,每次2-3个相似词。 ### 步骤4:AI图像分析与特征提取 1. 解析脚本返回的JSON数据(含 `articles` 文章数组,以及 `latestHotArticles`、`hotTopics`、`relatedSearches` 辅助数据) 2. 提取 `imageUrl` 字段合并为封面候选池——**直接使用原始值,不做任何修改**(新接口字段名为 `imageUrl`,旧接口为 `coverUrl`,脚本已做兑容) 3. 按互动量从高到低取前20条 4. **逐张分析封面图**(使用原生图片理解能力,直接访问 imageUrl) **7维度分析**: | 维度 | 分析内容 | |------|----------| | 文字内容 | 是否有文字、内容、字体大小、位置、颜色、醒目程度 | | 主体元素 | 人物/产品/场景/图案等主要视觉元素 | | 色彩特征 | 主色调、配色方案、对比度、冷暖色调 | | 构图布局 | 画面结构、元素分布、主体位置、留白处理 | | 视觉风格 | 实拍/插画/拼贴/极简/炫酷等风格类型 | | 点击吸引力 | 痛点/好奇/美感/实用——为什么吸引点击 | | 尺寸检测 | 宽x高,是否合格(≥10px) | **图片过滤规则**: - 空白图片(纯色块、无内容):标注"需过滤",后续所有环节排除 - 小尺寸图片(宽或高 <10px):全部过滤 - 输出前二次检查:确保无空白/小尺寸图片混入 **分类汇总**:将相似风格的封面归为同一类,统计特征规律(分类前先过滤空白图片)。 ### 步骤5:输出HTML分析报告与设计方案 使用 `references/report_template.html`(JS渲染型模板),只需注入 JSON 数据,禁止在输出时临时生成完整 HTML。 1. 复制模板到输出文件:`cp references/report_template.html ./爆款封面分析报告_{关键词}.html` 2. 将分析结果组装为 JSON 对象(格式见 `references/report_template.md`) 3. 用 SearchReplace 在**输出文件**(非模板原文件)中将 `__REPORT_DATA__` 的默认空值替换为实际 JSON 4. 执行 `open ./爆款封面分析报告_{关键词}.html` 在浏览器中打开 **JSON 结构**(只需填充以下字段,无需生成任何 HTML): ```json { "keyword": "用户关键词", "analysisCount": 20, "styles": [{ "name": "", "count": 0, "coreVisual": "", "features": "", "covers": [] }], "plans": [{ "name": "", "coreVisual": "", "case": { "imageUrl": "", "url": "", "title": "", "author": "", "reads": "" }, "prompt": "" }] } ``` | 要求 | 说明 | |------|------| | 模板 | `references/report_template.html`(JS 渲染型,样式/防盗链已内置) | | 数据格式 | 详见 `references/report_template.md` JSON 数据结构章节 | | 封面展示 | 按风格类型分类,每类最多5张 | | 案例参考 | imageUrl 原始值 + 标题(url链接) + 作者 + 仅阅读数 | | 生图提示词 | 严格遵循 2.35:1 横版比例 | ### 步骤6:用户选择方案并生成封面图 **⚠️ 先询问用户,等回复后再生成——不要在用户选择前就生成封面图!** **第一阶段**(输出报告后立即执行):HTML模板末尾已包含方案选择区域,展示报告后停止,等待用户回复。 **第二阶段**(用户回复后执行): 1. 确认用户选择的方案(1/2/3)及其生图提示词 2. 如用户上传了图片,用原生图片理解能力分析 3. 使用原生图像生成能力生成封面图(2.35:1,900x383像素) 4. 直接展示图片,不需要HTML包裹 ### 步骤7:输出前自检 | 检查项 | 内容 | |--------|------| | 风格类型 | 每类有:名称、频次、核心视觉、关键特征、封面示例 | | 三个方案 | 各有风格名称、核心视觉、案例参考(不重复)、生图提示词 | - 封面图链接使用 imageUrl 字段原始值 | 图片过滤 | 无空白图片、无小尺寸图片 | | 用户交互 | 已询问方案选择并等待回复 | ## ⚠️ 注意事项 - 封面图容器比例 2.35:1 (900x383),使用 `object-fit: cover` + `object-position: center` 自适应截取 - HTML添加防盗链 meta 标签 `<meta name="referrer" content="no-referrer">` - 案例参考仅保留阅读数(clicksCount),删除点赞和在看 - 封面图用 `<a>` 标签包裹可点击跳转大图,方案标题用 url 字段链接 - 图像分析使用原生图片理解能力,直接访问封面URL,逐张分析
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.