Better Stack + Server酱:服务宕机时推送到微信

效果:Better Stack 拨测到服务宕机或故障时,自动将告警推送到你的微信。

前置条件

  • Server酱 SendKey(30 秒获取教程
  • Better Stack 账号,已创建至少一个 Monitor

配置步骤

方式一:直连(固定文案,最快)

在 Better Stack 的 Integrations 中添加 Webhook,URL 填写以下地址(BetterStack%E5%91%8A%E8%AD%A6 是「BetterStack告警」的 URL 编码):

https://sctapi.ftqq.com/你的SENDKEY.send?title=BetterStack%E5%91%8A%E8%AD%A6

Server酱 服务端优先读取 URL query 中的 title 参数。配置完成后,Better Stack 每次触发 incident 时,你的微信会收到一条标题为「BetterStack告警」的消息。

直连方式的限制:Better Stack POST 的 JSON body 不会被解析为 Server酱 的 desp 正文,你只能收到固定标题,看不到 incident 详情。需要故障信息写入正文时,用下面的中转方式。

方式二:中转(带 incident 详情)

用一层中转(如 Cloudflare Workers 或云函数)接收 Better Stack 的 webhook,解析 JSON 后提取 incident 信息,再转发给 Server酱。中转服务向 Server酱 发送的请求格式如下:

curl -X POST "https://sctapi.ftqq.com/你的SENDKEY.send" \
  --data-urlencode "title=【故障】${incident_name}" \
  --data-urlencode "desp=状态:${incident_state}
URL:${incident_url}
时间:${incident_time}"

其中 ${incident_name} 等变量由中转服务从 Better Stack POST 的 JSON 中提取。如果你使用 Server酱³,端点改为 https://你的UID.push.ft07.com/send/你的SENDKEY.send,UID 是 SendKey 中 sctp 与 t 之间的数字。

完整示例

以下 Cloudflare Workers 脚本接收 Better Stack webhook,将完整 JSON 作为正文转发到 Server酱:

export default {
  async fetch(request) {
    const body = await request.text();

    await fetch("https://sctapi.ftqq.com/你的SENDKEY.send", {
      method: "POST",
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      body: new URLSearchParams({
        title: "BetterStack告警",
        desp: body
      })
    });

    return new Response("ok");
  }
};

部署后,在 Better Stack 的 Webhook URL 中填入 Workers 地址即可。收到第一条消息后,你可以查看完整 JSON 结构,再按需解析提取字段。

常见问题

直连方式收不到消息怎么办?

确认 SendKey 正确、URL 中中文已 urlencode。Server酱 返回 JSON 中 code0 表示成功。更多排查见 常见问题与排查

免费额度够用吗?

Server酱 免费版每天 5 条,每分钟上限 50 条。Better Stack 的 incident 触发频率通常不高,日常使用足够。订阅会员目前特价最低 3 元/月,一天最多可发 1000 条(价格详情)。

频率限制是多少?

每分钟 50 条。如果多个 monitor 同时触发告暴,可能需要在 Better Stack 侧合并通知或调整重试间隔。

Better Stack 的 webhook 发了什么数据?

Better Stack 向配置的 URL POST 一段 JSON,包含 incident 的结构化信息。使用中转方式时,可以在 Workers 中打印 request.text() 查看完整内容。

Server酱 支持推送到哪些通道?

Server酱 支持推送到微信服务号/企业微信/钉钉/飞书等多个通道,详见 /getting-started/channels/。

相关集成

懒人方案:把这段话复制给你的 AI 助手

把下面这段文字原样粘贴给 Claude Code、Cursor 或任何 AI 编程助手,它就会替你完成 Server酱 的接入:

请帮我把 Server酱 微信通知接入到我当前的项目/工具中:
1. API:POST https://sctapi.ftqq.com/{SendKey}.send,参数 title(必填,不能含换行)、desp(正文,支持 Markdown,可选);成功时返回 JSON 的 code 为 0。
2. 如果我的 SendKey 以 sctp 开头,则改用 https://{uid}.push.ft07.com/send/{SendKey}.send,uid 是 SendKey 中 sctp 与 t 之间的数字。
3. SendKey 从环境变量 SERVERCHAN_SENDKEY 读取;如果没有,提醒我到 https://sct.ftqq.com 免费获取(每天 5 条额度)。
4. 安全要求:不要把 SendKey 硬编码进代码、不要打印到日志、不要提交到 git。
5. 频率约定:任务结束发 1 条结果摘要即可,批量任务合并成一条,不要每步都推。
请根据我当前的项目和场景直接写好代码/配置并验证。