通知与 Webhook 配置
Webhook 通知渠道:URL、可选 HMAC 签名、请求体约定,以及运营/控制台绑定与试发。
运营后台「系统通知」与控制台「通知设置」均可启用 Webhook,向你提供的 HTTPS/HTTP 地址投递运维告警。可与 Telegram 单独或同时使用。
适用场景
- 把告警接入自建服务、消息网关、低代码自动化(如 n8n)或其它 IM
- 不想把 Bot Token 放在产品里,而由你自己的服务再转发
运营侧与账号侧配置互不影响;同一侧开启 Webhook 后,每次通知会向该 URL 发一次 POST(与 Telegram 并行时两边都会发)。
配置字段
| 字段 | 必填 | 说明 |
|---|---|---|
| Webhook 开关 | — | 关闭则不投递 |
| Webhook URL | 开启后必填 | 须以 http:// 或 https:// 开头 |
| 签名密钥 | 可选 | 填写后对请求体做 HMAC-SHA256,并写入签名头 |
| 签名头名 | 可选 | 有密钥时生效;留空默认 X-Adswds-Signature |
填到哪里
控制台(本账号)
- 管理员打开 系统管理 → 通知设置 → 渠道 → Webhook
- 开启并填写 URL;需要验签时再填密钥与头名
- 保存后点 试发,在你的接收端确认收到 JSON
运营后台
- 打开 系统通知 → 渠道 → Webhook
- 同样配置 URL / 可选签名
- 保存并试发
请求约定
平台对你的 URL 发起:
- 方法:
POST - Content-Type:
application/json - User-Agent:
Adswds-Notify-Webhook/1.0 - 超时:约 15 秒;不跟随 HTTP 重定向(3xx 不算成功)
- 成功判定:HTTP 状态码在 2xx;其它状态视为投递失败
请求体
正文为 JSON,仅两个字段(已按当前通知语言渲染后的标题与正文):
{
"title": "通知标题",
"body": "通知正文"
}模板变量(如 {{client_name}})在服务端渲染后再发出;Webhook 不会附带原始事件 ID 或未渲染变量表。
可选签名(推荐)
若配置了签名密钥,平台对原始请求体字节计算:
HMAC-SHA256(secret, raw_body) → 十六进制小写并写入请求头(默认名 X-Adswds-Signature):
X-Adswds-Signature: sha256=<hex>接收端应用同一密钥对收到的 raw body 重算 HMAC,与头中 sha256= 后的值做常量时间比较。未配置密钥时不带签名头。
示例(伪代码):
expected = "sha256=" + hex(hmac_sha256(secret, raw_body))
assert header["X-Adswds-Signature"] == expected接收端示例
用临时公网隧道或自建接口即可验证。最小 Node 示例:
import http from 'node:http'
import crypto from 'node:crypto'
const SECRET = process.env.HOOK_SECRET || ''
http.createServer((req, res) => {
const chunks = []
req.on('data', (c) => chunks.push(c))
req.on('end', () => {
const raw = Buffer.concat(chunks)
if (SECRET) {
const sig = req.headers['x-adswds-signature'] || ''
const expected =
'sha256=' + crypto.createHmac('sha256', SECRET).update(raw).digest('hex')
if (sig !== expected) {
res.writeHead(401)
res.end('bad signature')
return
}
}
console.log(JSON.parse(raw.toString('utf8')))
res.writeHead(200)
res.end('ok')
})
}).listen(8080)将产品中的 Webhook URL 指到该服务的公网地址,密钥与产品配置一致,然后点试发。
试发与排障
| 现象 | 可检查 |
|---|---|
| 试发失败:URL 无效 | 是否以 http:// / https:// 开头;勿漏协议 |
| 试发失败:HTTP 非 2xx | 接收端是否返回 200–299;是否把请求重定向到别处(平台不跟随) |
| 验签失败 | 是否用原始 body 字节计算;密钥是否与产品一致;头名是否匹配(默认 X-Adswds-Signature) |
| 试发成功但业务告警没有 | 事件开关、总开关、账号是否在服务期;与 Telegram 无关时可单独关 TG 排查 |
| 超时 | 接收端应在约 15 秒内返回;重逻辑请先 ACK 再异步处理 |
相关页面:通知与 Telegram 配置 · 系统与账号 · 常见问题。