IFTTT 的本地部署平替 – n8n 自动化工作流

我们也许已经使用过一些自动化工作流的服务或工具,如 IFTTT 或 iOS 系统中的快捷指令。这些服务可在某些事件发生时,自动按照预设好的逻辑执行对应的指令——“在股票价格涨至 XX 时提醒我卖出”,又或者 “每天早上 9:00 自动进行软件每日签到”,都可以通过这些工具来轻松实现,就像部署了一个个人助理一样。

这些工具有着各自的局限性。例如 IFTTT 的免费版本仅提供了 3 条激活的工作流配额,超出的部分需要付费月度订阅。而 iOS 中的快捷指令则依赖于手机本身,当设备网络断开或者电量耗尽时,相关指令便不再执行。本文介绍了一款可在本地部署的工作流软件 n8n,该软件提供了强大的无代码或低代码工作流配置功能,能实现从简单到复杂的自动化工作流的能力,并可以配置和调用外部大语言模型作为 AI Agent(代理型人工智能)来完成智能判断和工具调用等功能。

一张屏幕截图,在左上角写出了 “On-board new joiners and provision accounts”,描述了一个 UI 定义的工作流程
来自 n8n.io 官方网站的一张屏幕截图,展示了一个可以自动为新用户配置内部系统账户与权限的 n8n 自动化工作流

功能亮点

为什么选用 n8n 这款工具?最大的原因是这是目前最好用的可以在本地部署的工作流自动化工具。这款工具提供了我对一个工作流自动化工具的所有基本期待,包括:

  • 支持仅通过 UI 以无代码的方式配置工作流
  • 自定义 HTTP 请求的各方面,还可以通过 cURL 一键导入
  • 拥有代码执行模块,可以自己编写 JavaScript 或 Python 脚本代码,以处理在工作流节点之间传递的数据
  • 已经提供与数百款第三方平台的 API 集成的模块,基本覆盖到我使用的常用平台
  • 可以浏览每一次执行细节,包括检查每次执行中每个节点的数据都是怎样的

搭建 n8n 环境

n8n 和其他仅提供订阅制的工作流软件的不同之处是,他们有一个在 GitHub 上开源的免费社区版本。该版本除了阉割了一些高级功能(如环境变量配置和多人凭据共享等)以外,所有基本功能都是比较齐全的。除此之外,n8n 也提供了云服务的版本,但该版本(n8n Cloud)没有免费层级。因此,我们推荐在本地服务器搭建 n8n 环境。对于仅希望快速体验 n8n 功能的用户,在 Bilibili 与 YouTube 等平台均有许多演示视频,可供快速评估 n8n 软件的功能。

根据 n8n 的文档,其提供了两种本地部署的选项:通过 npm 包管理器,或者通过 Docker 容器安装。通过 npm 的安装方式直观且快速,可在几分钟内就在本机部署好并运行 n8n 实例:

npm install n8n -g
n8n start

默认情况下,n8n 使用本地 SQLite 数据库用作数据存储。另外,作为生产环境使用时,你也许希望配置 n8n 的服务器域名、回调消息的接收 URL 以及启动端口等参数,这些在 n8n 文档的配置章节中有多篇文档描述。在这里我给出我启动 n8n 使用的脚本命令,以供参考:

#!/bin/bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

export VUE_APP_URL_BASE_API=https://ai.example.com/
export EXECUTIONS_TIMEOUT=3600
export GENERIC_TIMEZONE=Asia/Beijing
export N8N_PROTOCOL=https
export N8N_HOST=ai.example.com
export N8N_PORT=5678
export WEBHOOK_URL=https://ai.example.com/

n8n

我是使用 npm 的方式部署并运行 n8n 实例的,我在本地服务器配置了 Nginx 对 n8n 进行了反向代理。最终的运行结果如下图所示:

一张 n8n 软件的屏幕截图,展示了 n8n 社区版本的主页面。在概览列表中,有 2 个已经存在的 n8n 工作流,分别是 “自动填写 MDAC(马来西亚入境卡)” 以及 “华住会一键签到”
我自己部署的 n8n 版本

基本使用

如果你从没使用过类似的工具,n8n 官方在 YouTube 上提供了一系列非常好的初学者课程(英文版),这将很好地帮到你。当然,在这篇文章中,我也会向你传授构建一个好的工作流的秘密要点,这不仅适用于 n8n,也适用于其他的工作流自动化软件。

面对着空无一物的 n8n 工作流画布,你是否有那么一瞬间迷失了方向,不知道自己接下来要做什么?回想生活中的实际需求,不知道身边有哪些事情可以被工作流软件 “自动化”?我的建议是首先要找到一个使用 n8n 软件来自动化的简单目标,这个目标可能是:

  • 一个每天你都会在手机上做的重复性工作
    • App 中的每日签到?中午的外卖软件订餐?简单回复客户的邮件?
  • 一个在特定时间你需要做的麻烦或容易忘记的事情
    • 收到机票订单之后,自动将行程记录到日程里?每月自动整理网盘里的照片?每周二晚上提醒你要求游泳?

其实坦率地说,如果要论这些平台的开放性来说,一些在国际上广泛使用的软件的开放程度要比中国内地使用的大多数软件要高得多。比如 Telegram、WhatsApp 都有 API 可供编程调用,而像微信等软件,即使你使用了一些编程手段去调用,也会因为违反用户协议而可能遭致封禁。说到底还是生态环境不一样。

接下来,我们以 App 内的每日签到为例,来展示如何使用 n8n 代替每天繁琐的人类劳动。这可能是使用 n8n 的一个很好理由。

要构建一个工作流,你需要从以下几方面来思考:

  • 这个工作流会在什么时候被执行
    • 定时执行:每天早上 9 点?每个月第三个周二?或者每年的生日那一天?
    • 手动执行:仅在有需要时手动触发?或者通过用户填写一个联系表单触发?
    • 某个事件发生时执行:收到了包含特定关键词的电子邮件?或者连续收到了某个人的 3 条消息?
  • 执行这个工作流时,会发生什么事情
    • 与第三方软件通过 API 进行交互:发送一个自定义请求?添加一个 Outlook 日历日程事件?
    • 内部执行一些自定义代码(使用 JavaScript 或 Python)
    • 进行工作流控制:处理一系列数据,直到 XXX?判断上一个执行的结果,根据执行结果的不同采取不同行动?
  • 是否依赖任何数据,或者在数据间需要进行何种转换
    • 依赖第三方数据源:股票价格信息?天气情况?未读邮件数量?每日早间新闻?
    • 是否需要对数据进行提取或转换:使用 AI Agent 总结数据?从数据结构中只提取一个字段?

对于 App 每日签到工作流,我们希望在每天早上 9 点自动执行它,每次执行时,它会像用户在手机 App 点击 “签到” 按钮一样,发起一个 HTTP 网络请求。除此之外,该工作流不需要任何外部数据,也不需要在数据之间进行提取或转换。

我们通过在 n8n 主页面右上角点击 “Create Workflow”(创建工作流)按钮,以创建一个新的空白工作流。在空白画布的中央,点击 “Add first step”(添加第一个步骤)按钮,以添加一个工作流触发器:

一张 n8n 工作流的屏幕截图,展示了一个默认空白工作流以及右侧的 “添加触发器” 选择器
n8n 的工作流选择器页面

由于我们的工作流在每天早上 9 点自动运行,因此在这里我们选择 “On a schedule”(定时)选项,然后在打开的窗口配置对应的定时策略。

n8n 中的 Schedule Trigger 设置器,相关的参数被设置为按天触发,每 1 天触发一次,每天早上 9 点 0 分触发
每天早上 9 点运行一次的触发器配置

接下来我们添加 App 签到功能的节点。通常要求签到的 App 是不提供公开 API 的(因为这些软件期望用户每天手动点击签到,以增强用户粘性),因此,我们需要用一些技巧来抓取签到操作对应的网络请求。我们以 iOS 上的步骤为例,这需要在手机上安装一个抓包工具,如 App Store 上的 Stream 等。打开要签到的 App,在点击签到按钮步骤之前,打开相应抓包工具的录制或监控功能,然后点击 App 中的签到按钮后,关闭对应的抓包工具。这样一来,你就抓取到了包含签到请求的尽可能少的请求列表,这有助于你分析具体的有效请求。

分析签到请求的一个技巧是,通过观察请求列表中包含类似 “签到” 含义的 URL 的对应 GET 或 POST 请求,看到这些请求的响应信息,一般都会有服务器端 API 返回的签到确认信息,像下面的样子:

"sign_message": "签到成功"

许多抓包软件都有请求重放功能,该功能有助于你确认对应的请求是否是有效的签到请求。在第二天对疑似的请求进行重放,从而确认哪个请求是对应的签到请求。由于这些请求包含了 App 的用户登陆状态,因此请求的结构体可能比较大,最方便的方式(大多数抓包软件都有提供)是复制请求为 cURL 格式。而 n8n 的 HTTP Request(HTTP 请求)模块可以允许粘贴一个 cURL 命令以做解析,非常方便:

一张来自 n8n 软件的屏幕截图,展示了 HTTP Request 模块可以通过粘贴 cURL 命令来自动解析请求内容
n8n 的 HTTP Request 模块允许通过粘贴一段 cURL 命令来自动解析 HTTP 请求

设置好之后,可以点击橙色的 “Test step”(测试步骤)按钮,来执行对应的 HTTP 请求,你能从右侧的结果窗口看到 HTTP 的响应。一切设置妥当后,别忘了点击工作流编辑器右上角的 “Save”(保存)按钮,保存编辑的工作流。然后在主页面中打开对应工作流的开关,这样一来,每天上午 9 点 n8n 就可以为你执行自动签到了。

当然,n8n 的官方网站也提供了许多用于生产环境的工作流示例,这些工作流展示了与第三方系统(如 CRM 系统)集成的用例。一些复杂的工作流还包括将数据交由 AI Agent 处理的逻辑。与大语言模型进行交互是另一个有趣的话题,我们将在之后的文章中做更多介绍。