第一个自动化工作流
Ch03 第一个自动化工作流
理论学够了,是时候动手了。本章将从零开始搭建一个真实可用的工作流:每天自动抓取 Hacker News 热门文章,通过 OpenAI 生成中文摘要,发送到你的邮箱。整个过程覆盖 n8n 工作流搭建的完整流程,帮你建立肌肉记忆。
工作流整体设计
这个工作流由 5 个节点串联而成:
- Schedule Trigger — 每天早 8:00 自动触发
- HTTP Request — 调用 Hacker News API 获取 Top 10 文章
- Code — 过滤掉分数低于 100 的文章
- OpenAI — 为每篇文章生成中文摘要
- Gmail — 将摘要汇总发送到邮箱
Step 1:添加 Schedule Trigger 节点
打开 n8n,点击 New Workflow,在空白画布上点击 + 按钮搜索 "Schedule",选择 Schedule Trigger 节点。
配置参数:
- Trigger Interval:选择
Days - Days Between Triggers:
1 - Trigger at Hour:
8(早上 8 点) - Trigger at Minute:
0
保存节点。此时画布上出现第一个节点,它会每天早上 8 点触发工作流。
测试技巧: 开发阶段不要等定时触发——点击节点右上角的 Execute Node 按钮可以立即手动触发单个节点,查看其输出数据。
Step 2:HTTP Request 获取 Hacker News 数据
从 Schedule Trigger 节点拉出连线,添加 HTTP Request 节点。
配置:
- Method:
GET - URL:
https://hacker-news.firebaseio.com/v0/topstories.json
执行后,你会看到返回一个包含 500 个文章 ID 的数组。我们只需要前 10 个,所以在第二个 HTTP Request 节点中获取每篇文章的详情:
- Method:
GET - URL:
https://hacker-news.firebaseio.com/v0/item/{{ $json }}.json
注意:这里的
{{ $json }}表示当前 item 的值(即文章 ID)。由于上游输出了 500 个 ID,这个节点会被调用 500 次。为了限制只处理前 10 条,在 Settings 中设置 Batch Size 为 10。
Step 3:Code 节点过滤文章
添加 Code 节点,过滤分数低于 100 的文章:
// 过滤低质量文章,只保留分数 >= 100 的
const filtered = items.filter(item => {
const score = item.json.score || 0;
const title = item.json.title || '';
// 过滤掉没有 URL 的(如 Ask HN、Show HN 等)
return score >= 100 && item.json.url;
});
// 按分数降序排列
filtered.sort((a, b) => b.json.score - a.json.score);
// 只取前 10 篇
return filtered.slice(0, 10);
Step 4:OpenAI 节点生成摘要
添加 OpenAI 节点(需要先在 Credentials 中添加 OpenAI API Key)。
配置:
- Resource:
Chat - Operation:
Message a Model - Model:
gpt-4o-mini(成本低,摘要任务足够) - Messages:
System: 你是一个技术内容助手,专门将英文科技文章标题翻译成中文并生成简洁摘要。
User: 请对以下 Hacker News 文章生成一段 50 字以内的中文摘要:
标题:{{ $json.title }}
链接:{{ $json.url }}
分数:{{ $json.score }} 分
请直接输出摘要,不需要任何前缀。
Step 5:Merge + Gmail 发送汇总邮件
在所有文章的摘要生成后,添加 Aggregate 节点将所有 items 合并为一个,然后通过 Code 节点格式化邮件内容:
// 生成 HTML 格式的邮件正文
const articles = items.map((item, index) => {
return `
<div style="margin-bottom: 20px; padding: 15px; border-left: 3px solid #ff6600;">
<h3 style="margin: 0 0 8px;">
<a href="${item.json.url}">${index + 1}. ${item.json.title}</a>
</h3>
<p style="margin: 0 0 8px; color: #666;">分数:${item.json.score} |
<a href="https://news.ycombinator.com/item?id=${item.json.id}">HN 评论</a>
</p>
<p style="margin: 0; color: #333;">${item.json.summary}</p>
</div>
`;
}).join('');
const emailBody = `
<h2 style="color: #ff6600;">🚀 今日 Hacker News Top 10(${new Date().toLocaleDateString('zh-CN')})</h2>
${articles}
<p style="color: #999; font-size: 12px;">由 n8n 自动生成</p>
`;
return [{ json: { body: emailBody } }];
最后添加 Gmail 节点(需要在 Credentials 中添加 Gmail OAuth2 凭证):
- To:你的邮箱地址
- Subject:
📰 Hacker News 日报 - {{ $now.format("YYYY-MM-DD") }} - Email Type:
HTML - HTML:
{{ $json.body }}
完整工作流测试
点击右上角 Execute Workflow 手动触发一次完整流程,观察每个节点的执行情况。如果某个节点出错,点击该节点查看详细的错误信息。
测试通过后,点击右上角的 Active 开关激活工作流,n8n 会从明天早上 8 点开始自动执行。
常见问题: 如果 OpenAI 节点超时,可以将 Batch Size 从 10 改为 5,减少并发请求数量。如果 Gmail 节点报授权错误,需要重新在 Google Cloud Console 配置 OAuth2 凭证。
工作流优化建议
- 成本优化:gpt-4o-mini 每 1000 tokens 约 $0.00015,摘要 10 篇文章的总成本不超过 $0.01
- 错误处理:在 OpenAI 节点的 Settings 中启用 Continue on Fail,避免单篇文章处理失败导致整体中断
- 内容质量:可以在 Code 节点中添加过滤逻辑,跳过标题含有 "Show HN" 或 "Ask HN" 的非新闻类帖子