跳到主要内容

Webhook

Webhook 允许平台在特定事件发生时,向外部系统(Slack、Discord、自动化脚本等)发送 HTTP 通知。

Webhook 字段

字段类型说明
namestringWebhook 名称(仅用于标识)
urlstring目标 URL
methodstringHTTP 方法(POSTGET 等)
headersobject自定义 HTTP 请求头,如 {"Authorization": "Bearer token"}
timeoutint请求超时(毫秒)
retryint失败后重试次数
onbool是否启用此 Webhook
events[]string订阅的事件类型列表

触发事件

Webhook 支持订阅平台的多种事件,主要包括:

用户事件

  • 用户注册、登录、修改信息

比赛事件

  • 比赛创建、开始、结束

队伍事件

  • 队伍创建、加入、退出

题目事件

  • 题目初始化、重置、靶机启停

Flag 事件

  • Flag 提交成功(flag_correct
  • Flag 提交错误(flag_wrong
  • 首血、二血、三血事件

投递历史

每个 Webhook 都维护投递历史记录,包含:

  • success:累计成功投递次数
  • failure:累计失败投递次数
  • 最后成功/失败时间
  • 详细历史日志(包含完整请求和响应内容)

通过 GET /admin/webhook/:webhookID/history 查看。

安全配置

config.yaml 中配置 Webhook 目标 URL 白名单:

webhook:
whitelist:
- "https://hooks.slack.com/"
- "https://discord.com/api/webhooks/"

配置后,平台仅允许向匹配前缀的 URL 发送 Webhook 请求,防止 SSRF 攻击。留空 [] 表示不限制。

自定义认证

通过 headers 字段添加认证信息:

{
"Authorization": "Bearer your-token",
"X-Secret": "your-secret"
}

重试机制

Webhook 投递通过 Asynq 异步队列处理。若请求失败(超时、非 2xx 响应),按 retry 配置的次数自动重试,重试间隔指数递增。

示例:Slack 通知

{
"name": "Slack Flag 通知",
"url": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"timeout": 5000,
"retry": 3,
"on": true,
"events": ["flag_correct", "first_blood", "second_blood", "third_blood"]
}