changedetection.io 0.60.9 快速入门(添加监控到差异告警)

changedetection.io 0.60.9 快速入门教程,手把手完成添加监控、CSS/JSON/XPath 过滤器、查看差异、配置告警通知到重检策略的完整闭环,全部操作在真实环境实测通过。

changedetection.ioUbuntuUbuntu 22.04Linux监控2026/10/17

changedetection.io 0.60.9 快速入门(添加监控到差异告警)

目标:在已安装的 changedetection.io 0.60.9 上,完成一次完整的变更监控闭环——添加监控、设置过滤器、查看差异、收到告警通知。本篇所有界面文案与 API 回显均来自 0.60.9 实测。

本篇演示环境:changedetection.io 0.60.9(pip 安装,访问地址 http://127.0.0.1:5000,远程访问把 127.0.0.1 换成你的服务器实际 IP);被监控目标是一个自建的"商品价格页"(http://127.0.0.1:8000/monitor-test.html,页面含价格、库存、版本号等字段,方便演示变化)。安装步骤见《changedetection.io 0.60.9 Ubuntu 22.04 安装指南》。

一、环境信息

项目实测值
changedetection.io 版本0.60.9
Web 界面http://127.0.0.1:5000(默认端口 5000,无登录密码的匿名模式)
监控目标示例http://127.0.0.1:8000/monitor-test.html(商品价格演示页)
通知演示渠道json:// Webhook(本地接收器 http://127.0.0.1:9000/changedetection)

💡 说明:changedetection.io 默认是匿名模式(没有账号体系),打开界面即可使用。只要在 Settings → General 中设置过访问密码,所有访问才需要登录。

二、前置条件

  • changedetection.io 服务已启动:systemctl is-active changedetection 输出 active(或 Compose 版 docker compose ps 状态为 running);
  • 浏览器能打开 http://127.0.0.1:5000,页面标题为 Change Detection;
  • 准备一个可访问的监控目标 URL(本篇用自建演示页,你也可以换成任意公开网页,如商品页、新闻列表、软件下载页)。

三、认识主界面

打开 http://127.0.0.1:5000,主界面分为三个区域(以下控件名均为 0.60.9 实测原文):

① 顶部工具栏:搜索框(aria 标签 Filter watches,按关键字过滤监控列表)、Pause checks(暂停全部检查调度)、Mute notifications(临时静音通知)、RSS 图标(RSS Feed,输出变更 feed)、Import lists of web pages(批量导入 URL 列表)、Queue(查看当前检查队列)、Live activity(实时活动窗口)。

② 添加监控表单(页面右上角):

控件实测信息
URL 输入框placeholder="www.website.com/page.html",必填
Processor 单选Webpage Text/HTML, JSON and PDF changes(默认选中,通用变更监控)/ Restock and price detection(补货与价格监控)
提交按钮按钮文字为 Watch

③ 监控列表:每个监控一行,显示标题(URL)、标签、上次检查时间、上次检查状态;行内快捷按钮 pause / mute / recheck;列表上方批量操作按钮支持多选后 recheck(重检)、mark-viewed(标记已读)、clear-errors(清除错误)、assign-tag(分配分组)、mute / unpause 等。

首次全新安装时,列表里已有两个官方预置示例监控(https://news.ycombinator.com/ 与 https://changedetection.io/CHANGELOG.txt),用于演示,可选中后删除。

四、添加第一个监控

4.1 界面方式

在右上角表单 URL 框输入监控目标,点击 Watch 按钮:

URL: http://127.0.0.1:8000/monitor-test.html

提交后页面刷新,列表中出现新监控行,同时界面提示该监控已加入检查队列。首次检查完成后,这条监控的历史基线(第一次快照)就建立了。

等价的 REST API 创建方式(响应为监控 UUID):

curl -s -H "x-api-key: 5521439027a85d13458e92c9c11b0cda" -X POST -H "Content-Type: application/json" -d '{"url": "http://127.0.0.1:8000/monitor-test.html", "tag": "价格监控"}' http://127.0.0.1:5000/api/v1/watch

实测回显:

{"uuid": "c7995f0b-253d-4736-86b4-7fad08b927c6"}

💡 说明:x-api-key 的值在 Settings → API 页查看(0.60.9 首次安装自动生成)。API key 是调用 REST API 的唯一凭证,注意保密。API 全量用法见《changedetection.io 0.60.9 进阶实战与运维》。

4.2 手动触发首次检查

新监控会按默认策略排队检查,想立刻建立基线可以手动触发:

  • 界面:点击监控行内的 recheck 按钮;
  • API:访问 GET /api/v1/watch/<uuid>?recheck=true(uuid 即 4.1 返回的值)。

检查完成后,监控行会显示"上次检查时间",无红色错误标记即抓取成功。

4.3 理解基线快照

changedetection.io 的告警逻辑是对比两次快照:第一次抓取的内容是基线,之后每次抓取与最近一次快照对比,有差异才算"变更"。所以刚添加的监控不会触发任何通知——这是正常现象。

五、用过滤器只盯关键内容

网页上往往有会频繁变化但我们不关心的部分(广告、时间戳、推荐位)。过滤器让监控"只看"你指定的区域,既减少噪音告警,又能做精准追踪(如只盯价格数字)。

5.1 过滤器在哪里设置

进入监控编辑页(点击列表中的监控标题):Filters & Triggers 标签页 → CSS/JSONPath/JQ/XPath Filters 输入框。一行一个过滤器,可叠加多条。

5.2 CSS 选择器实测(推荐入门)

演示页的结构中价格元素是 <div id="price">¥129.00</div>。设置 CSS 过滤器:

#price

点击 Save 保存后手动 recheck。此后这个监控只关注 #price 元素的文本变化。

实测效果:把演示页价格从 ¥129.00 改成 ¥139.00 后重检,监控立即检出变更;而同页面上"版本号 v1 → v2"、"现货 → 缺货"等其他字段的变化不再触发告警(快照中只有价格)。这正是过滤器的价值。

5.3 JSON 监控与 json: 过滤器实测

监控 JSON 接口(如价格 API)时,URL 直接填接口地址,用 json: 前缀的过滤器提取字段。演示接口 http://127.0.0.1:8000/status.json 内容:

{
  "name": "监控测试数据",
  "version": "v1",
  "price": 129.00,
  "stock": "in_stock",
  "items": [
    {"id": 1, "name": "商品A", "qty": 12}
  ]
}

创建监控时过滤器填:

json:price

实测效果:把接口中的 price 从 129.00 改为 99.00 后重检,差异输出(REST API difference 端点原文):

(changed) 129.0
(into) 99.0

价格字段被精准提取,JSON 里其他字段的变化完全不干扰。

5.4 XPath 过滤器实测

对表格类内容可用 xpath: 前缀。演示表格页中"状态"列单元格为 <td class="state">运行中</td>,过滤器填:

xpath://tr/td[@class="state"]

实测效果:把"节点二"的状态从"运行中"改为"已停止"后重检,快照内容只剩状态列两行文本:

  运行中
  已停止

变更被精准捕获。

5.5 过滤器语法速查

语法前缀示例适用
CSS 选择器无前缀#price、div.price-tagHTML 页面(最常用)
JSONPathjson:json:price、json:items[0].nameJSON 接口
XPathxpath:xpath://tr/td[@class="state"]复杂 HTML/表格
JQjq:jq:.price复杂 JSON 加工
移除元素Remove elements 输入框div.ads(CSS)反向剔除噪音区域

💡 技术拓展:CSS 选择器三分钟入门——#id 按 id 选(唯一元素)、.class 按类名选、div p 选 div 内所有 p、div > p 只选直接子级、[name="value"] 按属性选。在浏览器开发者工具(F12)里可以在 Elements 面板右键元素 → Copy → Copy selector 直接拿到选择器。拿不准时先填进去保存重检,从快照结果反推是否选对了元素。

六、查看差异

6.1 差异页

发生变更后,监控行会出现高亮标记(Unread 徽标)。点击进入差异视图(页面标题格式为 Change Detection - <监控URL> - History),新旧内容左右并排,变化部分用颜色标注:

  • 红色块 Changed text:被替换的旧内容;
  • 绿色块 Changed into:替换后的新内容;
  • 页面顶部显示相似度百分比(实测示例 80%);
  • 点 Unread 标记或列表批量 mark-viewed 可清除未读状态。

6.2 文本化差异输出

同一份差异在 REST API / RSS / 通知中的文本形态是统一的。实测 difference 端点输出(价格页从 v1 到 v2 的变化):

(changed) 产品监控页面
(changed)
(changed)   ¥129.00
(changed)   现货
(changed)   页面版本 v1
(changed)   * 第一条公告:系统上线
(into)   ¥139.00

(changed) 行是旧内容,(into) 行是新内容。配合 5.2 的 CSS 过滤器后,输出会精简为只有 (changed) ¥129.00 / (into) ¥139.00 一组。

6.3 差异可读性微调

编辑页 Filters & Triggers 标签页底部有一组文本预处理开关,按需勾选:

  • Sort text alphabetically:字母排序(顺序无关的列表用);
  • Trim whitespace before and after text:去除首尾空白;
  • Remove duplicate lines of text:去重复行;
  • Added lines / Replaced/changed lines / Removed lines:只在新增/变更/删除行出现时才触发告警(三选一的场景化触发条件)。

七、配置差异告警通知

7.1 通知渠道概览

changedetection.io 的通知底层是 Apprise 库,一个配置入口支持近百种渠道,写法是 schema://参数 的 URL。常用渠道对比:

渠道通知 URL 格式示例前置准备适用场景
邮件mailto://user:q1w2e3r4@smtp.qq.com?from=aaa@qq.com&to=bbb@qq.com邮箱开启 SMTP 并拿到授权码通用、存档友好
Telegramtgram://<bot_token>/<chat_id>找 @BotFather 建机器人拿 token个人即时推送
企业微信wxteams://<webhook_key>群机器人 Webhook 地址团队协作
钉钉dingtalk://<token>群机器人 Webhook团队协作
Discorddiscord://<webhook_id>/<webhook_token>频道 Webhook社区/个人
Slackslack://<token_a>/<token_b>/<token_c>App 凭证团队协作
JSON Webhookjson://host:port/path自建接收端自动化联动、自托管
Server 酱schan://<sendkey>sct.ftqq.com 获取 SendKey国内个人微信推送

💡 选型建议:个人使用优先 Telegram/邮件(5 分钟配好);团队使用企业微信/钉钉/Slack 机器人;做自动化联动(触发脚本、联动网关)用 json:// 或 post:// Webhook。完整渠道列表见 Apprise 官方 Wiki(https://github.com/caronc/apprise/wiki)。

7.2 全局通知 vs 单监控通知

通知有两个配置层级:

  • 全局默认:Settings → Notifications 标签页,配置默认通知 URL 与模板,对所有监控生效(新建监控默认继承);
  • 单监控覆盖:监控编辑页 Notifications 标签页,可为该监控单独指定渠道与模板。

7.3 通知内容模板(Jinja2 变量)

通知标题和正文支持 Jinja2 模板变量,实测使用的配置:

Notification Title: 变更告警 - {{watch_title}}
Notification Body:  监控目标 {{watch_url}} 检测到变化:{{diff}}

常用变量:{{watch_url}}(监控地址)、{{watch_title}}(监控标题)、{{diff}}(6.2 节格式的差异文本)、{{watch_uuid}}(监控 UUID)。

7.4 实测:Webhook 通知全流程

为 JSON 价格监控(5.3 节)配置通知 URL:

json://127.0.0.1:9000/changedetection

保存后把接口价格从 99.00 改为 88.00,重检触发告警。本地 Webhook 接收器实际收到的通知报文(实测原文,中文以 Unicode 转义形式传输):

{"version": "1.0", "title": "\u53d8\u66f4\u544a\u8b66 - http://127.0.0.1:8000/status.json", "message": "\u76d1\u63a7\u76ee\u6807 http://127.0.0.1:8000/status.json \u68c0\u6d4b\u5230\u53d8\u5316\uff1a<span style=\"background-color: #fadad7; color: #b30000;\" role=\"note\" aria-label=\"Changed text\" title=\"Changed text\">99.0</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\">88.0</span>", "attachments": [], "type": "info"}

报文解读:title 是模板渲染后的标题("变更告警 - 监控URL");message 里的差异正文自带 HTML 着色标记(Changed text 红底旧值 99.0、Changed into 绿底新值 88.0),接收端可按需处理。

7.5 通知排障

配置后收不到通知时按序排查:

  1. Settings → Notifications 页有 "Send test notification" 测试按钮,先发测试消息排除渠道配置问题;
  2. 单监控勾选了 Use global settings 时会忽略本监控的通知配置;
  3. 查看主服务日志中的 Apprise 报错(journalctl -u changedetection -f 或 Compose 环境 docker compose logs -f changedetection);
  4. Telegram 等渠道需服务器能访问对应 API 域名,必要时配置代理。

八、重检策略与分组

8.1 检查频率设置

监控编辑页 Time Between Check 标签页(默认勾选 Use global settings for time between check and scheduler.,即跟随全局设置):

  • 取消勾选后可用 Weeks / Days / Hours / Minutes / Seconds 五个输入框组合出任意间隔,如 0 周 0 天 0 小时 5 分 0 秒 = 每 5 分钟检查一次;
  • 全局默认值在 Settings → General 的 Time Between Check 区设置;
  • 还可用 Scheduler 按周计划只在特定时段检查(如只在工作时间)。

⚠️ 建议:对普通网页 530 分钟一检足够;对秒杀/补货场景可压到 3060 秒,但注意对目标站的访问压力与被封风险。全局下限由环境变量 MINIMUM_SECONDS_RECHECK_TIME(默认 3 秒)兜底。

8.2 分组(Group Tag)

添加监控时在表单或编辑页 Group Tag 字段填入分组名(如 价格监控),列表会按分组聚合展示。实测 API 创建时指定 tag 参数即完成分组:

{"url": "http://127.0.0.1:8000/monitor-test.html", "tag": "价格监控"}

分组的典型用法:选中组内全部监控后批量 recheck / mute;RSS 按分组过滤输出。

九、常见问题(FAQ)

Q1:刚添加的监控为什么没有通知? 第一次抓取是建立基线快照,基线本身不构成"变更"。等下一次检查发现与基线不同才触发。

Q2:页面天天变,告警太吵怎么办? 用过滤器只盯关键区域(第五节);配合 6.3 的文本预处理开关(排序/去空白/去重)过滤无意义变化;或对嘈杂监控单独 mute。

Q3:想监控需要登录的页面? 编辑页支持在 Request 项里带 Cookie/Token(Request headers 输入框添加),或用浏览器渲染后端(html_webdriver)配合 Execute JavaScript before change detection 输入框执行登录脚本。进阶用法见《changedetection.io 0.60.9 进阶实战与运维》。

Q4:怎么把监控转移到别的实例? 用 Settings 中的备份/导出功能或直接打包数据目录,见进阶篇备份章节。

Q5:默认抓取后端和 Chrome 渲染后端怎么选? 静态页/纯文本用默认 html_requests(快、省资源);需要执行 JS、登录后看内容、截图对比时用 html_webdriver(需要按 Compose 篇部署 sockpuppetbrowser)。

十、参考链接