Reddit选品监控工作流:n8n抓热帖和评论(附模板)

做跨境电商的朋友,是不是都有过这种体验?每天打开 Reddit,像无头苍蝇一样在各个版块里翻帖子,看看老外最近在讨论什么好物。翻了半小时,眼睛都花了,最后收获寥寥。更痛苦的是,当你终于发现一个有价值的讨论帖,点进去想看看评论区大家都在推荐啥,结果:

  • 评论太多,要一条条翻,累死
  • 有价值的信息散落各处,整理起来要命
  • 明天再来看,这个帖子早被新帖淹没了,找都找不到

所以我就想:能不能让机器自动帮我干这事?

  • 每天定时去 Reddit 几个跟选品相关的版块”巡逻”
  • 把热门讨论帖自动扒下来
  • 连同评论一起整理好
  • 自动存到多维表格里,我只需要每天花 5 分钟扫一眼就行,还可以用多维表格的AI进行整理

当然可以。今天这篇文章,我就把这套”Reddit选品监控”工作流的完整搭建方法分享出来。你只需要有一台能上网的电脑,跟着配置,就能拥有一个 24 小时运转的选品监控工作流。

tips:文章的最后可以下载模板

一、这套工作流能帮你做什么?

在正式开始之前,先让你看看最终效果。工作流每天自动完成以下任务:

1. 定时启动:每天固定时间(比如晚上 11 点)自动运行 2. 批量监控:同时监控 6 个 Reddit 版块的热门帖子 3. 数据过滤:自动过滤广告、推荐单元等垃圾信息 4. 抓取评论:对每个有价值的帖子,自动抓取前 15 条热门评论 5. 数据清洗:把标题、内容、评论整理成干净的结构化数据 6. 去重入库:自动检查是否已存在,避免重复写入 7. 写入飞书:所有数据自动同步到飞书多维表格,随时查阅

最终效果:打开飞书多维表格,你会看到这样一张表:

配图

每天 5 分钟,快速扫一遍,也可以在多维表格用AI来帮你分析内容和评论数据,你就能捕捉到海外用户正在热议的商品话题。

二、准备工作:你需要这些工具

在开始搭建之前,请确保你已经准备好以下工具:

2.1 n8n

n8n 是一个开源的自动化工作流工具,可以理解为”可视化的编程”。获取方式(二选一):

  • 云版:访问 n8n.io 注册账号,价格可能会贵一点
  • 自部署版:可以用zeabur一键部署到自己的服务器,完全免费无限制。每月只需支付一点服务器费用。

2.2 TikHub API 账号

TikHub 是一个第三方 API 服务,可以帮我们获取 Reddit 的数据(绕过 Reddit 官方 API 的各种限制)。注册步骤:

1. 访问 tikhub.io 2. 注册账号并充值(几块钱就够用很久) 3. 在控制台获取你的 API Token

2.3 飞书开发者账号

我们要把数据写入飞书多维表格,需要创建一个飞书应用。准备步骤:

1. 访问 open.feishu.cn,用你的飞书账号登录 2. 创建一个”企业自建应用” 3. 在”权限管理”中开启”多维表格”相关权限 4. 获取 App ID 和 App Secret 5. 创建一个多维表格,记录下 App Token 和 Table ID

2.4 创建飞书多维表格

在飞书中创建一个新的多维表格,添加以下字段:

字段名字段类型
帖子ID文本
版块名文本
发布时间文本
作者名称文本
帖子标题文本
帖子内容文本
帖子链接文本
帖子评论文本
commentCount文本
score文本
shareCount文本

多维表格免费的就足够用了,流程一天跑一次,成本估计也不到 1 块钱,却能替代你每天 1-2 小时的人肉翻帖时间。

三、全流程

在开始逐个节点配置之前,先来看看整个工作流的”骨架”:

配图

核心设计思路:

1. 配置与逻辑分离:所有 API 密钥集中在”配置中心”,改配置只需要改一个地方 2. 扁平化单循环:先把所有版块的帖子合并到一起,再统一循环处理,避免嵌套循环的复杂性 3. 去重机制:每次写入前先查询,确保同一个帖子不会重复入库

好,接下来我们一个节点一个节点来配置。

四、节点详解:定时触发器

4.1 为什么需要这个节点?

我们希望这个工作流每天自动运行,而不是每次都要手动点击。业务场景:比如设置成每天晚上 11 点运行。这个时间点选得有讲究,选择热门帖子沉淀得差不多了的时间。

4.2 配置步骤

1. 在 n8n 画布中,点击 + 号添加节点 2. 搜索 Schedule Trigger,点击添加 3. 配置如下:

配图

节点设置:

  • Trigger Interval: Hours
  • Hours Between Triggers: 24(每 24小时运行一次)

五、节点详解:配置中心

5.1 为什么需要这个节点?

这是整个工作流的”钥匙”,存放所有需要用到的 API 密钥和配置信息。好处:

  • 所有敏感信息集中管理
  • 后续节点通过引用获取,改配置只需要改这一个地方
  • 避免在多个节点中重复填写相同的密钥

5.2 配置步骤

1. 添加一个 Set 节点 2. 命名为:配置中心 3. 配置以下字段:

字段名类型说明
tikhub_tokenStringTikHub API Token,从 TikHub 控制台获取
feishu_app_idString飞书应用 App ID
feishu_app_secretString飞书应用 App Secret
feishu_app_tokenString多维表格的 App Token
feishu_table_idString数据表的 Table ID

如何获取飞书的 App Token 和 Table ID?打开你的多维表格,看浏览器地址栏:

https://xxx.feishu.cn/base/RTnbbVoapaEDOEsaseCcVWxDnyg?table=tblaOAGyEOwVR9bh

  • RTnbbVoapaEDOEsaseCcVWxDnyg 就是 App Token
  • tblaOAGyEOwVR9bh 就是 Table ID
配图

六、节点详解:获取飞书 Token

6.1 为什么需要这个节点?

飞书的 API 需要先用 App ID 和 App Secret 换取一个临时的 Access Token,这个 Token 有效期 2 小时。工作流每次运行,都需要先获取一个新的 Token,才能调用后续的飞书 API。

6.2 配置步骤

1. 添加一个 HTTP Request 节点

配图

1. 配置如下:

基础设置:

配置项
MethodPOST
URLhttps://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal

Body 设置:勾选 Send Body,选择 Body Content Type 为 JSON,并添加两个参数:

参数名
app_id{{ \$json.feishu_app_id }}
app_secret{{ \$json.feishu_app_secret }}

\$json 代表上一个节点(配置中心)输出的数据。通过 \$json.feishu_app_id 就能引用到我们在配置中心设置的 App ID。

执行后会返回飞书的token

{
  "code": 0,
  "msg": "ok",
  "tenant_access_token": "t-xxxxxx",
  "expire": 7200
}

七、节点详解:版块列表

7.1 为什么需要这个节点?

我们需要告诉工作流:要监控哪些 Reddit 版块?我们可以根据自己的选品方向,来设置我们的版块。

比如我们监控这6个版块:

r/BuyItForLife

r/shutupandtakemymoney

r/gadgets

r/EDC

r/HomeImprovement

r/OrganizationPorn

7.2 配置步骤

配图

1. 添加一个 Code 节点 2. 选择语言为 JavaScript 3. 输入以下代码:

// 输出所有目标版块
return [
  { json: { name: 'BuyItForLife' } },
  { json: { name: 'shutupandtakemymoney' } },
  { json: { name: 'gadgets' } },
  { json: { name: 'EDC' } },
  { json: { name: 'HomeImprovement' } },
  { json: { name: 'OrganizationPorn' } }
];
  • 这段代码会输出 6 个数据项,每个数据项包含一个 name 字段
  • 后续的 HTTP 节点会对这 6 个项分别执行,实现”批量请求”
配图

八、节点详解:批量获取热门列表

8.1 为什么需要这个节点?

这是工作流的核心数据源——调用 TikHub API,获取指定版块的热门帖子列表。API 说明:TikHub 的 fetch_subreddit_feed 接口可以获取指定版块的帖子 Feed,支持按热度(HOT)、新发布(NEW)等方式排序。

8.2 配置步骤

配图

1. 添加一个 HTTP Request 节点 2. 配置如下:

基础设置:

配置项
MethodGET
URLhttps://api.tikhub.io/api/v1/reddit/app/fetch_subreddit_feed

Query Parameters:

参数名
subreddit_name{{ \$json.name }}
sortHOT

sort设置为HOT,就是按帖子的热门程度排序。

Headers:勾选 Send Headers,添加:

Header 名
Authorization=Bearer {{ \$(‘配置中心’).first().json.tikhub_token }}
  • \$json.name:引用当前项的 name 字段(来自版块列表)
  • \$(‘配置中心’).first().json.tikhub_token:跨节点引用配置中心的 Token

为什么用 .first()?因为配置中心只输出了一个数据项,用 .first() 明确取第一个,避免 n8n 在批量执行时产生歧义。

九、节点详解:合并清洗所有帖子

9.1 为什么需要这个节点?

TikHub 的reddit API 返回的数据结构非常复杂,包含了广告、推荐模块等我们不需要的内容。所以我们需要对返回的原始数据进行加工清洗。

这个节点主要的任务:

1. 把 6 个版块的数据合并到一起 2. 过滤掉广告和垃圾信息 3. 提取出我们关心的字段 4. 输出一个干净的帖子列表

9.2 配置步骤

配图

1. 添加一个 Code 节点 2. 在节点设置中,开启 Always Output Data(即使没有数据也输出空数组) 3. 输入以下代码:

const allPosts = [];

for (const item of $input.all()) {
  const rawJson = item.json;

  // 从 params 获取版块名
  const subreddit_name = rawJson.params?.subreddit_name || 'Unknown';

  // 正确的数据路径
  const edges = rawJson.data?.subredditV3?.elements?.edges || [];

  if (!edges || edges.length === 0) {
    continue;
  }

  for (const edge of edges) {
    const node = edge.node;

    // 跳过无效节点
    if (!node) continue;

    // 跳过 sortcell、广告、推荐单元
    if (node.groupId === 'sortcell') continue;
    if (node.adPayload) continue;
    if (node.__typename === 'CarouselCommunityRecommendationsFeedUnit') continue;
    if (!node.groupId || !node.groupId.startsWith('t3_')) continue;

    // 初始化帖子对象
    const post = {
      post_id: node.groupId,
      subreddit_name: subreddit_name,
      createdAt: '',
      authorName: '',
      title: '',
      text: '',
      link: `https://reddit.com/comments/${node.groupId.replace('t3_', '')}`,
      commentCount: 0,
      score: 0,
      shareCount: 0
    };

    // 从 cells 数组提取数据
    if (node.cells && Array.isArray(node.cells)) {
      for (const cell of node.cells) {
        switch (cell.__typename) {
          case 'MetadataCell':
            if (cell.createdAt) post.createdAt = cell.createdAt;
            if (cell.authorName) post.authorName = cell.authorName;
            break;
          case 'TitleCell':
            if (cell.title) post.title = cell.title;
            break;
          case 'PreviewTextCell':
            if (cell.text) post.text = cell.text;
            break;
          case 'ActionCell':
            if (cell.commentCount !== undefined) post.commentCount = cell.commentCount;
            if (cell.score !== undefined) post.score = cell.score;
            if (cell.shareCount !== undefined) post.shareCount = cell.shareCount;
            break;
        }
      }
    }

    // 只保留有标题的帖子
    if (post.title) {
      allPosts.push({ json: post });
    }
  }
}

return allPosts;

代码逻辑解析:

1.遍历所有输入项:\$input.all() 获取上一节点的所有输出(6 个版块的 API 响应)

2.提取数据路径:TikHub 的数据藏在 data.subredditV3.elements.edges 里

3.过滤垃圾数据:

  • sortcell:排序控件
  • adPayload:广告
  • CarouselCommunityRecommendationsFeedUnit:推荐版块

4.提取字段:从 cells 数组中按类型提取所需字段

5.构建干净的帖子对象:包含 10 个关键字段

清洗后的数据就会很清爽,结构也很清晰。都是我们所需要的。

配图

十、节点详解:逐个处理帖子(循环)

10.1 为什么需要这个节点?

上一步我们得到了一个包含几十个帖子的列表,但接下来的操作(去重、抓评论、写入)需要一个一个帖子来处理。Split In Batches 节点可以把列表拆成单个项,逐个执行后续流程。

10.2 配置步骤

配图

1. 添加一个 Split In Batches 节点 2. 配置如下:

配置项
Batch Size1(每次处理 1 个帖子)

其他的内容不需要配置

十一、节点详解:去重查询

11.1 为什么需要这个节点?

工作流每天运行,如果不做去重,同一个热门帖子会被反复写入多维表格,所以这个节点主要是为了避免重复。

实现思路:每次写入前,先去飞书多维表格查一下:这个帖子ID是否已经存在?如果存在了就算是重复,就不需要再次写入到多维表格里了。

11.2 配置步骤

配图

1. 添加一个 HTTP Request 节点 2. 配置如下:

基础设置:

配置项
MethodPOST
URL=https://open.feishu.cn/open-apis/bitable/v1/apps/{{ \$(‘配置中心’).first().json.feishu_app_token }}/tables/{{ \$(‘配置中心’).first().json.feishu_table_id }}/records/search

Headers:

Header 名
Authorization=Bearer {{ \$(‘获取飞书Token’).first().json.tenant_access_token }}

Body:勾选 Send Body,选择 JSON,输入:

{
  "filter": {
    "conjunction": "and",
    "conditions": [{ "field_name": "帖子ID", "operator": "is", "value": ["{{ $json.post_id }}"] }]
  }
}

查询逻辑:这个请求会在多维表格中搜索”帖子ID”等于当前帖子 ID 的记录。

  • 如果找到了(total > 0),说明已存在,跳过
  • 如果没找到(total = 0),说明是新帖,继续处理

十二、节点详解:是新帖?

12.1 为什么需要这个节点?

根据去重查询的结果,决定走哪条分支:

  • 是新帖:继续抓评论、写入
  • 已存在:跳过,直接进入下一轮循环

12.2 配置步骤

配图

1. 添加一个 IF 节点 2. 配置条件:

配置项
Value 1{{ \$json.data.total }}
OperationIs equal to
Value 20

逻辑:飞书搜索 API 返回的 data.total 表示匹配到的记录数。如果等于 0,说明没找到,是新帖。

12.3 两个输出

if节点会输出两条连线

  • True(是新帖):连接到”恢复帖子数据”节点
  • False(已存在):连接到”跳过”节点

十三、节点详解:恢复帖子数据

13.1 为什么需要这个节点?

这是一个技术细节:经过”去重查询”后,当前节点的 \$json 已经变成了飞书 API 的响应,不再是帖子数据了。我们需要”恢复”原始的帖子数据,才能继续处理。

13.2 配置步骤

配图

1. 添加一个 Code 节点 2. 输入代码:

// 从循环节点恢复原始帖子数据
return { json: $('逐个处理帖子').first().json };

十四、节点详解:跳过

14.1 为什么需要这个节点?

当帖子已存在时,我们不需要做任何处理,但需要”返回”到循环节点,继续处理下一个帖子。

14.2 配置步骤

1. 添加一个 Code 节点 2. 命名为:跳过(已存在) 3. 输入代码:

// 跳过重复帖子,但需要传递一个空信号回循环
return { json: { skip: true } };

十五、节点详解:抓评论

15.1 为什么需要这个节点?

光有帖子标题和内容还不够,评论区才是最重要的!用户在评论里会推荐具体品牌、吐槽产品缺点、分享使用体验……这些信息对选品极其有价值。所以这个节点,主要是抓用户的评论数据。

15.2 配置步骤

配图

1. 添加一个 HTTP Request 节点 2. 配置如下:

基础设置:

配置项
MethodGET
URLhttps://api.tikhub.io/api/v1/reddit/app/fetch_post_comments

Query Parameters:

参数名
post_id={{ \$json.post_id }}
sort_typeCONFIDENCE

Headers:

Header 名
Authorization=Bearer {{ \$(‘配置中心’).first().json.tikhub_token }}

参数说明:

  • post_id:要抓取评论的帖子 ID
  • sort_type:排序方式,CONFIDENCE 表示按热度/置信度排序。你也可以根据实际需求换成别的排序方式(排序说明可以在接口文档的说明里查看)

十六、节点详解:组装数据

16.1 为什么需要这个节点?

现在我们有两份数据:

  • 帖子基本信息(来自”恢复帖子数据”)
  • 评论数据(来自”抓评论”)

需要把它们组装成一个完整的记录,准备写入飞书。

其实也是一个数据清洗和加工的步骤。

16.2 配置步骤

配图

1. 添加一个 Code 节点 2. 输入代码:

const post = $('恢复帖子数据(新帖)').first().json;
const data = $json.data;
let comments = '无评论';

if (data?.postInfoById?.commentForest?.trees) {
  const list = [];
  data.postInfoById.commentForest.trees.forEach(t => {
    const md = t.node?.content?.markdown;
    if (md) list.push(md.replace(/"/g, "'").replace(/\n/g, ' ').trim());
  });
  if (list.length > 0) {
    comments = list.slice(0, 15).map((t, i) => `${i+1}. ${t}`).join('\\n');
  }
}

return {
  json: {
    post_id: post.post_id,
    subreddit_name: post.subreddit_name,
    createdAt: post.createdAt,
    authorName: post.authorName,
    title: (post.title || '').replace(/"/g, "'"),
    text: (post.text || '').replace(/"/g, "'").replace(/\n/g, ' '),
    link: post.link,
    commentCount: parseInt(post.commentCount) || 0,
    score: parseInt(post.score) || 0,
    shareCount: parseInt(post.shareCount) || 0,
    clean_comments: comments
  }
};

代码逻辑:

1. 引用帖子数据:从”恢复帖子数据”节点获取 2. 提取评论:从评论 API 响应中提取前 15 条评论的 markdown 内容 3. 格式化评论:加上序号,用 \n 分隔(写入飞书时会显示为换行) 4. 清洗特殊字符:把双引号替换成单引号,避免 JSON 解析错误

十七、节点详解:写入飞书

17.1 为什么需要这个节点?

最后一步,把组装好的数据写入飞书多维表格。

17.2 配置步骤

配图

1. 添加一个 HTTP Request 节点 2. 配置如下:

基础设置:

配置项
MethodPOST
URL=https://open.feishu.cn/open-apis/bitable/v1/apps/{{ \$(‘配置中心’).first().json.feishu_app_token }}/tables/{{ \$(‘配置中心’).first().json.feishu_table_id }}/records

调用多维表格新增记录的API

Headers:

Header 名
Authorization=Bearer {{ \$(‘获取飞书Token’).first().json.tenant_access_token }}

Body:勾选 Send Body,选择 JSON,按飞书多维表格的规范输入数据结构:

{
  "fields": {
    "帖子ID": "{{ $json.post_id }}",
    "版块名": "{{ $json.subreddit_name }}",
    "发布时间": "{{ $json.createdAt }}",
    "作者名称": "{{ $json.authorName }}",
    "帖子标题": "{{ $json.title }}",
    "帖子内容": "{{ $json.text }}",
    "帖子链接": "{{ $json.link }}",
    "帖子评论": "{{ $json.clean_comments }}",
    "commentCount": "{{ $json.commentCount }}",
    "score": "{{ $json.score }}",
    "shareCount": "{{ $json.shareCount }}"
  }
}

字段映射说明:JSON 中的 key(如”帖子ID”)必须与飞书多维表格中的字段名完全一致!

最后注意,要将”写入飞书”的输出连接回”逐个处理帖子”,形成循环

十八、运行与调试

19.1 首次测试

配置完成后,不要急着开启定时任务。先手动执行一次,检查是否有报错:

1. 点击画布右上角的 Execute Workflow 2. 观察每个节点的执行状态 3. 检查最终是否成功写入了数据

19.2 常见问题排查

问题1:飞书 API 返回 401原因:Token 无效或过期解决:检查 App ID 和 App Secret 是否正确,确保应用已开启多维表格权限

问题2:TikHub API 返回 400原因:请求参数格式错误解决:检查 post_id 是否包含 t3\_ 前缀,sort_type 是否拼写正确

问题3:写入飞书时 JSON 解析失败原因:帖子标题或评论中包含特殊字符(如双引号)解决:在”组装数据”节点中做好字符替换

19.3 开启自动运行

测试通过后,点击右上角的开关,启用工作流的自动运行。

运行成功后,就可以把数据写入到飞书多维表格里。

配图

接下来就可以在多维表格自由发挥了,比如用AI去监控评论区讨论过的商品,用仪表盘展示评论的词云信息等等。

十九、写在最后

这套工作流,本质上是把一个”人肉信息采集”的任务,变成了”机器自动巡逻”。你获得的不只是一个工具,而是一种思维方式:

  • 把重复劳动交给机器
  • 把精力留给真正需要思考的事情
  • 用”系统”来对抗”遗忘”

每天 5 分钟,打开飞书多维表格,扫一眼今天的热门讨论。也许某一天,你就能从一个不起眼的帖子里,发现下一个爆款选品的灵感。

这条n8n流程的JSON 模板已备好,你可以直接下载导入工作流模板就好,改下配置中心里的key值就能用。或者根据自己的需求来修改工作流。


📋 这套选品监控相关模板,我整理成模板了

跟着上面步骤搭要花点时间。想直接拿现成的改,加我微信备注「选品监控」,我发你。

🤔 卡在某一步了?

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

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

扫码加我,备注「选品监控」领模板

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

相关阅读

滚动至顶部