Skip to content

Webhook 推送渠道配置指南

本教程将指导你如何在 MagicPush(魔法推送)中配置 Webhook 推送渠道,实现向任意支持 HTTP 的服务推送消息。

概述

什么是 Webhook 推送?

Webhook 是一种通用的 HTTP 回调机制。MagicPush 的 Webhook 渠道允许你配置任意 HTTP 端点,将消息以自定义格式推送到第三方系统(如 Slack、Discord、自研系统、IFTTT 等)。

特点说明
推送目标任意支持 HTTP 的服务
鉴权方式自定义 Headers(如 Authorization、X-API-Key 等)
配置复杂度中,需要了解目标服务的 API 格式
消息格式自定义(JSON 模板 + 变量替换)
频率限制取决于目标服务

前置条件

  • 已部署并登录 MagicPush 管理后台
  • 已有目标 Webhook 地址(如 Slack Webhook、Discord Webhook 等)

第一步:准备 Webhook 地址

1.1 常见 Webhook 服务获取方式

Slack Webhook

  1. 打开 Slack API
  2. 点击 「Create an app」
  3. 选择 「Incoming Webhooks」
  4. 开启 「Activate Incoming Webhooks」
  5. 点击 「Add New Webhook to Workspace」
  6. 选择频道后,获得 Webhook URL

Discord Webhook

  1. 打开 Discord 服务器设置
  2. 选择 「整合」「Webhooks」
  3. 点击 「新建 Webhook」
  4. 设置名称和频道,点击 「复制 Webhook URL」

自研系统

如果你的系统需要接收推送,需要提供一个 HTTP 接口:

  • 支持的方法:GET、POST、PUT、PATCH
  • 推荐格式:POST + JSON Body
  • 需要返回:JSON 格式响应

示例接口(Node.js):

javascript
app.post('/webhook', (req, res) => {
  const { title, content, type, timestamp } = req.body;
  console.log(`[告警] ${title}: ${content}`);
  res.json({ success: true });
});

第二步:在 MagicPush 中添加渠道

2.1 进入渠道管理

  1. 登录 MagicPush 管理后台(默认地址 http://<服务器IP>:3000
  2. 点击左侧导航 「渠道管理」
  3. 点击右上角 「+ 绑定渠道」 按钮

2.2 选择渠道类型

在弹出的对话框中,从渠道类型下拉列表中选择 「Webhook」

2.3 填写配置信息

字段说明示例
Webhook URL接收推送的 HTTP 地址https://hooks.slack.com/services/...
HTTP 方法请求方法POST(推荐)、GETPUTPATCH
自定义 Headers(可选)JSON 格式,支持模板变量{"Authorization": "Bearer token123"}
Body 模板(可选)请求体模板,支持变量替换{"text": ": "}

Headers 配置说明

如果目标服务需要鉴权,在 自定义 Headers 中填写 JSON:

json
{
  "Authorization": "Bearer your-token-here",
  "X-Custom-Header": "custom-value"
}

Body 模板配置说明

MagicPush 支持在 Body 模板中使用变量:

变量说明示例值
消息标题服务器告警
消息内容CPU 使用率超过 90%
消息类型textmarkdownhtml
ISO 时间戳2024-06-01T14:00:00.000Z

示例 1:简单 JSON 格式(推荐)

{"text": "{{title}}: {{content}}"}

示例 2:Slack 兼容格式

{"text": "*{{title}}*\n{{content}}"}

示例 3:Discord 兼容格式

{"content": "**{{title}}**\n{{content}}"}

示例 4:复杂 JSON 格式

{
  "msgtype": "text",
  "text": {
    "content": "{{title}}\n\n{{content}}"
  }
}

💡 提示:如果留空 Body 模板,MagicPush 会使用默认 JSON 格式:

json
{"title": "...", "content": "...", "type": "...", "timestamp": "..."}

填写完成后,给渠道起一个易于辨识的名称(如「Slack 告警推送」),点击 「保存」

2.4 测试连通性

渠道创建成功后,在渠道卡片右侧的下拉菜单中,点击 「测试」 按钮。

  • ✅ 如果目标服务收到测试消息,说明配置成功
  • ❌ 如果测试失败,请参考下方常见问题排查

第三步:使用推送

3.1 通过 API 推送

bash
curl -X POST http://<服务器IP>:3000/api/push/<渠道ID> \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <你的API Token>" \
  -d '{
    "title": "服务器告警",
    "content": "CPU 使用率超过 90%,请及时处理",
    "type": "text"
  }'

3.2 模板变量使用示例

发送以下请求:

json
{
  "title": "服务异常",
  "content": "API 响应时间超时",
  "type": "text"
}

如果 Body 模板配置为:

{"text": "*{{title}}*\n{{content}}\n时间:{{timestamp}}"}

实际发送的请求体为:

json
{
  "text": "*服务异常*\nAPI 响应时间超时\n时间:2024-06-01T14:00:00.000Z"
}

技术细节

变量替换规则

  • 变量格式:(前后各两个大括号)
  • 变量名与消息对象的字段对应(titlecontenttypetimestamp
  • 如果变量在消息中不存在,替换为空字符串
  • JSON 中的特殊字符会自动转义(引号、换行等)

HTTP 方法与数据流

方法Body 处理
GETBody 模板参数会作为 URL 查询参数发送
POST、PUT、PATCHBody 模板作为请求体发送(JSON 格式)

超时设置

  • Webhook 请求超时时间:30 秒
  • 如果目标服务响应超时,会返回错误

响应处理

MagicPush 会记录目标服务的响应:

  • 成功:返回 success: true 及响应状态码
  • 失败:抛出错误,包含响应状态码和错误信息

常见问题

Q: 发送失败,提示「无效的 URL 格式」?

原因:Webhook URL 格式不正确。

解决

  1. 确保 URL 以 http://https:// 开头
  2. 检查是否有多余空格或换行
  3. 确认 URL 中的特殊字符已正确编码

Q: 目标服务返回 401/403 错误?

原因:鉴权失败,Headers 配置不正确。

解决

  1. 检查 自定义 Headers 中的 Authorization 格式
  2. Bearer Token 格式:{"Authorization": "Bearer your-token"}
  3. Basic Auth 格式:{"Authorization": "Basic base64(user:pass)"}
  4. 确认 Token 没有过期

Q: 目标服务返回 400 错误?

原因:请求体格式不符合目标服务的要求。

解决

  1. 检查 Body 模板 的 JSON 格式是否正确(可以在 JSON 校验工具 中验证)
  2. 确认目标服务期望的字段名(如 Slack 使用 text,Discord 也使用 content
  3. 可以先留空 Body 模板,使用默认格式测试连通性

Q: 模板变量没有正确替换?

原因:变量名格式不正确,或变量在消息中不存在。

解决

  1. 确认变量格式为 (两个大括号)
  2. 确认变量名拼写正确(titlecontenttypetimestamp
  3. 如果消息中没有 title 会被替换为空字符串

Q: 如何向同一个 Webhook 发送不同类型的消息?

解决

  1. 在 API 调用时指定 type 参数(textmarkdownhtml
  2. 在 Body 模板中通过 变量获取消息类型
  3. 根据类型在目标服务中做不同处理

Q: 可以在 Headers 中使用模板变量吗?

回答:可以。Headers 的值也支持模板变量替换:

json
{
  "X-Timestamp": "{{timestamp}}",
  "X-Message-Type": "{{type}}"
}

参考资源

基于 MIT 许可证开源