假期在家闲来无事,想起来之前朋友圈好多小伙伴发的 N8N,之前上班比较忙,只是匆匆看了眼,没有亲自实践过,趁着假期,亲自动手实践了一遍 N8N,感觉还挺有意思的,有点像 Coze 和 Dify,但是感觉更灵活。
接下来算是一个入门科普文章,松哥手把手带大家做一个 N8N 工作流,小伙伴们可以借此感受下 N8N 的能力。
N8N(读作 N-eight-N)就是一个开源、可视化、节点式的工作流自动化工具,说白了就是帮你把各种系统、API、服务串起来自动跑流程,不用写一堆胶水代码。
你可以把它理解成:可视化的“流程编排引擎”+ 自带几百个集成节点 + 随时能插 JS/Python 代码的低代码平台,自己服务器就能跑,数据全在你手里。
那么这玩意能干啥?松哥举几个常见的场景:
能力还是非常强大。
N8N 安装也是非常容易,建议用 Docker 一键安装。
Docker 安装指令如下:
docker volume create n8n_data
docker run -it \
--name n8n \
-p 5678:5678 \
-e GENERIC_TIMEZONE="Asia/Shanghai" \
-e TZ="Asia/Shanghai" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-v n8n_data:/home/node/.n8n \
-d docker.n8n.io/n8nio/n8n

安装好之后,我们就可以直接在浏览器中访问了:
http://localhost:5678/
接下来松哥通过一个案例来和大家说明一下 N8N 的简单玩法。
先大概说明一下场景。
想做一个关于财经新闻的聊天机器人,整体上的流程是这样:
用户发送消息 -> 获取财经资讯 -> AI 进行处理 -> 回复用户
另外还有一条支线任务,在获取到财经资讯之后,将相关的数据存入到飞书多维表格。

其中,获取财经资讯使用的接口是财联社的公开接口:
https://www.cls.cn/nodeapi/telegraphList
该接口返回的数据格式如下:

好了,准备工作大概就这些,接下来我们打开 N8N 的网页,就可以开始绘制流程了。
我先来给大家看一下整体的流程编排,然后我再逐个讲解每个 Node 节点。

首先这个就是一个触发节点,也就是整个流程由谁触发,从哪里开始。
系统支持的触发节点主要有如下几类:

简单来说,主要是如下几种:
这四种是最为常见的触发器,其他还有文件触发、数据库触发、Email 触发、GitHub 触发、飞书多维表格触发、Kafka 触发、MQTT 触发等等,我就不逐一列举了。
我这里使用聊天类触发,所以选择 On chat message,将之拖动到流程中,这个比较简单,也不用做任何设置。
第二个节点是 HTTP Request,看名字就知道,这个节点是为了发送 HTTP 请求的,所以这个节点需要做一点配置,我们可以双击该节点,就打开了配置页面,由于这个接口不需要认证,所以主要配置一下请求方式和接口地址即可:

code01 这个节点主要是对 HTTP 请求取回来的数据做一个简单处理,将第三方接口返回的数据格式化为我们需要的数据。
首先我们需要添加 Code 节点:

在添加 Code 节点的时候,大家可以根据自己的技术栈选择 JavaScript 或者 Python 去进行编码,松哥这里选择 JS。
这个节点的配置主要是一段 JS 代码,如下:

我把我的 JS 代码放出来供大家参考:
const rawData = $input.item.json.data.roll_data||[];
// 配置格式化规则
const options = {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false // 禁用 12 小时制,使用 24 小时制
};
const formattedData = rawData.map(item=>{
const date = new Date(item.ctime*1000);
const formattedCtime = new Intl.DateTimeFormat('zh-CN', options)
.format(date)
.replace(/\//g, '-')
.replace(' ', ' ')
.replace(':', ':');
return {
title: item.title || '无标题',
content: item.content.replace(/\n\n/g, '') || '无内容',
ctime: formattedCtime,
reading_num: item.reading_num || 0,
level: item.level || '无级别',
shareurl: item.shareurl || '无链接'
};
});
return [{json:{records:formattedData}}]
这里需要说明的是,流程带过来的 JSON 数据通过 $input.item.json去获取,其他都是常规的 JS 代码,不啰嗦。
经过该节点之后,原始接口返回的数据,就会被转为如下格式:

左边是原始数据格式,右边是转化之后的数据格式。
这个节点其实可以和 3.3 小节的节点合并,但是为了大家看的更加清晰,这里我就单独又加了一个 Code 节点,这个节点的目的主要是将 3.3 小节输出的 JSON 中的 records 数组提取出来,确保最终给到 Loop Over Items 节点的数据是一个 JSON 数组。
该节点配置如下:

这个代码应该很好懂,就是从 JSON 中提取出来 records 属性。
代码也放出来,方便大家 copy:
return $input.all()[0].json.records;
这是一个循环处理节点,因为我要将 3.2 节点请求到的数据最终都存入到飞书多维表格中,因此需要对这些数据进行遍历存储,遍历一条,就将一条存入到飞书多维表格。
飞书多维表格在配置的时候似乎不支持配置批量 JSON,也可能是我不得其法,欢迎了解的小伙伴评论区指教。
Loop Over Items 会对上个节点输入的数据进行遍历,每遍历一条,就会走一遍循环,也就是走一遍飞书节点,将数据存入到飞书多维表格中。

我们再来看下飞书节点配置:

这个节点有几个关键点:

要点主要是上面这几点。如果有小伙伴还不清楚,可以在群里一起讨论。
最后再给大家看下完整的请求体 JSON:
{
"records": [
{
"fields": {
"title": "{{$json.title}}",
"content": "{{$json.content}}",
"ctime": "{{$json.ctime}}",
"reading_num": "{{$json.reading_num}}",
"level": "{{$json.level}}",
"shareurl": "{{$json.shareurl}}"
}
}
]
}
再来看另外一条线上的 AI Agent。
这个节点我们需要配置一下 Chat Model 和 Memory。
Chat Model 也主要是需要大家去各个大模型平台申请 API Key,这个我就不说了,我这里用了本地安装的 qwen3-vl:30b 模型,给大家看下配置:


memory 我配置了 Redis,用来存储会话的上下文,这个也是配置一下 Redis 的地址即可:


最后,我们在 AI Agent 上再配置一个 Prompt 即可,如下:

这里大家注意两个不同的变量引用:
请你结合财联社电报咨询信息:{{ $json.data.roll_data.map(item=>item.content) }},回答用户提问 {{ $json.chatInput }}
好了,大功告成。
接下来我们可以直接在 N8N 的网页上开展对话:

存储到飞书多维表格中的数据如下:

感兴趣的小伙伴可以试试,有问题可以群里讨论。