Install
openclaw skills install @dunkong/wechat-topic-radar公众号选题雷达。支持三种入口:① 种子关键词扩散;② 微信搜一搜实时热搜榜转译;③ 对标公众号历史文章聚类。抓取公开数据后,用本地启发式模型计算「需求热度 / 竞争度 / 机会分」,输出机会矩阵、蓝海选题清单、账号内容版图与内容缺口。当用户提到不知道写什么、找选题、蓝海词、长尾词、内容机会、选题调研、竞品选题分析、公众号选题、追热点选题、对标账号、内容审计等场景时触发。
openclaw skills install @dunkong/wechat-topic-radar执行门槛:所有真实采集(包括 --hot)均需先按实时商品价格向用户说明范围与费用,取得授权后在命令追加 --yes;下方真实采集示例也遵循此规则。已有明确授权不重复询问。--self-test 和 --from-json 离线渲染不需要此开关;没有 --yes 不发采集请求。密钥建议使用本机 WM_API_KEY,兼容 MANGYUN_API_KEY、MANGE_API_KEY。
解决内容团队最大的时间黑洞:今天写什么。
不是给一堆数据让用户自己看,而是让接口取证、AI 给结论:
核心价值不在接口调用,在评分模型、可信度处理与 AI 洞察层:被微信展示上限截断的阅读数不参与均值; 展示值(「6.2万」)与精确整数分列标注;评分公式完全公开可审计。
三种模式分别回答不同的问题:
| 模式 | 你需要什么 | 它回答什么 |
|---|---|---|
关键词模式 --seed | 已有一个领域词 | 这个领域里,哪些细分角度还有机会 |
热点模式 --hot | 想追今天的热搜 | 今天搜一搜在热什么,哪些能转译成可写选题 |
账号模式 --account | 有对标账号但不知道学什么 | 这些号在写什么、什么题材数据好、哪些主题它们没碰过 |
触发后,先问用户想从哪个入口开始,不要默认直接跑关键词模式。
直接用大白话说需求即可,以下说法都会命中:
也可以跳过提问,把入口和参数一次说清:
# 关键词:给我一个领域词
--seed "习惯养成"
# 热点:看今天搜一搜热什么
--hot
# 账号:给我对标号的任意一篇文章链接
--account "广东教育传媒|https://mp.weixin.qq.com/s?__biz=XXX"
| 你手头有什么 | 用哪个 |
|---|---|
| 有领域方向,想找细分角度 | --seed 关键词 |
| 想追今天的流量 | --hot 热点 |
| 有对标账号,想知道学什么 | --account 账号 |
| 步骤 | 接口 | 地址 | 单价 |
|---|---|---|---|
| 扩散 | 23 搜一搜推荐词 | POST /openapi/wechat-native-search-suggestions/search/suggestions | 实时价格 |
| 搜文章 | 14 搜一搜文章 | POST /openapi/wechat-native-search-articles/search/articles | 实时价格 |
| 互动数据 | 1 公众号文章互动数据 | POST /openapi/wechat-native-article-metrics/articles/metrics | 实时价格 |
| 内容规格 | 3 公众号文章正文(format=analysis) | POST /openapi/wechat-native-article-content/articles/content | 实时价格 |
| 账号文章 | 4 公众号历史文章 | POST /openapi/wechat-native-account-articles/accounts/articles | 实时价格/页 |
| 热搜榜 | 20 搜一搜搜索引导 | POST /openapi/wechat-native-search-guide/search/guide | 实时价格 |
第 4 步原本用接口 30(完整报告 实时价格),已改为接口 3 的 analysis 模式。 实测两者返回的统计字段完全一致,单价只有 1/8。详见下方实测记录第 7 条。
X-API-Key(勿写入前端 / 日志 / 公开仓库)Idempotency-Key;脚本仅在自行重试同一请求时复用同一个值,避免重复扣费cursor 回传;脚本每词只取单页(limit 即每词篇数)这些是实测得到的、契约文档未逐一说明的行为,脚本已做对应处理:
data.items[] 实际是对象数组,每项含 word / wordHighlight / reportFlag 等。
契约只声明 items 为数组未声明子字段 → 脚本防御式读取 item["word"],取不到则跳过。
返回约 10 个推荐词。items[] 除契约字段外还返回 source 对象,其中:
source.title = 公众号名称(契约未声明,但很关键,账号集中度要靠它算)source.tag[].title = 页面展示值,如「阅读 6.2万」——属展示值不是精确值,脚本只在精确值缺失时标注显示title / accountName 经常返回空字符串。
→ 标题与账号名必须取自接口 14,接口 1 只用于补数据。这是最容易踩的坑。doc_url(带 chksm、scene=7#rd 也能解析),
无需先做短链解析,省一道调用。consumption 在当前账户实测为 0(平台侧对已有近期快照的文章免单)。
实测 3 次运行 × 80 篇文章,240 次接口 1 调用全部 consumption=0。
→ 这是当前 API Key 所属账户的计费特性,不具备普遍性,换账户、换时间都可能恢复收费。
→ 因此一切成本估算与方案选型均以契约单价为准,不得把免单计入考量。
→ 脚本按响应里的 consumption 累计,实际花多少以输出为准。^https://mp\.weixin\.qq\.com/s(?:/|\?|$) 的链接才调接口 1/3,
其余类型(视频号、小程序等)直接跳过,避免浪费额度。format=analysis 可完全替代接口 30 的内容统计,单价 实时价格 vs 实时价格。
同一篇文章实测,data.content 与接口 30 的 contentAnalysis 逐字段相同
(characterCount / chineseCharacterCount / latinWordCount / paragraphCount /
estimatedReadMinutes / fingerprintSha256),
data.media 与 mediaSummary 相同(imageCount / videoCount / audioCount /
linkCount / externalLinkCount / linkedDomains)。
→ 本 skill 只需要内容规格,接口 30 打包的 article / engagement / job 全是冗余,
因此选接口 3。需要文章身份或互动字段时再回头用接口 30。接口 20「搜一搜搜索引导」在 query 留空时,返回微信搜一搜当前的实时热搜榜,
POST /openapi/wechat-native-search-guide/search/guide,实时价格/次。
这是除「种子词扩散」之外的第二条候选词来源,适合追热点的场景。
实测返回结构(契约只声明了 query / data / source,以下为实测补充,按防御式读取):
data.count —— 热词条数(实测 8)
data.items[] —— 热词列表,每项含 word / id / operationType / source
data.items[].id —— 格式 "{排名}-hotscore-{热词}",可直接取排名
data.groups[] —— 分组,实测只有一组,title = "搜索发现"
data.guideSource —— 实测 "page-store"
热搜榜 ≠ 选题清单,这是最容易踩的坑。 热词多为新闻事件(讣告、赛事、案件), 直接拿原词去搜,往往样本极少、时效性过强,评分不可信。 正确做法是先由 AI 把热词转译成可长期搜索的选题角度,再用转译后的词跑分析:
| 热词 | 直接搜的问题 | 转译后的选题词 |
|---|---|---|
| 扶老人被索赔店主捐出12万捐助款 | 事件太新,文章少 | 扶老人反被索赔 / 好人被讹 |
| 中国人口出生率回落:男孩仍比女孩多 | 新闻口语化 | 出生率下降原因 / 生育率 |
| 全国社会物流总额同比增长5.0% | 财经号可直搜 | 物流行业趋势(可直接用) |
| iG战胜TT | 24 小时后无人搜 | 电竞号可直搜,其余放弃 |
同时要主动判断哪些不能碰:时政案件、安全事故、讣告类——追热点的风险高于收益。 这类价值判断应由 AI 层给出,脚本本身不做判断。
--api-key 或环境变量 MANGE_API_KEY)触发后不要直接跑脚本。先问:
「你想从哪个入口找选题?
- 给关键词,我帮你扩散蓝海长尾词;
- 看今天热搜,我帮你筛能追的角度;
- 给对标公众号,我帮你分析它们的内容版图和缺口。」
根据答案进入对应模式。
--seed适合:已有领域方向,想找细分蓝海词。
# 标准用法(推荐,按单价计约 实时价格)
python scripts/topic_radar.py \
--api-key "YOUR_API_KEY" \
--seed "习惯养成" \
--output 选题雷达_习惯养成.html \
--markdown 选题雷达_习惯养成.md
# 全面模式:二级扩散 + 每词 12 篇 + 5 个深度采样(按单价计约 实时价格)
python scripts/topic_radar.py --api-key "$KEY" --seed "私域运营" \
--expand 2 --extra-words 15 --per-word 12 --deep 5 \
--output radar.html --json raw.json
# 只想看近一周的机会
python scripts/topic_radar.py --api-key "$KEY" --seed "AI 写作" \
--publish-time week --output radar.html
--hot适合:追今天搜一搜热搜,找能写的角度。
# 1. 拉取实时热搜榜,输出可转译的热词 JSON
python scripts/topic_radar.py --api-key "$KEY" --hot \
--json hot_words.json
# 2. 人工/AI 挑选并转译出 2-5 个可写选题词,一次性跑分析
python scripts/topic_radar.py --api-key "$KEY" \
--seeds "扶老人反被索赔,好人被讹,见义勇为法律风险" \
--output 热点_扶老人.html
热点模式分两步:
--hot 只拉榜单,花 实时价格,输出 hot_words.json。不要把热搜原词直接当
--seed跑分析。新闻事件往往样本太少、时效太短,评分不可信。
--account适合:对标竞品号、做自审、找内容缺口。
# 输入 2-3 个公众号的文章链接(每号可命名,命名在前用 | 分隔)
python scripts/topic_radar.py --api-key "$KEY" \
--account "广东教育传媒|https://mp.weixin.qq.com/s?__biz=XXX" \
--account "学前洞见|https://mp.weixin.qq.com/s?__biz=YYY" \
--pages 2 --max-articles 20 --topics 8 \
--output 内容版图_教育号.html --markdown 内容版图_教育号.md
# 只审计一个号(自审)
python scripts/topic_radar.py --api-key "$KEY" \
--account "https://mp.weixin.qq.com/s?__biz=ZZZ" \
--pages 3 --max-articles 40 --topics 10 \
--output 我的号内容审计.html
账号参数:
--account 可重复多次;链接支持普通文章 URL 或 gh_ 开头的原始 ID名称|URL,因为接口不一定能取到账号名--pages 每号翻页数;接口 4 每页最多 20 篇--max-articles 每号最多分析的篇数--topics 每号提取的主题标签数账号模式输出:
脚本只负责采集与计算,不会「读」数据,也不会替你写标题、给执行顺序。 想让报告真正变成「可直接照着做」的产品,建议加一层 AI 解读:
# 第一步:采集 + 落 JSON(关键词/账号模式均适用)
python scripts/topic_radar.py --api-key "$KEY" --seed "习惯养成" \
--json raw.json --output radar.html
# 第二步:Agent 读 raw.json,产出 summary.json
# 参考示例:本项目工作区 out/ai_summary_习惯养成.json
# 第三步:用已有数据 + summary 重新渲染,不调用接口、不扣费
python scripts/topic_radar.py --from-json raw.json --summary summary.json \
--output radar_with_ai.html --markdown radar_with_ai.md
AI 洞察 JSON 结构:
{
"headline": "一句话结论(放在报告顶部 AI 结论区)",
"verdict": "怎么读这张图(支持 **加粗**,会渲染成 HTML)",
"picks": [
{
"word": "选题词",
"tag": "最推荐 / 竞争最低 / 机会分第一,但要挑打法",
"why": "机会原因:为什么值得做,必须带数据判据",
"audience": "目标读者:谁来读、他们此刻的需求是什么",
"angle": "推荐角度:用哪种内容形态切进去",
"competition": "竞争程度:高/中/低,凭什么敢这么判断",
"action": "具体怎么做:篇幅、形态、发布建议",
"titles": ["标题1", "标题2", "标题3"],
"outline": ["大纲1", "大纲2", "大纲3"]
}
],
"avoid": [
{"word": "别碰的词", "reason": "为什么别碰"}
],
"sequence": "推进顺序建议"
}
字段里有两个不能由 AI 编造:
参考示例:
out/ai_summary_习惯养成.jsonout/ai_summary_内容版图.json账号模式的 AI 洞察重点不同:
headline:给出各账号的「路子」对比(如行政渠道 vs 实操内容)verdict:解释阅读与互动的倒挂、主题差异、可借鉴的打法sequence:建议先补哪个缺口、先学哪个号、避免什么方向picks / avoid 可省略,也可用来推荐具体选题方向--snapshot关键词模式支持跨运行对比。每次真实采集(--from-json / --self-test 不会写入)
都会把该种子词的指标追加到快照文件,下次运行自动与上一次比较。
# 第一次:创建快照
python scripts/topic_radar.py --api-key "$KEY" --seed "习惯养成" \
--snapshot radar_snap.json --output radar.html
# 一周后重跑:报告里每个词会显示「较 08-22:机会分 +5.2 · 阅读 −300」
python scripts/topic_radar.py --api-key "$KEY" --seed "习惯养成" \
--snapshot radar_snap.json --output radar.html
快照文件是本地 JSON,按种子词分桶,每个词保留最近 24 次记录。 首次运行时趋势显示为「首次扫描,暂无趋势基准」——没有对比基准就不编造变化量。
--excelExcel 用标准库手写(zip + XML),不引入 openpyxl 等第三方依赖, 避免让使用者先装环境才能导出表格。
python scripts/topic_radar.py --api-key "$KEY" --seed "习惯养成" \
--output radar.html --markdown radar.md --excel radar.xlsx
关键词模式 6 个 Sheet:
| Sheet | 内容 |
|---|---|
| 选题机会 | 排序后的词 + 机会分 / 可信分 / 证据等级 / 象限 / 趋势 |
| 关键词信号 | 原始观测值:联想位次、样本数、新鲜度、账号集中度、大号占比 |
| 文章样本 | 每个词下的文章明细:标题、公众号、阅读、互动、各互动率、链接 |
| 机会卡 | AI 洞察结构化字段:机会原因 / 目标读者 / 推荐角度 / 竞争程度 / 大纲 |
| 趋势快照 | 每个词历次扫描的记录(配合 --snapshot 累积) |
| 费用明细 | 按接口拆分的调用次数与消费,取自响应里的 consumption 累加 |
账号模式 6 个 Sheet:账号概览 / 主题标签 / 文章样本 / 内容缺口 / AI 洞察 / 费用明细。
费用明细只呈现真实累计值,不按预计调用数反推。
| 参数 | 默认 | 说明 |
|---|---|---|
--seed | — | 种子关键词(关键词模式;自检 / --from-json 时可省略) |
--seeds | — | 逗号分隔的多个候选词,跳过推荐词扩散,直接分析(热点模式转译后用) |
--hot | False | 热点模式:拉取搜一搜实时热搜榜 |
--snapshot | — | 趋势快照文件路径:每次运行追加结果,下次运行自动对比上次 |
--account | — | 账号模式;可多次传入,格式 `名称 |
--pages | 2 | 账号模式每号翻页数(每页 20 篇) |
--max-articles | 20 | 账号模式每号最多分析篇数 |
--topics | 8 | 账号模式每号提取的主题标签数 |
--per-word | 8 | 每词抓几篇文章,1-50;越大越准越贵 |
--sort | hot | hot 最热 / latest 最新 / comprehensive 综合 |
--publish-time | halfYear | any/day/week/halfYear。默认半年:样本够多且让「新鲜度」维度有区分度(any 下样本多为旧文,新鲜度会全部归零) |
--expand | 1 | 2 = 对一级推荐词再扩散一层(更全,成本约翻倍) |
--extra-words | 15 | --expand 2 时额外纳入的二级词数量 |
--deep | 3 | 每个蓝海词采样几篇内容规格(多篇取中位数,更准确);0 关闭 |
--excel | — | Excel 工作簿(.xlsx,多 Sheet,用标准库手写,无需安装任何包) |
--json | — | 把采集结果写成 JSON,方便 --from-json 复用或交给 Agent 做 AI 洞察 |
--from-json | — | 复用已有 JSON 数据重新渲染报告,不调用接口、不扣费(通常搭配 --summary) |
--summary | — | AI 洞察 JSON 文件路径,见上方「AI 洞察 JSON 结构」 |
--self-test | False | 离线自检,用内置示例数据跑通全链路,不联网不扣费 |
--rate | 4 | 每秒请求数上限,限额 300/分钟,4 很安全 |
present_files 展示 HTML 报告。主脚本,结构:
Client — 全局限流(默认 4 req/s)+ 失败重试(复用 Idempotency-Key)+ 成本累计fetch_suggestions() — 接口 23,防御式取 wordfetch_search() — 接口 14,过滤非文章链接,提取 source.title 与展示阅读值fetch_metrics() / fetch_report() — 接口 1 / 30,失败返回 None 不中断fetch_account_articles() — 接口 4 + 接口 1,抓账号历史文章与互动数据fetch_hot_words() — 接口 20,拉取实时热搜榜extract_topics() — 标题 n-gram + 最长公共串扩展的本地主题聚类compute_gaps() — 多账号主题交叉,输出「某号高频做、其他号没做」的内容缺口score_word() — 评分模型(见下)pick_angle() — 按互动结构给出切入角度建议build_html() / build_markdown() — 关键词模式报告build_account_html() / build_account_markdown() — 账号模式报告self_test_dataset() — 内置示例数据,--self-test 时不联网不扣费必须向用户说明这是本地计算的排序参考,不是平台指标。
需求热度 = 100 × (0.35 × 词位次 + 0.40 × 互动热度 + 0.25 × 新鲜度)
词位次 —— 该词在搜索联想结果中的相对位置,越靠前说明联想越常见(0~1)
互动热度 —— 样本互动率基点(ratesBps.engagement)中位数,批内 log10 相对归一
新鲜度 —— 近 90 天文章占样本比例
竞争度 = 100 × (0.50 × 头部水位 + 0.30 × 账号集中度 + 0.20 × 大号占比)
头部水位 —— 样本阅读中位数,批内 log10 相对归一
账号集中度 —— 1 − 不同账号数 / 样本数,越高说明被少数号把持
大号占比 —— 阅读 ≥ 1 万的样本占比(仅表示高阅读样本,不代表真实粉丝规模)
机会分 = 需求热度 − 竞争度(区间 −100 ~ +100,越高越蓝海)
四象限:以全体词的需求、竞争中位数为轴切分
蓝海 = 高需求低竞争 主战场 = 高需求高竞争
红海 = 低需求高竞争 冷淡区 = 低需求低竞争
机会分只说明「样本呈现出的形态」,不说明这个形态有多可信。
实测:同样的阅读量与互动率,2 篇和 12 篇样本会算出完全一样的机会分。
因此引入「证据充分度」与「可信分」:
- **证据充分度**:有效样本数 ≥6 篇为「高」、3–5 篇为「中」、<3 篇为「低」,单独显示,不混入机会分
- **可信分** = 机会分 ×(0.45 + 0.55 × 有效样本数 / 6)
- 默认排序按可信分进行,避免 2 篇样本的词凭运气占据榜首
- 机会分本身不做修改,保持「需求 − 竞争」的定义纯粹可审计
为什么用批内相对归一而不是绝对区间:实测同批次候选词的阅读中位数可能只有 4453187,
若硬编码「1000100000」这样的绝对区间,多数词会被压成 0,竞争度完全失去区分度。
不同领域(金融大号 vs 小众教育号)的阅读水位本身不可比,而用户要的答案是
「这批词里哪个相对更蓝海」,本质是批内排序问题,因此按本批次分布拉开到 [0.1, 0.9]。
防御机制:若批内极差不足 2 倍(log10 跨度 < 0.3),说明差异可能是噪声, 一律给中性值 0.5,避免把微小差异放大成虚假分差。
可信度处理(这是产品与裸数据的分界线):
readCapped=true 的样本只计数、不参与阅读中位数计算(真实值不可知,只是上限投影)readNum 为 null 的样本不参与数值计算commentNum 为 null 时不参与切入角度判断(契约:null 与 0 含义不同)切入角度判定(基于 ratesBps 子项占比,本地启发式):
| 领先指标 | 建议 |
|---|---|
| 分享率 | 自带转发属性 → 清单 / 观点 / 避坑类 |
| 收藏率 | 读者倾向留存 → 攻略 / 资料 / 步骤类 |
| 点赞率 | 情绪共鸣强 → 故事 / 经历 / 态度类 |
按用户选择的模式计算最大调用次数,将请求写成 JSON 数组后运行 python scripts/platform_contract.py --plan plan.json。
计划条目格式:{"path":"/openapi/wechat-native-article-metrics/articles/metrics","params":{"url":"实际文章链接"},"count":8}。
关键词模式包括推荐词扩散、每词搜索、每篇指标和深度正文;账号模式包括资料查询、翻页和每篇指标;不能漏算组合调用。
配置同一个 MANGE_API_KEY 后读取账户实时价格。公共价格只用于未配置 Key 的初步估算,执行以账户目录为准。
拿不到价格就说明暂时不能准确报价,不把历史价格当实时价格。扩大词数、页数或采样范围前重新估算并确认。
实际消费使用 CostLedger,不以返回条数倒推消费。用户已授权的同一范围不反复询问。
评分仅为样本内相对参考,不等于全网需求、真实粉丝数或爆款概率。交付选题角度、大纲和证据,不只交评分。
请基于曼格云 API 的当前文档,帮我创建一个可以重复使用的专属 Skill。
我的用途:按我的公众号定位输出可落地的选题卡并持续复盘。
沿用本次确认的输入、筛选条件、分析口径和输出格式,先列出实现范围让我确认。
只使用当前产品目录实际提供的字段;在执行前获取我的实时价格并估算总费用。
请求必须携带我这个新 Skill 独立的 User-Agent 名称和版本,不冒用现成 Skill 标识。
API Key 只从本机环境变量读取,不放到对话、代码或导出报告。
先用小样本验证;未经我同意不自动扩大采集范围、不创建定时任务。
文档入口:https://api.we-media.cn/client/ai-guide API 市场与逐产品 AI 文档:https://api.we-media.cn/client/products 公开产品目录:GET https://api.we-media.cn/api/v1/public/products 配置 Key 后,预估使用同 Key 请求 GET https://api.we-media.cn/api/v1/products,考虑参数附加价与调用次数;不能把价格写死。 创建专属 Skill 不代表免除 API 调用费用,也不保证结果、收益或留存率。
本 Skill 的固定标识是 wechat-topic-radar/1.4.1 (source=clawhub)。
所有平台网络请求(包括目录、余额、免费接口、付费接口、上传票据)必须携带 User-Agent;随附脚本已实现。自写 curl、Python、JS 请求或借用其他脚本时也必须传这个标识,并携带 X-WM-Source: wechat-topic-radar 和 X-Source: clawhub,不要往业务 JSON 塞 source 字段。
不得只依靠浏览器默认 User-Agent 或通用 HTTP 工具名做归因。若宿主工具不允许设置请求头,用随附脚本。
第三方视频下载与对象存储上传不发送平台 Key、Authorization 或 Cookie;仅平台请求携带平台鉴权。
不要输出密钥、上传凭证或完整授权头;只把任务需要的公开数据导出到用户指定的本地文件。