Synology Chat 进阶:Webhook 自动化集成指南
Synology Chat 不仅仅是一个聊天工具,通过 Webhook,它可以成为你 NAS 的通知中心和运维控制台。相比于邮件通知,Chat 消息更及时、更安全,且完全免费。
1. 什么是 Webhook?
- Incoming Webhook (传入):外部服务(如 NAS 脚本、GitHub、IFTTT)向 Chat 发送消息。
- 场景:NAS 掉线报警、Docker 容器重启通知、下载完成提醒。
- Outgoing Webhook (传出):Chat 向外部服务发送消息。
- 场景:在聊天窗口输入
/ip,机器人回复当前 NAS 的公网 IP;输入/restart plex,自动重启 Plex 容器。
- 场景:在聊天窗口输入
2. Incoming Webhook:打造通知中心
A. 获取 Webhook URL
- 打开 Synology Chat 网页版。
- 点击右上角 头像 > 整合。
- 点击 传入 Webhook > 创建。
- 自定义名称:例如 "NAS Alert"。
- 发布频道:选择一个频道(如 "#General")或创建一个专用频道(如 "#Ops")。
- 复制 Webhook URL。
B. Shell 脚本发送通知
你可以编写一个简单的 Shell 函数,在任何脚本中调用它发送通知。
#!/bin/bash
# 替换为你的 Webhook URL
CHAT_URL="https://your-nas-ip/webapi/entry.cgi?api=SYNO.Chat.External&method=incoming&version=2&token=%22YOUR_TOKEN%22"
# 发送消息函数
send_chat_msg() {
local message="$1"
# 使用 curl 发送 POST 请求
# payload 需要 URL 编码,这里使用 jq 构建 JSON (需安装 jq: opkg install jq)
# 或者简单的字符串拼接:
payload="payload={\"text\": \"$message\"}"
curl -X POST --data-urlencode "$payload" "$CHAT_URL"
}
# 测试
send_chat_msg "⚠️ NAS 磁盘空间不足 10%!"
C. 进阶:发送带链接和图片的消息
Chat 支持部分 Markdown 语法。 * 链接:[点击查看](http://google.com) * 图片:file_url 参数(图片必须是公网可访问的 URL)。
3. 实战案例:Docker 容器状态监控
我们来写一个脚本,每 5 分钟检查一次关键容器(如 jellyfin)是否在运行。如果挂了,自动重启并发送 Chat 通知。
- 编写脚本
/volume1/scripts/monitor_docker.sh:#!/bin/bash CONTAINER_NAME="jellyfin" CHAT_URL="你的WebhookURL" # 检查容器状态 if [ "$(docker inspect -f '{{.State.Running}}' $CONTAINER_NAME)" = "false" ]; then echo "容器 $CONTAINER_NAME 已停止,正在重启..." docker start $CONTAINER_NAME # 发送通知 curl -X POST --data-urlencode "payload={\"text\": \"🚨 警告:$CONTAINER_NAME 容器异常停止,已自动重启!\"}" "$CHAT_URL" fi - 设置任务计划:
- 控制面板 > 任务计划 > 新增 > 计划的任务 > 用户定义的脚本。
- 用户:root。
- 计划:每 5 分钟运行一次。
- 脚本:
bash /volume1/scripts/monitor_docker.sh
4. Outgoing Webhook:简单的交互机器人
让 Chat 变成你的命令行终端。
A. 配置传出 Webhook
- 整合 > 传出 Webhook > 创建。
- 自定义名称:OpsBot。
- 触发词:
!(当消息以 ! 开头时触发)。 - 传出 URL:这是你的后端服务地址(例如
http://192.168.1.5:5000/chat)。
B. 搭建后端服务 (Python Flask)
我们需要一个 HTTP 服务器来接收 Chat 的 POST 请求,并执行命令。
- 部署 Flask 容器: 创建一个
app.py:from flask import Flask, request, jsonify import subprocess app = Flask(__name__) @app.route('/chat', methods=['POST']) def chat(): data = request.form text = data.get('text', '') # 获取用户发送的消息,例如 "!ip" if text == '!ip': # 获取公网 IP result = subprocess.check_output(['curl', 'ifconfig.me']).decode('utf-8') return jsonify({'text': f"当前公网 IP: {result}"}) elif text == '!uptime': result = subprocess.check_output(['uptime', '-p']).decode('utf-8') return jsonify({'text': f"运行时间: {result}"}) return jsonify({'text': "未知命令"}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) - 运行容器: 将
app.py放入 Docker 运行(需安装 Flask 和 curl)。
C. 测试
在 Chat 窗口输入 !ip,机器人会立刻回复你的公网 IP。
5. 整合 IFTTT / Zapier
虽然 Chat 没有原生接入 IFTTT,但我们可以利用 Webhook 中转。 * 场景:当 RSS 订阅更新时(IFTTT Trigger),发送消息到 Chat。 * 配置: * IFTTT Action: Webhooks > Make a web request。 * URL: 你的 Chat Incoming Webhook URL。 * Method: POST。 * Content Type: application/x-www-form-urlencoded。 * Body: payload={"text": "📰 新文章发布:<<<EntryTitle>>>"}
通过这种方式,你可以把全世界的信息流都汇聚到你的 Synology Chat 中。