2026-09-27 · 原文发布日
盯Discourse招聘版,新帖去重后第一时间通知你
每30分钟(可调)拉一次目标Discourse版块的JSON feed,代码节点展开并只保留48小时内创建的帖子;Data Table节点把每个topic_id记进永久台账做upsert去重,保证同一帖子绝不处理两次;过滤后接Telegram、Gmail或Slack等任意通知节点,只推真新帖。适合想在小众招聘版抢首回的自由职业者和社区运营。换成盯changelog或marketplace版块也行,需要登录的版块加个认证头即可。模板免费。
原文要点
原模板用 Schedule Trigger 每 30 分钟(可调)拉取目标 Discourse 版块的 JSON feed(如 jobs/13),Code 节点展开并只保留 48 小时内创建的帖子、每帖输出一个 item;Data Table 节点对每个 topic_id 做 upsert 形成永久去重台账,保证同帖不处理两次;过滤后接任意通知节点(Telegram/Gmail/Slack)。设置只需替换 COMMUNITY_URL_TO_WATCH 占位与版块路径,准备一张含 topic_id 列的 Data Table。需要登录的版块可加认证头,Data Table 也可换成 Google Sheets。
这次做成什么
照做出一条「新帖雷达」:每 30 分钟拉一次 Discourse 版块 feed→48 小时窗口过滤→Data Table 去重→只把真新帖推到 Telegram。先用公开的 Discourse 官方社区 meta.discourse.org 的公开版块练手,跑通后再换目标站。
准备什么
- n8n 实例(Data Table 功能需较新版本,旧版可改用 Google Sheets 兜底)
- 一个公开可访问、无需登录的 Discourse 版块及其 category ID
- 通知渠道任选其一:Telegram bot token、Gmail OAuth 或 Slack webhook
- 无需 Discourse 账号(公开 feed);私有版块才需要 API key 认证头
具体怎么做
找到版块 feed 地址
在浏览器打开目标版块页面,URL 形如 https://meta.discourse.org/c/jobs/13。其 JSON feed 就是同路径加 .json:https://meta.discourse.org/c/jobs/13.json,浏览器直接打开能看到 topic_list.topics 数组即确认可用。记下这个 URL。
配置拉取与时间过滤
导入模板后打开 Fetch Job Board Posts(HTTP Request)节点,把 COMMUNITY_URL_TO_WATCH 与 category 路径替换为上一步 URL。Code 节点逻辑:遍历 topic_list.topics,解析 created_at,只保留距现在 48 小时内的,每帖输出 {topic_id, title, slug, created_at, url}。材料中有本站重写的等效代码。
建去重台账
在 n8n 左侧 Data Tables 新建表 seen_topics,加一列 topic_id(字符串)。Record Seen Topics 节点选这张表,操作用 upsert、匹配键 topic_id:已存在的帖子不产生「新增」,借此实现永久去重。不要设 TTL,台账就是要永久。
接通知并试跑
在去重过滤后接 Telegram 节点(Send Message),chat_id 填你的,文本用材料中的模板,帖子 URL 用 base_url + /t/slug/topic_id 拼。先手动执行一次:首次跑会把 48 小时内全部帖子当新帖推一遍,属正常;第二次执行应零输出。
调参与换站
节奏快的版块把 Schedule 调成 10-15 分钟;换盯 changelog 或 marketplace 版块只改 URL;需要登录的版块在 HTTP Request 节点加 Header(Discourse 用 User-Api-Key 或 Authorization,按目标站文档);不想用 Data Table 可换成 Google Sheets 做同样的 upsert。
可直接复制的材料
时间窗口过滤 Code(本站重写等效版)
本站根据模板描述独立重写的等效代码,非原作者源码;字段名以实际 feed 返回为准。
// 输入为 feed JSON(HTTP 节点返回),输出 48 小时内的新帖,每帖一个 item
const data = $json;
const base = 'https://meta.discourse.org'; // 换成你的目标站
const cutoff = Date.now() - 48 * 3600 * 1000;
const out = [];
for (const t of (data.topic_list?.topics || [])) {
const created = new Date(t.created_at).getTime();
if (created >= cutoff) {
out.push({ json: {
topic_id: String(t.id),
title: t.title,
slug: t.slug,
created_at: t.created_at,
url: base + '/t/' + t.slug + '/' + t.id
} });
}
}
return out;Telegram 通知文案模板
粘贴进 Telegram 节点的 Text 字段;字段名与 Code 节点输出对应。
🔔 招聘版新帖:
{{$json.title}}
发布时间:{{$json.created_at}}
链接:{{$json.url}}合成 feed 测试数据(模拟 HTTP 节点返回)
本站合成数据;假设当前时间 2026-10-05T12:00:00Z,则前两条过 48h 窗口、第三条被滤掉。可在 HTTP 节点处临时用 Set 节点注入此 JSON 做离线测试。
{
"topic_list": {
"topics": [
{ "id": 77001, "title": "[招聘] 远程 n8n 自动化顾问", "slug": "remote-n8n-consultant", "created_at": "2026-10-05T08:00:00Z" },
{ "id": 77002, "title": "[招聘] 社区运营兼职", "slug": "community-ops-parttime", "created_at": "2026-10-04T20:00:00Z" },
{ "id": 76900, "title": "[旧帖] 三个月前的招聘", "slug": "old-job-post", "created_at": "2026-09-20T10:00:00Z" }
]
}
}输入与输出示例
本站虚构演示,未运行原模板;URL 与 ID 来自合成数据。
输入
假设当前为 2026-10-05 12:00,第一次手动执行,feed 返回上面合成数据的三条帖子。对应输出
Code 节点输出 2 个 item(77001、77002,76900 超 48h 被滤);Data Table upsert 后两帖均记为新;Telegram 收到 2 条消息,如「🔔 招聘版新帖:[招聘] 远程 n8n 自动化顾问 … https://meta.discourse.org/t/remote-n8n-consultant/77001」。紧接着第二次执行同一 feed:两帖在台账中已存在,过滤后零输出,Telegram 无新消息。做完检查这些
- 浏览器直接访问 版块路径.json 能看到 topic_list.topics,确认 feed 公开可用
- Code 节点输出仅含 48 小时窗口内的帖子,每帖一个 item 且 url 可点击打开
- 同一 feed 连续跑两次,第二次 Telegram 零新消息,证明 upsert 去重生效
- Data Table 中每个 topic_id 只有一行,无重复
- 手动执行无误后再激活 Schedule Trigger
容易卡住的地方
- 首次运行会把窗口内所有历史帖当新帖推送,属于预期行为,可先临时断开通知节点跑一次「预热」台账
- category 路径里的数字是 category ID 不是 slug,填错会 404 或拉到错误版块
- 部分站点对未登录请求限流,30 分钟间隔一般安全,调太快可能 429
- Data Table 是 n8n 较新版本的功能,旧版本需按原文建议换成 Google Sheets 做 upsert
- 需要登录的私有版块必须加认证头,否则拿到的是登录页 HTML 而非 JSON
- Discourse 的 pinned/置顶帖可能长期出现在 feed 中,若其 created_at 在窗口外会被滤掉,属正常
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Watch Discourse job boards, dedupe with Data Tables, and send Gemini summaries to Telegram
- 原作者
- Shuo Yuan
- 原始发布日期
- 2026-09-27T11:51:59.481Z
- 来源
- https://n8n.io/workflows/19982