做跨境电商的朋友,是不是都有过这种体验?每天打开 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_token | String | TikHub API Token,从 TikHub 控制台获取 |
| feishu_app_id | String | 飞书应用 App ID |
| feishu_app_secret | String | 飞书应用 App Secret |
| feishu_app_token | String | 多维表格的 App Token |
| feishu_table_id | String | 数据表的 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. 配置如下:
基础设置:
| 配置项 | 值 |
|---|---|
| Method | POST |
| URL | https://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. 配置如下:
基础设置:
| 配置项 | 值 |
|---|---|
| Method | GET |
| URL | https://api.tikhub.io/api/v1/reddit/app/fetch_subreddit_feed |
Query Parameters:
| 参数名 | 值 |
|---|---|
| subreddit_name | {{ \$json.name }} |
| sort | HOT |
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 Size | 1(每次处理 1 个帖子) |
其他的内容不需要配置
十一、节点详解:去重查询
11.1 为什么需要这个节点?
工作流每天运行,如果不做去重,同一个热门帖子会被反复写入多维表格,所以这个节点主要是为了避免重复。
实现思路:每次写入前,先去飞书多维表格查一下:这个帖子ID是否已经存在?如果存在了就算是重复,就不需要再次写入到多维表格里了。
11.2 配置步骤

1. 添加一个 HTTP Request 节点 2. 配置如下:
基础设置:
| 配置项 | 值 |
|---|---|
| Method | POST |
| 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 }} |
| Operation | Is equal to |
| Value 2 | 0 |
逻辑:飞书搜索 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. 配置如下:
基础设置:
| 配置项 | 值 |
|---|---|
| Method | GET |
| URL | https://api.tikhub.io/api/v1/reddit/app/fetch_post_comments |
Query Parameters:
| 参数名 | 值 |
|---|---|
| post_id | ={{ \$json.post_id }} |
| sort_type | CONFIDENCE |
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. 配置如下:
基础设置:
| 配置项 | 值 |
|---|---|
| Method | POST |
| 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值就能用。或者根据自己的需求来修改工作流。
📋 这套选品监控相关模板,我整理成模板了
跟着上面步骤搭要花点时间。想直接拿现成的改,加我微信备注「选品监控」,我发你。
🤔 卡在某一步了?
搭建过程里如果哪一步卡住了,如果你照着做没跑通,或者你们公司情况不太一样,可以找我聊聊,我免费帮你看看怎么调。不合适我也会直说。
扫码加我,备注「选品监控」领模板
想看更多这类方案,我都整理在 吨师傅工具箱 里了:客户管理、进销存、工单报修……按场景分好类,可以直接抄。


