news 2026/9/14 7:01:08

Automatisch 集成 Changedetection:创建与删除 Watch 的 Action 配置与源码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Automatisch 集成 Changedetection:创建与删除 Watch 的 Action 配置与源码解析

Automatisch 集成 Changedetection:创建与删除 Watch 的 Action 配置与源码解析

【免费下载链接】automatischThe open source Zapier alternative. Build workflow automation without spending time and money.项目地址: https://gitcode.com/GitHub_Trending/au/automatisch

本篇技术指南聚焦 Automatisch 开源自动化平台中 Changedetection 集成模块的 Action 能力:围绕官方文档定义的Create a watch(创建监控)Delete a watch(删除监控)两个操作,结合后端源码逐一还原其字段配置、API 调用链与返回数据格式,并顺带梳理连接认证与触发器机制。读完本文,你将掌握如何在 Automatisch 中为任意网站 URL 建立/移除变更检测 Watch,理解其底层如何与 Changedetection 的 REST API 交互,从而在业务流程中正确编排页面变更监控。

一、模块总览:Changedetection 在 Automatisch 中的定位

Changedetection.io 是一款自托管/云托管的"网页变更检测"服务,可周期性地抓取指定网页并在内容发生变化时给出通知。Automatisch 将其封装为独立 app 集成,模块入口定义在 packages/backend/src/apps/changedetection/index.js:

export default defineApp({ name: 'Changedetection', key: 'changedetection', iconUrl: '{BASE_URL}/apps/changedetection/assets/favicon.svg', authDocUrl: '{DOCS_URL}/apps/changedetection/connection', supportsConnections: true, baseUrl: 'https://changedetection.io', primaryColor: '#3056d3', beforeRequest: [setBaseUrl, addAuthHeader], auth, actions, dynamicData, triggers, });

从该定义可以确认以下关键事实:

  • 连接类型supportsConnections: true,所有 Action 必须先建立 Changedetection 连接(Connection)才能使用;
  • 官方默认服务baseUrl指向https://changedetection.io,但连接配置允许填写自定义Instance URL,因此也兼容自部署实例;
  • 请求预处理beforeRequest注册了setBaseUrladdAuthHeader两个拦截器,负责拼接 API 地址与注入密钥,所有 Action/Trigger 的 HTTP 请求都会自动经过这两步;
  • 能力组成actions(2 个)、dynamicData(下拉数据源)、triggers(1 个)。

本模块共有 3 份文档页面:actions.md(本文主体)、connection.md(连接配置)、triggers.md(触发器),分别对应用户视角的三种交互形态。

二、Action 清单:官方文档定义的两大操作

官方文档 packages/docs/pages/apps/changedetection/actions.md 采用清单式结构(frontmatter + 动态组件渲染),明确定义了模块提供的全部 Action:

Action 名称说明
Create a watchCreates a new change detection watch for a specific website.(为指定网站创建新的变更检测 Watch)
Delete a watchDeletes a change detection watch.(删除一个变更检测 Watch)

两个 Action 分别对应源码 create-watch/index.js 与 delete-watch/index.js。下文逐一对它们的字段、执行逻辑与返回结果做深度展开。

三、Action 一:Create a watch(创建监控)

3.1 字段配置

由 create-watch/index.js 可知,该 Action 仅需一个必填参数:

配置项键(key)类型必填变量支持说明
URLurlstring想要监控的网页地址(URL you want to monitor)

type: 'string'表示编辑器渲染为单行文本框;variables: true表示该字段可以插入上游步骤的输出变量(例如用表单提交的链接、邮件正文中提取的 URL 作为监控目标),这使该 Action 很容易嵌入"收到新数据 → 自动开始监控"这类动态流程。

3.2 执行逻辑与 API 调用

async run($) { const url = $.step.parameters.url; const body = { url, }; const response = await $.http.post('/v1/watch', body); $.setActionItem({ raw: response.data }); }

执行流程分为三步:

  1. 取值:从$.step.parameters.url读取用户在流程编辑器中填写的 URL;
  2. 请求:向/v1/watch发送POST请求,请求体为{ url }。注意此处路径是相对路径,实际完整地址由beforeRequest中的setBaseUrl拦截器在请求发出前拼接而成;
  3. 输出:通过$.setActionItem({ raw: response.data })将 Changedetection 返回的完整响应体作为本步骤输出,供后续步骤引用。

3.3 底层请求构造:baseURL 与鉴权头

该 Action 之所以只写相对路径即可工作,是因为模块在beforeRequest中注册了两个拦截器:

  • set-base-url.js:
import { URL } from 'node:url'; const setBaseUrl = ($, requestConfig) => { requestConfig.baseURL = new URL('/api', $.auth.data.instanceUrl).toString(); return requestConfig; };

它将baseURL动态设置为Instance URL + /api。因此连接时填写的 Instance URL 形如https://changedetection.io时,Action 实际请求的完整地址为https://changedetection.io/api/v1/watch。这一设计同时兼容官方云服务和用户自部署的 Changedetection 实例——只需在连接时把 Instance URL 指到自己的服务即可。

  • add-auth-header.js:
const addAuthHeader = ($, requestConfig) => { requestConfig.headers['x-api-key'] = $.auth.data.apiKey; return requestConfig; };

它为每个请求附加x-api-key头,值来自连接中保存的 API Key。这是 Changedetection 官方 API 的标准鉴权方式,Automatisch 在每次调用前自动注入,使用者无需在 Action 中手动维护凭证。

3.4 输出与后续使用

response.data直接透传 Changedetection 的响应,通常包含新创建 Watch 的 ID、URL、创建时间等字段。典型用法是:将响应中的 Watch ID 存入数据存储(datastore)或作为变量传给后续步骤——例如下一步立即执行"Delete a watch"或让"Changed watch"触发器监听该 ID。

四、Action 二:Delete a watch(删除监控)

4.1 字段配置

由 delete-watch/index.js 可知,删除操作同样只有一个必填参数:

配置项键(key)类型必填变量支持说明
Watch IDwatchIdstring想要删除的 Watch ID(Watch ID you want to delete)

watchId支持变量注入,因此常与 Create a watch 或"Changed watch"触发器配合,实现"监控任务完成/不再需要 → 自动删除监控"的闭环。

4.2 执行逻辑与 API 调用

async run($) { const watchId = $.step.parameters.watchId; await $.http.delete(`/v1/watch/${watchId}`); $.setActionItem({ raw: { result: 'successful', }, }); }

执行流程:

  1. 取值:读取$.step.parameters.watchId
  2. 请求:向/v1/watch/{watchId}发送DELETE请求(同样经过 baseURL 拼接与x-api-key注入);
  3. 输出:与 Create 不同,Delete 不依赖服务端响应体,而是固定输出{ result: 'successful' }作为 Action Item。后续步骤可以据此判断删除操作已成功执行。

五、配套机制:连接认证与"Changed watch"触发器

虽然本文主体是 Action,但两个 Action 的实际可用性高度依赖连接认证与触发器配合,这里一并给出源码层面的佐证。

5.1 连接(Connection)配置

官方文档 connection.md 给出了建立连接的标准步骤:

  1. 进入你的 Changedetection 管理后台;
  2. 点击Settings按钮;
  3. 切换到API标签页;
  4. 将页面上的API key复制到 Automatisch 的API Key字段;
  5. 在 Automatisch 的Instance URL字段填入你的实例地址;
  6. 填写一个展示用的屏幕名称(Screen Name);
  7. 保存后即可开始使用 Changedetection 连接。

对应的字段定义位于 auth/index.js,共三个必填项:screenName(UI 展示名称)、instanceUrl(实例地址)、apiKey(API 密钥)。

连接建立时会触发凭证校验,见 verify-credentials.js:

const verifyCredentials = async ($) => { await $.http.get('/v1/systeminfo'); await $.auth.set({ screenName: $.auth.data.screenName, apiKey: $.auth.data.apiKey, }); };

即保存连接前,Automatisch 会调用一次GET /api/v1/systeminfo验证 API Key 与 Instance URL 是否有效(请求同样自动携带x-api-key头),校验通过后才正式存储连接。这解释了为什么文档要求必须先在 Changedetection 后台开启 API Key——没有合法密钥,连接无法建立,后续 Action 自然无从执行。

5.2 "Changed watch"触发器(配套能力)

triggers.md 定义了唯一触发器Changed watch(当检测到任何变更时触发),源码位于 changed-watch/index.js:

  • 轮询间隔pollInterval: 15,即每 15 秒轮询一次;
  • 参数watchId,以下拉框形式从动态数据源选择(source指向listWatches);
  • 执行逻辑GET /v1/watch/{watchId}获取 Watch 状态,若响应非空则推送触发项,并以${watchId}-${data.last_changed}作为去重internalId——当last_changed时间戳变化时才会再次触发,实现"仅内容变更才触发"。

Watch 下拉框的数据来自 dynamic-data/list-watches/index.js:它调用GET /v1/watch拉取全部 Watch,遍历响应对象将watchId映射为下拉选项的 value、watchData.url作为展示名称。因此,在流程编辑器中,用户可以直接从下拉列表挑选要监听的 Watch,而无需手抄 ID。

这一触发器与两个 Action 形成了完整闭环:Create a watch创建监控 →Changed watch在页面变动时触发后续通知/处理 →Delete a watch在任务完成后清理监控资源。

六、实战编排建议

基于以上源码证据,可以给出两种贴合实际场景的编排方式(均为 Automatisch 流程设计器内的配置思路):

  1. 动态监控链路:某表单/邮件触发流程 → 提取 URL 变量 → 使用Create a watch创建监控(URL 字段勾选变量)→ 用Changed watch触发器监听该 Watch,并在内容变化时执行通知(如发送邮件、推送 Slack/Telegram 消息)。此链路依赖urlwatchId的变量透传能力。
  2. 监控生命周期管理:将Delete a watch挂在业务流程的收尾步骤,Watch ID引用上游步骤(如 Create a watch 的输出或数据存储中的值),实现自动化清理,避免 Watch 无限堆积、消耗 Changedetection 配额。

七、总结

Automatisch 的 Changedetection 集成以官方文档定义的Create a watchDelete a watch两个 Action 为核心,分别对应POST /api/v1/watchDELETE /api/v1/watch/{watchId}两个底层 API 调用;配合连接时的/v1/systeminfo凭证校验、"Changed watch"轮询触发器与 Watch 下拉动态数据源,构成了从创建、监听、通知到删除的完整网页变更检测自动化闭环。两个 Action 的入参均支持变量注入,非常适合嵌入"数据驱动 → 自动监控 → 变更通知"的真实业务场景。

【免费下载链接】automatischThe open source Zapier alternative. Build workflow automation without spending time and money.项目地址: https://gitcode.com/GitHub_Trending/au/automatisch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 7:00:52

Python开发ZIP压缩包CSV批量转Excel工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 7:00:04

Gitee生态下SCA工具选型:从依赖解析到漏洞治理的完整框架

这次我整理软件成分分析(SCA)工具的选型框架,起因是团队在 Gitee 上托管了 40 多个仓库,依赖安全问题反复在灰测阶段被捅出来。市面上讲 SCA 原理的文章不少,但真正回答“怎么选”的很少,尤其是当你所在的研…

作者头像 李华
网站建设 2026/9/14 6:57:30

IoT遥控APP自动重连设计:协议适配与安卓生命周期协同

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 6:56:58

Linux内核C1M连接性能优化:192核单调度域下的指令级调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 6:54:55

Milvus Attu打不开?Docker端口映射与网络链路深度解析

1. 为什么你第一次启动Milvus后,浏览器打不开Attu?——端口映射不是“配个数字”那么简单你兴冲冲地敲下docker run -d --name milvus-standalone -p 19530:19530 -p 8080:8080 -v /path/to/milvus:/var/lib/milvus -e ETCD_ENDPOINTSetcd:2379 -e MINIO…

作者头像 李华