做内容的朋友,大概都经历过这种时刻:精心写完一篇文章,发出去,阅读数定格在两位数。翻了翻后台,心里开始犯嘀咕,是写得不够好?还是这个选题本来就没人感兴趣?这两个问题,其实只有第二个是可以在动笔前就回答的。内容做不好,一般有两种情况:一种是写得不好,一种是选题没需求。 前者靠练,但后者完全可以在动笔前用数据验证清楚。
我们平时选题,大多靠感觉,觉得这个话题最近很热、觉得这个方向有人关注、或者单纯是自己想写。这本身没什么问题,但有一个很大的漏洞:你觉得热的词,可能早就被写烂了,平台算法早就不给新内容权重了。你觉得冷门的词,可能正好是「搜的人多、写的人少」的蓝海,写一篇 80 分的内容就能排第一。这就是为什么要做关键词潜力分析。在动笔之前,先用数据搞清楚这个词在公众号生态里的供需关系:
- 这个词有多少人在搜、现有文章能读到多少量?(需求天花板)
- 历史上有多少篇文章在写这个词,近期还有多少新内容?(供给竞争)
- 已有的文章质量怎么样,有没有超车空间?(内容机会)
三个问题都清楚了,你才知道「要不要写」「怎么写才有机会」。
一、关键词分析能告诉你什么
这是一个常被忽略的认知:公众号的搜索行为,本身就是用户需求的真实投票。用户在微信里搜「私域运营」,是因为他有这个需求,想找答案。搜索量大的词,代表需求是真实存在的;反过来,如果一个词几乎没人搜,就算写得再好,流量也很有限。但光有需求还不够。一个词搜索量大,同时已经有几千篇高质量文章在占位,新人去硬刚,概率也不高。所以,关键词潜力分析的本质,是判断「需求 vs 供给」的比值:
- 需求大、供给少 → 蓝海词,值得写
- 需求大、供给也大但质量差 → 有超车机会,值得写
- 需求小、供给少 → 冷门词,谨慎
- 需求小、供给大 → 红海,除非有很强的差异化,否则跳过
具体到公众号,我们要判断三件事:
① 这个词的需求天花板有多高:看「按阅读数排序」的前 20 篇文章,平均阅读多少。这反映的是:如果你写这个词,理论上能到的天花板在哪里。如果前 20 篇均阅读才几百,说明流量池本身就很小。
② 现有内容有没有超车空间:看前 20 篇的「赞阅比」(点赞/阅读)和平均字数。赞阅比低,说明现有内容共鸣感一般;字数普遍偏短,说明都是浅薄内容,你写一篇 3000 字深度文章就能直接超车。
③ 近期供给是不是新鲜:看「按时间排序」的近 7 天,有多少篇文章在写这个词。如果近 7 天只有零星几篇,说明近期供给空白,微信算法更可能给新内容权重,是发布的好时机。
今天我们就用一个微信文章搜索接口 + n8n,把这套分析流程自动化,每次评估一个或多个关键词,只需要跑一遍流程,结果自动出来。
二、用一个接口把三件事全搞清楚
微信搜索数据从哪来?微信的封闭生态导致获取数据比较困难,我用的是极致了API这个专做微信公众号的接口平台。用「关键词搜索微信文章」这个数据库接口,支持按阅读数或时间排序,能拿到每篇文章的标题、正文、阅读数、点赞数、再看数、发布时间、账号名等字段,以及这个关键词在数据库里的总文章数(total 字段)。
这个接口我们可以分两次查询,分别读不同的信息:
| 查询 | 参数 | 目的 |
|---|---|---|
| 查询 A | sort_type=1(按阅读数),period=720 | 历史高质量内容:判断天花板 + 竞争格局 + 内容质量 |
| 查询 B | sort_type=2(按时间),period=7 | 近 7 天供给:判断近期竞争和发布时机 |
这两次查询目的不同、参数不同,在n8n可以分开成两个 HTTP 节点,再用 Merge 节点合并后统一计算。后续在n8n配置里会说,好,接下来我们看看n8n如何配置。
三、n8n 工作流配置
整体结构
这个工作流大概是这样一个流转逻辑
Schedule Trigger
↓
Code in JavaScript(设置关键词列表)
↓
Loop Over Items
├──→ HTTP_Request_A(热度排序)──→ Merge(input 1)
└──→ HTTP_Request_B(时间排序)──→ Merge(input 2)
↓
Code(数据加工)
↓
Create chat completion(DeepSeek)
↓
Loop Over Items(闭环,继续下一个)
在n8n里这样来配置

节点1:Schedule Trigger
定时节点。我们可以设置每周触发一次,平时也可以手动执行。
节点2:Code in JavaScript(设置关键词列表)
选择code节点,这个节点的主要目的是把我们要搜索的关键词维护进去。

比如我们设置”私域运营” 和”企业微信运营”两个关键词
return [
{ json: { keyword: "私域运营" } },
{ json: { keyword: "企业微信运营" } }
];
执行后每个关键词输出一个 Item。
要分析哪些词,直接在这里加减就行。
当然你也可以把关键词维护在多维表格,然后用多维表格接口来获取关键词。不过code的节点就比较简单一些。
节点3:Loop Over Items
循环节点。因为我们分析的关键词不止一个,所以循环这个动作是必要的。
这个节点接收上面 Code 节点输出的关键词列表,每次循环取一个关键词进入后续节点。Loop 节点有两个出口:
- done(上方):所有关键词跑完后触发,不需要接其他节点。
- loop(下方):每次循环的当前 Item,同时连到 HTTP A 和 HTTP B。

节点4:HTTP_Request_A(热度排序)
这个http节点,就是对接极致了API,获取搜索数据的节点了。
A查询是按热度进行排序。

①Method:POST
②URL:https://www.dajiala.com/fbmain/monitor/v3/kw_search
③Headers:Content-Type: application/json
④Body:
{
"kw": "{{ $json.keyword }}",
"sort_type": 1,
"mode": 1,
"period": 720,
"page": 1,
"key": "你的API Key",
"any_kw": "",
"ex_kw": ""
}
sort_type=1 按阅读数排序,period=720 取近两年,每次返回 20 条。出口连到 Merge 节点的 Input 1。
节点5:HTTP_Request_B(时间排序)
B查询也是用同样的接口,只不过查询的条件不同
同样的接口,只需改两个参数
{
"kw": "{{ $json.keyword }}",
"sort_type": 2,
"mode": 1,
"period": 7,
"page": 1,
"key": "你的API Key",
"any_kw": "",
"ex_kw": ""
}
sort_type=2 按时间排序,period=7 只取近 7 天。出口连到 Merge 节点的 Input 2。
节点6:Merge


Mode 选 Combine,Combine By 选 Position。按位置合并,把 HTTP A 的结果和 HTTP B 的结果合成一个 Item,进入下一个 Code 节点统一计算。
节点7:Code(数据加工)
这里用code节点。这是核心的计算节点,要把两次查询的结果合并,并且提取所有可量化指标

代码如下:
// 分别引用两个 HTTP 节点的返回结果
const resultA = $node["HTTP_Request_A(热度排序)"].json;
const resultB = $node["HTTP_Request_B(时间排序)"].json;
const articlesA = resultA.data || [];
const totalSupply = resultA.total || 0;
const articlesB = resultB.data || [];
const recent7Supply = resultB.data_number || articlesB.length;
// ── 需求分析 ──────────────────────────────
// 前20篇平均阅读
const avgRead = articlesA.length > 0
? Math.round(articlesA.reduce((s, a) => s + (a.read || 0), 0) / articlesA.length)
: 0;
// 前20篇最高阅读
const maxRead = articlesA.length > 0
? Math.max(...articlesA.map(a => a.read || 0))
: 0;
// 近7天最高阅读
const recentMaxRead = articlesB.length > 0
? Math.max(...articlesB.map(a => a.read || 0))
: 0;
// ── 内容质量分析 ──────────────────────────
// 平均赞阅比(点赞/阅读,反映共鸣程度)
const avgLikeRate = articlesA.length > 0
? (articlesA.reduce((s, a) => {
return s + (a.read > 0 ? a.praise / a.read : 0);
}, 0) / articlesA.length * 100).toFixed(2)
: "0";
// 平均再看阅比(再看/阅读,反映收藏价值)
const avgLookingRate = articlesA.length > 0
? (articlesA.reduce((s, a) => {
return s + (a.read > 0 ? a.looking / a.read : 0);
}, 0) / articlesA.length * 100).toFixed(2)
: "0";
// 前20篇平均字数(反映内容深度)
const avgWordCount = articlesA.length > 0
? Math.round(
articlesA.reduce((s, a) => s + (a.content ? a.content.length : 0), 0) / articlesA.length
)
: 0;
// 原创率
const originalCount = articlesA.filter(a => a.is_original === 1).length;
const originalRate = articlesA.length > 0
? Math.round(originalCount / articlesA.length * 100)
: 0;
// ── 竞争格局分析 ──────────────────────────
// 账号分散度(前20来自多少个不同账号,越高说明越分散、越容易超车)
const uniqueAccounts = new Set(articlesA.map(a => a.wx_id)).size;
const accountSpread = articlesA.length > 0
? Math.round(uniqueAccounts / articlesA.length * 100)
: 0;
// 主要竞争账号(前5个去重账号名)
const topAccounts = [...new Set(articlesA.map(a => a.wx_name))]
.slice(0, 5)
.join("、");
// ── 当前关键词(从上游 Loop 传入)────────────
// Loop 里每个 Item 都带着 keyword 字段,从 input 取
const keyword = $node["Loop Over Items"].json.keyword || "";
// ── 输出 ──────────────────────────────────
return [{
json: {
keyword,
totalSupply, // 历史总供给量
recent7Supply, // 近7天供给量
avgRead, // 前20均阅读
maxRead, // 前20最高阅读
recentMaxRead, // 近7天最高阅读
avgLikeRate: avgLikeRate + "%", // 平均赞阅比
avgLookingRate: avgLookingRate + "%", // 平均再看阅比
avgWordCount, // 平均字数
originalRate: originalRate + "%", // 原创率
accountSpread: accountSpread + "%", // 账号分散度
topAccounts, // 主要竞争账号
}
}];
这段代码做的事情,用一句话概括就是:把两次 API 查询拿回来的原始数据,加工成AI能直接看懂的指标数字。
简单来说这段代码分成了四个部分
①取出原始数据:HTTP A 和 B 各自拿回来的是一大堆原始 JSON 数据,这里就是把它们分别存到两个变量里,后面方便引用。
②需求分析——这个词有多少人在看:拿到前 20 篇文章的阅读数,算一个平均值和最大值。平均值代表「这个词正常能拿到多少阅读」,最大值代表「天花板在哪里」。reduce 是一个累加函数,把 20 篇的阅读数一个个加起来,再除以 20,就是平均值。
③内容质量分析——现有内容好不好:这四个指标是用来判断「现有内容够不够好、有没有超车空间」的:
- 赞阅比:把每篇文章的点赞数除以阅读数,算出比例,再对 20 篇取平均。比例越低,说明读者看完没被打动,你有机会写出更有共鸣的内容。
- 再看阅比:同理,再看数除以阅读数。再看比点赞更难得,高再看率说明读者觉得「值得收藏」。
- 平均字数:把每篇正文的字符长度加起来取平均。字数少说明现有内容普遍浅薄,写一篇深度长文就能脱颖而出。
- 原创率:统计 20 篇里有多少篇标了「原创」,算百分比。原创率低说明这个词下大多是转载内容,认真写一篇原创更容易被算法推荐。
④竞争格局分析——是谁在占这个词:Set 是一个去重工具,把 20 篇文章的账号 ID 去重后统计有多少个不同账号。如果 20 篇来自 20 个不同账号,分散度就是 100%,说明没有大号垄断这个词,你进来有机会。如果 20 篇有一半来自同一个账号,分散度只有 10%,说明这个词已经被某个头部账号占稳了,竞争很难。topAccounts 则是把前 5 个账号名列出来,方便你直接看「在跟谁竞争」。
最后,代码把所有指标打包输出。把上面算出来的所有数字,整理成一个结构化的 JSON 对象,传给下一个节点(AI)。AI拿到这些数字后,就能对照判断标准给出「高潜力/中/低」的结论了。
节点8:Create chat completion(DeepSeek)
这里我们需要一个AI节点,来分析上个节点输出的指标数据。
我们用deepseek节点来做。(毕竟deepseek还是比较便宜)

首先在Credential to connect with字段,把deepseek的api key维护进去。deepseek的api key需要去deepseek开发者平台去申请充值。
其他的配置:
Resource 选 Chat,Operation 选 Complete,Model 选 deepseek-chat,Simplify 开启。
然后点「Add Message」添加两条:
第一条,Role 选 System,prompt可以这样维护
你是一个公众号内容策略顾问。我会给你一个关键词的量化数据,请根据以下判断标准做分析:
供给判断:
- 历史总供给 < 500篇 = 供给很少;500-2000篇 = 中等;> 2000篇 = 供给充足
- 近7天供给 < 5篇 = 近期空白;5-20篇 = 一般;> 20篇 = 近期竞争激烈
需求判断:
- 前20均阅读 > 5000 = 需求旺盛;1000-5000 = 需求一般;< 1000 = 需求偏冷
- 最高阅读越高,说明天花板越高
内容质量判断(现有内容越差,超车机会越大):
- 平均赞阅比 < 1% = 共鸣感差;1%-3% = 正常;> 3% = 现有内容质量高
- 平均字数 < 800字 = 内容偏浅薄;800-2000字 = 中等;> 2000字 = 已有深度内容
- 原创率 < 50% = 该词缺少认真原创的内容
请严格按以下格式输出,每项占一行,不要多余解释:
高潜力等级:高/中/低
判断理由:(2-3句话,说明主要依据)
写作建议:(给一个具体差异化切入角度,不超过50字)
第二条,Role 选 User,prompt这样维护
关键词:{{ $json.keyword }}
历史总供给:{{ $json.totalSupply }} 篇
近7天供给:{{ $json.recent7Supply }} 篇
前20均阅读:{{ $json.avgRead }}
前20最高阅读:{{ $json.maxRead }}
近7天最高阅读:{{ $json.recentMaxRead }}
平均赞阅比:{{ $json.avgLikeRate }}
平均再看阅比:{{ $json.avgLookingRate }}
平均字数:{{ $json.avgWordCount }} 字
原创率:{{ $json.originalRate }}
账号分散度:{{ $json.accountSpread }}
主要竞争账号:{{ $json.topAccounts }}
DeepSeek 跑完后,输出里的 {{ \$json.text }} 就是分析结果,包含高潜力等级、判断理由、写作建议三行。最后把这个节点的出口连回 Loop Over Items 的入口,Loop 会自动取下一个关键词继续跑。
四、拿两个关键词实际对比一下
我们这个n8n流程在第二个节点维护了两个关键词:「私域运营」 和 「企业微信运营」,我们就拿这个关键词来看看结果。用这套流程跑一遍,结果出来挺有意思。
| 指标 | 私域运营 | 企业微信运营 |
|---|---|---|
| 历史总供给 | 8045 篇 | 60 篇 |
| 近7天供给 | 17 篇 | 0 篇 |
| 前20均阅读 | 9893 | 354 |
| 前20最高阅读 | 23481 | 1275 |
| 近7天最高阅读 | 5147 | 0 |
| 平均赞阅比 | 0.85% | 0.82% |
| 平均字数 | 194 字 | 432 字 |
| 原创率 | 75% | 15% |
| 账号分散度 | 70% | 90% |
| 主要账号 | 云酒头条、葡萄酒商业观察… | 通信资讯、郴州农商银行… |
看完数据有几个地方值得说一下:
「私域运营」这个词,第一眼看数据挺好,均阅读将近 1 万,天花板 2.3 万,需求是真实存在的。 但仔细看会发现一个很奇怪的地方:平均字数只有 194 字。前 20 篇里排名靠前的文章,正文平均才 194 个字?结合主要账号是「云酒头条、葡萄酒商业观察、险企高参」这些名字来看,基本可以判断:这个「私域运营」搜出来的高阅读文章,大概率是行业媒体发的资讯简报,内容里提到了「私域运营」这个词,而不是专门教你怎么做私域的干货文章。这类内容靠的是媒体账号的权重和读者基数,不是因为内容硬。对于想写「私域运营方法论」的内容创作者来说,这反而是个机会——真正有深度的私域运营干货,在这个词下几乎没有,写一篇 2000 字以上的实操文章,超车难度比看起来低得多。DeepSeek 的判断是「中」,给的写作建议是:> 从深度行业分析或具体消费场景切入,撰写 1500 字以上长文,提升内容价值。
「企业微信运营」就更直接了。 历史总供给只有 60 篇,近 7 天供给是 0,也就是说最近一周没有任何人发过这个关键词的文章。均阅读 354,天花板 1275,需求确实比「私域运营」小很多,但供给几乎是空白的。原创率只有 15%,说明这 60 篇里大部分都是转载或非原创内容,认真写这个词的人极少。账号分散度 90%,没有任何头部账号在占位。这是一个需求偏小但竞争极弱的词,适合刚起步、还没有账号权重的新号,写一篇就能占住这个位置,后面靠自然搜索持续引流。DeepSeek 判断是「高」,写作建议是:> 从用户真实痛点切入,创作深度原创指南或经验分享,字数在 1500 字以上。
两个词对比,结论很清楚:「私域运营」需求大,但你要搞清楚你在和谁竞争——不是和同类创作者竞争,而是和行业媒体的资讯流竞争,切角度写深度文章有机会。「企业微信运营」需求小,但几乎没有竞争,适合新号快速占位。选哪个,取决于你的账号阶段: 有一定粉丝基础的选前者,刚起步积累搜索流量的选后者。
五、写在最后
这套流程的本质只有一句话:在动笔之前,先让数据告诉你「这个词有没有机会」。不是说数据高的词就一定写、低的就跳过,而是让你的判断从「感觉」变成「有依据」。哪个词有机会、从哪个角度切入、现有内容弱在哪里,跑一遍流程,这些问题就都清楚了。
最后是广告时间
如果你也对多维表格/n8n自动化工作流的知识和教程感兴趣,欢迎订阅我的小报童专栏。
专栏会持续更新详细的多维表格/n8n的配置方法、详细教程,以及实际应用场景/案例。
目前累计已更新80篇,总计24万字。 限时价格99元(永久)。

课程目录:
小报童订阅入口:
https://xiaobot.net/p/mrdun191?refer=ab67a8c6-dd54-45e1-9400-26c138383bd7(复制并在浏览器打开)
或扫描下方二维码

📋 这套关键词分析相关模板,我整理成模板了
跟着上面步骤搭要花点时间。想直接拿现成的改,加我微信备注「关键词分析」,我发你。
🤔 卡在某一步了?
搭建过程里如果哪一步卡住了,如果你照着做没跑通,或者你们公司情况不太一样,可以找我聊聊,我免费帮你看看怎么调。不合适我也会直说。
扫码加我,备注「关键词分析」领模板
想看更多这类方案,我都整理在 吨师傅工具箱 里了:客户管理、进销存、工单报修……按场景分好类,可以直接抄。


