有些告警不是监控自动产生,而是运营、客服在后台手动触发:发现突发舆情要通知全员、投诉升级要电话提醒负责人。这种场景下前端点按钮就要发预警,但绝不能让前端直接持有 APIKEY。正确做法是后端封装告警接口,前端只调自己的服务。 为什么不能前端…
有些告警不是监控自动产生,而是运营、客服在后台手动触发:发现突发舆情要通知全员、投诉升级要电话提醒负责人。这种场景下前端点按钮就要发预警,但绝不能让前端直接持有 APIKEY。正确做法是后端封装告警接口,前端只调自己的服务。
为什么不能前端直连
APIID 和 APIKEY 一旦写在前端 JS 里,任何人打开调试工具都能看到,等于把发送额度交了出去。因此前端触发必须经过后端:前端带上身份和告警内容请求后端,后端校验权限后再调互亿无线接口。后端还能顺手做频率限制、内容校验和操作审计。
后端封装接口的代码示例
下面用 Python Flask 演示一个受登录保护的告警触发接口:
from flask import Flask, request, jsonify
import requests, os
app = Flask(__name__)
@app.route("/admin/alert", methods=["POST"])
def manual_alert():
if not request.headers.get("X-Admin-Token"):
return jsonify({"ok": False}), 401
b = request.json
mobile = b.get("mobile", "")
content = b.get("content", "")
if not mobile or len(content) > 70:
return jsonify({"ok": False, "msg": "参数不合法"}), 400
try:
r = requests.post("https://api.ihuyi.com/voice/vm", data={
"account": os.environ["IHUYI_APIID"],
"password": os.environ["IHUYI_APIKEY"],
"mobile": mobile, "content": content}, timeout=(5, 10))
return jsonify(r.json())
except requests.RequestException as e:
return jsonify({"ok": False, "err": str(e)}), 502
前端按钮点击后,用 fetch 带上管理员 token 请求 /admin/alert,body 里传 mobile 和 content 即可,逻辑很简单。
前端触发的注意事项
- 后端接口必须做登录鉴权和操作审计,记录谁在几点触发了哪条告警。
- 对触发频率做限制,避免误点连打多通电话。
- 文案在后端做长度校验,语音 content 控制在 70 字以内。
- 密钥只存在后端环境变量里,前端永远拿不到。
前后端协作的细节
后端封装时建议把通道选择也收进去:运营在后台选"紧急通知",后端自动决定走语音还是短信;选"普通提醒",则只发短信。前端只管传等级和内容,不关心底层接口地址。这样以后要加闪信、换服务商,都只改后端一处。
前端触发让告警更灵活
有了后端封装,运营在后台点点鼠标就能发起紧急通知,开发不用每次改代码,互亿无线多通道能力被封装成一个内部接口即可全公司使用。
前端触发的产品化思路
后端封装好之后,可以在内部后台做成一个"紧急通知"按钮:运营选接收范围(某个值班组或全员)、选等级、填内容,一键发出。后端根据等级自动决定走语音还是短信,前端完全不接触密钥和通道逻辑。
- 加一个二次确认弹窗,防止误触发出一通全员语音。
- 记录操作日志:谁、几点、发给谁、内容是什么,便于审计。
- 频率限制:同一人一分钟内只能触发一次,避免连打。
互亿无线多通道能力被封装成这一个内部接口后,全公司都能安全地用起来。
把发送能力收敛到后端是安全接入的基本姿势,注册免费试用搭一个内部告警接口。