For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt, and this page is available as Markdown at /guide/features/webhook.md.

Webhook

入口:「管理后台 → Webhook」。选择需要订阅的事件后,平台会以 JSON 请求向接收服务发送通知。

先配置目标白名单

在「系统管理」配置 webhook.whitelist。空列表拒绝创建目标,不是不限制。白名单匹配主机名、主机名加端口、IP 或 IP CIDR,不接受 URL 路径前缀:

webhook:
  whitelist:
    - hooks.example.com
    - notify.example.com:8443
    - 192.0.2.10
    - 192.0.2.0/24

Helm 初次部署写入 cbctf.webhook.whitelist;已有数据库通过系统管理更新。白名单在创建/修改 URL 时校验,不是对已有投递、DNS 解析结果和 HTTP 重定向的网络防火墙。

创建与启用

填写名称、目标 URL、方法、超时、重试次数、请求头,选择订阅事件并勾选启用。创建和编辑均支持启用开关。

字段含义
name / url名称与目标完整 URL
method仅 POST 或 GET,两者都携带 JSON 请求体
headers请求头对象,默认发送 Content-Type: application/json
timeout秒,0 使用 HTTP 客户端默认 30 秒
retry失败后的最大重试次数,0 不重试
events事件名称字符串列表;空列表订阅所有事件
on是否启用

事件名称和负载

在编辑窗口选择订阅事件,常见事件有:

  • 用户:register、login、oauth_login、update_user
  • 队伍:create_team、join_team、leave_team
  • 题目:init_challenge、reset_challenge、start_victim、stop_victim
  • 提交:submit_flag
  • 公告:create_notice、update_notice、delete_notice

没有 flag_correct、flag_wrong、first_blood 等独立 Webhook 事件,也没有比赛时间到达后自动产生的开始/结束通知。

实际负载只包含事件类型、来源 IP 和相关对象 ID:

{
  "type": "submit_flag",
  "ip": "192.0.2.20",
  "models": {"Self": 12, "Contest": 3, "Team": 8}
}

models 的键依事件上下文变化。负载不包含 Flag 内容、解题正误、完整对象或事件成功状态,不应仅凭 submit_flag 就宣布解题成功。

可用配置示例

{
  "name": "赛事事件接收器",
  "url": "https://hooks.example.com/cbctf",
  "method": "POST",
  "headers": {"Authorization": "Bearer your-token"},
  "timeout": 10,
  "retry": 3,
  "on": true,
  "events": ["submit_flag", "create_notice"]
}

Slack、Discord 等通常要求自己的消息格式,需要接收服务将上述负载转换后再发送,不能直接把 CBCTF 的 JSON 当作聊天消息模板。

历史与重试

页面提供全局和单个 Webhook 的历史,展示成功状态、HTTP 响应码、耗时、错误及关联事件,不保存完整请求/响应正文。

网络错误、超时和非 2xx 响应会向任务队列返回失败,按 retry 重试;每次尝试分别记录历史。接收器应考虑重复投递。配置修改影响后续入队任务,已入队任务携带的是当时的目标配置。