公众号关键词潜力怎么分析?n8n自动化配置教程

做内容的朋友,大概都经历过这种时刻:精心写完一篇文章,发出去,阅读数定格在两位数。翻了翻后台,心里开始犯嘀咕,是写得不够好?还是这个选题本来就没人感兴趣?这两个问题,其实只有第二个是可以在动笔前就回答的。内容做不好,一般有两种情况:一种是写得不好,一种是选题没需求。 前者靠练,但后者完全可以在动笔前用数据验证清楚。

我们平时选题,大多靠感觉,觉得这个话题最近很热、觉得这个方向有人关注、或者单纯是自己想写。这本身没什么问题,但有一个很大的漏洞:你觉得热的词,可能早就被写烂了,平台算法早就不给新内容权重了。你觉得冷门的词,可能正好是「搜的人多、写的人少」的蓝海,写一篇 80 分的内容就能排第一。这就是为什么要做关键词潜力分析。在动笔之前,先用数据搞清楚这个词在公众号生态里的供需关系:

  • 这个词有多少人在搜、现有文章能读到多少量?(需求天花板)
  • 历史上有多少篇文章在写这个词,近期还有多少新内容?(供给竞争)
  • 已有的文章质量怎么样,有没有超车空间?(内容机会)

三个问题都清楚了,你才知道「要不要写」「怎么写才有机会」。

一、关键词分析能告诉你什么

这是一个常被忽略的认知:公众号的搜索行为,本身就是用户需求的真实投票。用户在微信里搜「私域运营」,是因为他有这个需求,想找答案。搜索量大的词,代表需求是真实存在的;反过来,如果一个词几乎没人搜,就算写得再好,流量也很有限。但光有需求还不够。一个词搜索量大,同时已经有几千篇高质量文章在占位,新人去硬刚,概率也不高。所以,关键词潜力分析的本质,是判断「需求 vs 供给」的比值:

  • 需求大、供给少 → 蓝海词,值得写
  • 需求大、供给也大但质量差 → 有超车机会,值得写
  • 需求小、供给少 → 冷门词,谨慎
  • 需求小、供给大 → 红海,除非有很强的差异化,否则跳过

具体到公众号,我们要判断三件事:

① 这个词的需求天花板有多高:看「按阅读数排序」的前 20 篇文章,平均阅读多少。这反映的是:如果你写这个词,理论上能到的天花板在哪里。如果前 20 篇均阅读才几百,说明流量池本身就很小。

② 现有内容有没有超车空间:看前 20 篇的「赞阅比」(点赞/阅读)和平均字数。赞阅比低,说明现有内容共鸣感一般;字数普遍偏短,说明都是浅薄内容,你写一篇 3000 字深度文章就能直接超车。

③ 近期供给是不是新鲜:看「按时间排序」的近 7 天,有多少篇文章在写这个词。如果近 7 天只有零星几篇,说明近期供给空白,微信算法更可能给新内容权重,是发布的好时机。

今天我们就用一个微信文章搜索接口 + n8n,把这套分析流程自动化,每次评估一个或多个关键词,只需要跑一遍流程,结果自动出来。

二、用一个接口把三件事全搞清楚

微信搜索数据从哪来?微信的封闭生态导致获取数据比较困难,我用的是极致了API这个专做微信公众号的接口平台。用「关键词搜索微信文章」这个数据库接口,支持按阅读数或时间排序,能拿到每篇文章的标题、正文、阅读数、点赞数、再看数、发布时间、账号名等字段,以及这个关键词在数据库里的总文章数(total 字段)。

这个接口我们可以分两次查询,分别读不同的信息:

查询参数目的
查询 Asort_type=1(按阅读数),period=720历史高质量内容:判断天花板 + 竞争格局 + 内容质量
查询 Bsort_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均阅读9893354
前20最高阅读234811275
近7天最高阅读51470
平均赞阅比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(复制并在浏览器打开)

或扫描下方二维码

配图

📋 这套关键词分析相关模板,我整理成模板了

跟着上面步骤搭要花点时间。想直接拿现成的改,加我微信备注「关键词分析」,我发你。

🤔 卡在某一步了?

搭建过程里如果哪一步卡住了,如果你照着做没跑通,或者你们公司情况不太一样,可以找我聊聊,我免费帮你看看怎么调。不合适我也会直说。

加吨师傅微信咨询飞书多维表格搭建

扫码加我,备注「关键词分析」领模板

想看更多这类方案,我都整理在 吨师傅工具箱 里了:客户管理、进销存、工单报修……按场景分好类,可以直接抄。

相关阅读

滚动至顶部