用n8n搭建AI自动化工作流:5步实现每日AI资讯自动收集+推送到微信
每天手动刷TechCrunch、Hacker News、GitHub Trending获取AI资讯?这篇教程教你用n8n搭建一个自动化工作流,定时抓取多源AI资讯、AI筛选过滤、自动推送到微信。全程可视化拖拽,无需写后端代码。
为什么选择n8n?
n8n是一个开源的工作流自动化平台,相比Zapier/Make等商业工具:
– 完全自托管:数据不离开你的服务器
– 300+原生集成:HTTP请求、RSS、数据库、Webhook全支持
– 代码节点:复杂逻辑用JavaScript/Python自定义
– 免费无限制:自托管版无执行次数限制
第一步:部署n8n
最简单的方式——Docker一键启动:
docker run -d \
--name n8n \
--restart always \
-p 5678:5678 \
-v ~/n8n-data:/home/node/.n8n \
-e N8N_SECURE_COOKIE=false \
n8nio/n8n:latest
打开 http://你的服务器IP:5678,创建管理员账号,完成初始设置。
第二步:创建定时触发器
在n8n编辑器中:
1. 点击 Add first step
2. 搜索 Schedule Trigger
3. 设置参数:
– Trigger Times: 0 8 *(每天早上8点执行)
– 也可以是 Every hour(测试阶段更方便)
第三步:添加多源数据抓取
以三个AI资讯源为例:
节点1:Hacker News Best
– 添加 HTTP Request 节点
– Method: GET
– URL: http://localhost:1200/hackernews/best
– Response Format: String
节点2:GitHub Trending
– 添加第二个 HTTP Request 节点
– Method: GET
– URL: https://github.com/trending?since=daily
– 从Schedule Trigger再拖一条线连接
节点3:自定义RSS
– 添加第三个 HTTP Request 节点
– URL: https://techcrunch.com/category/artificial-intelligence/feed/
第四步:AI筛选与汇总
在三个数据源后面添加一个 Code 节点(模式:Run Once for All Items):
// 合并三个数据源的结果
const items = $input.all();
let allHeadlines = [];
for (const item of items) {
const data = item.json;
// 每个源的数据结构不同,根据实际格式提取
if (data.body) {
// RSS/XML格式
const titles = (data.body.match(/(.*?)<\/title>/g) || [])
.map(t => t.replace(/<\/?title>/g, ''));
allHeadlines = allHeadlines.concat(titles.slice(0, 5));
}
}
// 去重
allHeadlines = [...new Set(allHeadlines)];
return [{
json: {
date: new Date().toISOString().split('T')[0],
count: allHeadlines.length,
headlines: allHeadlines,
summary: allHeadlines.slice(0, 10).join('\n')
}
}];
如果需要AI筛选(如只保留AI相关),可以使用DeepSeek API:
const resp = await this.helpers.httpRequest({
method: 'POST',
url: 'https://api.deepseek.com/chat/completions',
headers: {
'Authorization': 'Bearer «redacted:sk-…»',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'deepseek-chat',
messages: [{
role: 'user',
content: `从以下标题中选出与AI/LLM/开源最相关的5条:\n${headlines}`
}]
})
});
const filtered = JSON.parse(resp).choices[0].message.content;
第五步:推送到微信
由于微信个人号没有公开API,这里提供两种方案:
### 方案A:企业微信机器人(推荐,详细配置)
企业微信(WeCom)的群机器人是官方支持的推送渠道,配置简单且稳定。
获取Webhook地址:
1. 下载并登录企业微信客户端(企业微信官网:work.weixin.qq.com)
2. 在目标群聊中,点击右上角 ··· → 群机器人 → 添加群机器人
3. 为机器人命名(如”AI资讯助手”),点击添加
4. 复制生成的 Webhook 地址,格式为:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
5. 妥善保存这个 key,它等同于密码,泄露后任何人可向你的群发消息
配置n8n节点:
添加 HTTP Request 节点:
– Method: POST
– URL: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的机器人key
– Headers: Content-Type: application/json
– Body (JSON):
{
"msgtype": "markdown",
"markdown": {
"content": "## 🤖 今日AI资讯({{ $json.date }})\n> 共抓取 {{ $json.count }} 条资讯\n\n{{ $json.summary }}\n\n---\n*由n8n自动生成*"
}
}
企业微信机器人消息类型:
| 类型 | msgtype值 | 适用场景 |
|——|———–|———-|
| 文本消息 | text | 简短通知 |
| Markdown消息 | markdown | 格式化资讯推送(推荐) |
| 图片消息 | image | 截图、图表 |
| 图文消息 | news | 带封面图的文章列表 |
| 文件消息 | file | 发送PDF/Excel报告 |
注意事项:
– 每个机器人每分钟最多发送20条消息,超出会被限流
– Markdown内容不支持HTML标签,@人需使用 <@userid> 格式
– 如需@所有人,在markdown内容中添加 @all 即可
### 方案B:Telegram Bot(备选)
await this.helpers.httpRequest({
method: 'POST',
url: `https://api.telegram.org/bot${token}/sendMessage`,
body: JSON.stringify({
chat_id: chatId,
text: summary,
parse_mode: 'Markdown'
})
});
第六步:PostgreSQL去重存储
仅靠内存去重不够可靠——重启n8n后历史数据丢失,可能导致重复推送。用PostgreSQL持久化存储可以彻底解决这个问题。
准备PostgreSQL:
如果还没有PostgreSQL,可以用Docker快速启动:
docker run -d \
--name n8n-pg \
--restart always \
-e POSTGRES_USER=n8n \
-e POSTGRES_PASSWORD=your_password \
-e POSTGRES_DB=n8n_dedup \
-p 5432:5432 \
-v ~/pg-data:/var/lib/postgresql/data \
postgres:16
建表:
CREATE TABLE IF NOT EXISTS ai_news_dedup (
id SERIAL PRIMARY KEY,
title_hash VARCHAR(64) UNIQUE NOT NULL,
title TEXT NOT NULL,
source VARCHAR(100),
url TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_title_hash ON ai_news_dedup(title_hash);
CREATE INDEX idx_created_at ON ai_news_dedup(created_at);
在n8n中配置PostgreSQL节点:
1. 添加 Postgres 节点(n8n原生支持)
2. 在 Credentials 中新增数据库连接:
– Host: localhost(如果PG与n8n在同一台机器,或用Docker network中的容器名)
– Database: n8n_dedup
– User: n8n
– Password: your_password
– Port: 5432
3. 操作模式选择 Execute Query
4. 在 Code 节点之后、推送节点之前插入去重逻辑:
-- 查询今天是否已经推送过该标题
INSERT INTO ai_news_dedup (title_hash, title, source)
VALUES (MD5({{ $json.title }}), {{ $json.title }}, {{ $json.source }})
ON CONFLICT (title_hash) DO NOTHING
RETURNING id;
Code节点去重过滤:
const pgItems = $input.all();
const seen = new Set();
// 查询已有记录
for (const item of pgItems) {
if (item.json.id) seen.add(item.json.title_hash);
}
// 过滤掉已存在的标题
const deduped = items.filter(item => {
const hash = md5(item.json.title); // 需要引入crypto库或自行实现
return !seen.has(hash);
});
return deduped.map(item => ({ json: item }));
高级策略:内容指纹去重
对于标题相似但措辞不同的情况(如”GPT-5正式发布”和”OpenAI发布GPT-5″),可以存储每条标题的向量嵌入,用余弦相似度判断。n8n的OpenAI Embeddings节点配合pgvector扩展可以实现,但会增加API调用成本,建议从标题哈希去重开始。
第七步:Webhook触发器替代方案
除了定时触发,Webhook方式更适合需要即时响应或手动控制的场景。
使用场景:
– 收到特定GitHub Star数达标事件后立即推送
– 手动通过curl/脚本触发一次抓取
– 与其他系统(飞书、钉钉、Slack)联动
配置Webhook触发:
1. 将 Schedule Trigger 替换为 Webhook 节点
2. 配置参数:
– HTTP Method: GET 或 POST
– Path: /ai-news-trigger(自定义路径)
– Response Mode: When Last Node Finishes
3. 激活工作流后,n8n会生成一个生产级URL:
https://你的n8n域名/webhook/ai-news-trigger
4. 外部系统向这个URL发请求即可触发工作流:
# 手动触发
curl -X POST https://n8n.example.com/webhook/ai-news-trigger
# 带参数触发(可通过$input.first().json.query获取)
curl -X POST https://n8n.example.com/webhook/ai-news-trigger \
-H "Content-Type: application/json" \
-d '{"source": "hackernews", "limit": 20}'
安全加固:
// 在Webhook节点后添加Code节点做签名验证
const secret = '你的共享密钥';
const signature = $input.first().headers['x-webhook-signature'];
// 简单HMAC验证
const crypto = require('crypto');
const expected = crypto
.createHmac('sha256', secret)
.update(JSON.stringify($input.first().json))
.digest('hex');
if (signature !== expected) {
throw new Error('签名验证失败,拒绝执行');
}
return $input.all();
同时支持定时+Webhook:
n8n支持一个工作流同时配置多个触发器——添加 Schedule Trigger 和 Webhook 节点并列作为第一层,任一触发都会执行后续流程。两个节点用 Merge 节点汇合即可。
故障排查与调试技巧
工作流出问题时,按以下顺序排查:
### 1. 利用n8n内置调试功能
– 单步执行:点击节点 → Execute Node,单独测试每个节点的输入输出,快速定位出错位置
– Pin Data:右键节点 → Pin Data,固定测试数据后多次重跑下游节点,避免反复请求外部API
– 日志面板:点击底部 Executions 标签,查看每次执行的完整日志和错误堆栈
### 2. HTTP请求常见错误及修复
| 错误 | 原因 | 解决方案 |
|——|——|———-|
| ETIMEDOUT / ECONNREFUSED | 目标服务不可达或网络不通 | 检查URL是否正确,确认服务器能访问外网 |
| 429 Too Many Requests | 触发频率限制 | 见下文”速率限制”章节 |
| 403 Forbidden | API Key无效或权限不足 | 检查Authorization头,确认API Key未过期 |
| 响应为空/格式错误 | 目标网站返回HTML而非JSON | 使用 HTML Extract 节点代替HTTP Request直接解析 |
| XML解析失败 | RSS Feed格式不规范 | 先用HTTP Request获取原始文本,再在Code节点中用正则提取 |
### 3. 企业微信推送失败排查
– errcode: 93000:key已失效或被删除,需重新添加机器人
– errcode: 45009:接口调用超过频率限制(20条/分钟)
– errcode: 40001:access_token过期(如使用应用消息而非群机器人)
– 消息发不出但无报错:检查markdown格式是否正确,特殊字符(> # *)需转义
### 4. 生产环境监控建议
在推送节点后添加一个 Error Trigger 工作流:当主工作流执行失败时自动发送通知(邮件/钉钉/企业微信),包含失败原因和执行ID:
// 错误通知Code节点
const error = $input.first().json;
return [{
json: {
msgtype: 'text',
text: {
content: `⚠️ AI资讯工作流执行失败\n时间:${error.startedAt}\n错误:${error.error?.message}\n执行ID:${error.id}`
}
}
}];
速率限制与优化
API和推送渠道都有频率上限,不做保护会导致数据丢失或封禁。
### DeepSeek / OpenAI API限流
– DeepSeek免费额度:500万tokens/月,并发限制约30 RPM
– 在n8n的HTTP Request节点设置中开启 Retry on Fail:
– Max Retries: 3
– Retry Wait (ms): 5000(等5秒后重试)
– 使用 Wait 节点在每批API调用之间插入1秒延迟
### 企业微信机器人限流
– 每个机器人:20条/分钟
– 对于多条资讯,合并为一条Markdown消息推送而非逐条发送
– 如果内容超过4096字节限制,分批发送并在每批之间插入 Wait 节点(3秒)
### 源站限流保护
– Hacker News API:无官方限制但建议不超过10 req/s
– GitHub Trending:频繁抓取可能触发Cloudflare验证,建议间隔≥1小时
– TechCrunch RSS:属于CDN缓存内容,频率限制宽松,但建议≥30分钟
### 优化建议
// 在Code节点中添加退避逻辑
async function fetchWithRetry(url, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const resp = await this.helpers.httpRequest({ method: 'GET', url });
return resp;
} catch (err) {
if (i < maxRetries - 1 && err.statusCode === 429) {
const delay = Math.pow(2, i) * 2000; // 指数退避:2s, 4s, 8s
await new Promise(r => setTimeout(r, delay));
continue;
}
throw err;
}
}
}
执行与部署
1. 点击 Execute Workflow 测试完整流程
2. 检查每个节点的输入输出,确认数据流转正确
3. 确认企业微信/Telegram收到消息
4. 开启PostgreSQL连接,验证去重逻辑正常工作
5. 点击右上角 Active 开关激活工作流
6. 在生产环境建议设置环境变量 N8N_ENCRYPTION_KEY 以加密存储敏感信息
进阶扩展
这个基础工作流可以无限扩展:
– 接入更多源:36氪RSS、微博热搜、Reddit r/MachineLearning、Product Hunt AI分类
– 存入数据库:用Postgres节点保存历史,Chart节点生成资讯趋势图
– AI摘要:用DeepSeek对5篇头条做200字摘要,减少阅读负担
– 多平台分发:同时推送到飞书、钉钉、Discord、Slack,一个工作流覆盖全部渠道
– RAG知识库:将每日资讯写入向量数据库(如Qdrant),构建可检索的AI资讯档案
– 情感分析:在AI筛选后接入情感分析节点,标注每条资讯的正负面倾向
整套工作流的月成本:VPS约$5/月 + DeepSeek API(每天几十条分析约¥0.1)+ PostgreSQL(同VPS无需额外费用)+ n8n完全免费 = 几乎为零的运营成本,却能每天自动为你整理AI领域的最新动态。
— END —
LC 智趣厅 · 科技与生活的交点
ihygg.cn